155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod/* 255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * Copyright © 2017 Google, Inc. 355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * 455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * 655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * Permission is hereby granted, without written agreement and without 755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * software and its documentation for any purpose, provided that the 955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 1055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * all copies of this software. 1155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * 1255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 1355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 1455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 1555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 1655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * DAMAGE. 1755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * 1855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 1955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 2055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 2155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 2255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 2355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * 2455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * Google Author(s): Behdad Esfahbod 2555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod */ 2655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 2755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod#ifndef HB_OT_VAR_FVAR_TABLE_HH 2855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod#define HB_OT_VAR_FVAR_TABLE_HH 2955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 3055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod#include "hb-open-type-private.hh" 3155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 3255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbodnamespace OT { 3355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 3455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 3555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbodstruct InstanceRecord 3655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod{ 3755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c, unsigned int axis_count) const 3855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod { 3955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod TRACE_SANITIZE (this); 4055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod return_trace (c->check_struct (this) && 4155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod c->check_array (coordinates, coordinates[0].static_size, axis_count)); 4255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod } 4355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 4455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod protected: 456f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 subfamilyNameID;/* The name ID for entries in the 'name' table 4655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * that provide subfamily names for this instance. */ 476f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 reserved; /* Reserved for future use — set to 0. */ 4855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod Fixed coordinates[VAR];/* The coordinates array for this instance. */ 496f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod //UINT16 postScriptNameIDX;/*Optional. The name ID for entries in the 'name' 5055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod // * table that provide PostScript names for this 5155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod // * instance. */ 5255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 5355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod public: 5455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod DEFINE_SIZE_ARRAY (4, coordinates); 5555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod}; 5655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 5755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbodstruct AxisRecord 5855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod{ 5955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) const 6055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod { 6155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod TRACE_SANITIZE (this); 6255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod return_trace (c->check_struct (this)); 6355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod } 6455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 65422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod public: 6655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod Tag axisTag; /* Tag identifying the design variation for the axis. */ 6755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod Fixed minValue; /* The minimum coordinate value for the axis. */ 6855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod Fixed defaultValue; /* The default coordinate value for the axis. */ 6955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod Fixed maxValue; /* The maximum coordinate value for the axis. */ 706f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 reserved; /* Reserved for future use — set to 0. */ 716f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 axisNameID; /* The name ID for entries in the 'name' table that 7255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * provide a display name for this axis. */ 7355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 7455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod public: 7555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod DEFINE_SIZE_STATIC (20); 7655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod}; 7755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 7855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 7955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod/* 8055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * fvar — Font Variations Table 8155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod */ 8255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 83d6bdbbca307d1a4aed60a78133eea40a1a9d5bf3Behdad Esfahbod#define HB_OT_TAG_fvar HB_TAG('f','v','a','r') 84d6bdbbca307d1a4aed60a78133eea40a1a9d5bf3Behdad Esfahbod 8555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbodstruct fvar 8655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod{ 8755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod static const hb_tag_t tableTag = HB_OT_TAG_fvar; 8855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 8955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) const 9055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod { 9155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod TRACE_SANITIZE (this); 9255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod return_trace (version.sanitize (c) && 93422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod likely (version.major == 1) && 94422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod c->check_struct (this) && 95422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod instanceSize >= axisCount * 4 + 4 && 96422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod axisSize <= 1024 && /* Arbitrary, just to simplify overflow checks. */ 97422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod instanceSize <= 1024 && /* Arbitrary, just to simplify overflow checks. */ 98422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod c->check_range (this, things) && 99422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod c->check_range (&StructAtOffset<char> (this, things), 100422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod axisCount * axisSize + instanceCount * instanceSize)); 10155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod } 10255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 103422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod inline unsigned int get_axis_count (void) const 104422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod { return axisCount; } 10555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 106785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod inline bool get_axis (unsigned int index, hb_ot_var_axis_t *info) const 107785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod { 108785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod if (unlikely (index >= axisCount)) 109785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod return false; 110785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 111785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod if (info) 112785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod { 113785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod const AxisRecord &axis = get_axes ()[index]; 114785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod info->tag = axis.axisTag; 115785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod info->name_id = axis.axisNameID; 116785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod info->default_value = axis.defaultValue / 65536.; 117785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod /* Ensure order, to simplify client math. */ 118785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.); 119785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.); 120785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod } 121785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 122785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod return true; 123785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod } 124785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 125785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod inline unsigned int get_axis_infos (unsigned int start_offset, 126785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod unsigned int *axes_count /* IN/OUT */, 127785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod hb_ot_var_axis_t *axes_array /* OUT */) const 128785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod { 129785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod if (axes_count) 130785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod { 131785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod unsigned int count = axisCount; 132785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod start_offset = MIN (start_offset, count); 133785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 134785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod count -= start_offset; 135785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod axes_array += start_offset; 136785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 137785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod count = MIN (count, *axes_count); 138785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod *axes_count = count; 139785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 140785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod for (unsigned int i = 0; i < count; i++) 141785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod get_axis (start_offset + i, axes_array + i); 142785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod } 143785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod return axisCount; 144785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod } 145785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 146422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod inline bool find_axis (hb_tag_t tag, unsigned int *index, hb_ot_var_axis_t *info) const 147422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod { 148422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod const AxisRecord *axes = get_axes (); 149422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod unsigned int count = get_axis_count (); 150422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod for (unsigned int i = 0; i < count; i++) 151422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod if (axes[i].axisTag == tag) 152422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod { 153422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod if (index) 154422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod *index = i; 155785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod return get_axis (i, info); 156422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod } 157422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod if (index) 158422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod *index = HB_OT_VAR_NO_AXIS_INDEX; 159422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod return false; 160422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod } 16155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 162785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod inline int normalize_axis_value (unsigned int axis_index, float v) const 163422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod { 164422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod hb_ot_var_axis_t axis; 165785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod if (!get_axis (axis_index, &axis)) 166422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod return 0; 167422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod 168422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod v = MAX (MIN (v, axis.max_value), axis.min_value); /* Clamp. */ 169422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod 170422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod if (v == axis.default_value) 171422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod return 0; 172422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod else if (v < axis.default_value) 173422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod v = (v - axis.default_value) / (axis.default_value - axis.min_value); 174422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod else 175422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod v = (v - axis.default_value) / (axis.max_value - axis.default_value); 176422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod return (int) (v * 16384. + (v >= 0. ? .5 : -.5)); 177422c0c36c80145a2d993f80d5c7d3265e3d8357aBehdad Esfahbod } 17855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 17955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod protected: 180785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod inline const AxisRecord * get_axes (void) const 181785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod { return &StructAtOffset<AxisRecord> (this, things); } 182785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 183785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod inline const InstanceRecord * get_instances (void) const 184785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod { return &StructAtOffset<InstanceRecord> (get_axes () + axisCount, 0); } 185785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod 186785982bf830723552270db5649abcb9f9f0b46b1Behdad Esfahbod protected: 18755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod FixedVersion<>version; /* Version of the fvar table 18855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * initially set to 0x00010000u */ 189c6173a392cfaa3d339c768836e8cddf3ae4adc53Behdad Esfahbod Offset16 things; /* Offset in bytes from the beginning of the table 19055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * to the start of the AxisRecord array. */ 1916f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 reserved; /* This field is permanently reserved. Set to 2. */ 1926f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 axisCount; /* The number of variation axes in the font (the 19355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * number of records in the axes array). */ 1946f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 axisSize; /* The size in bytes of each VariationAxisRecord — 19555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * set to 20 (0x0014) for this version. */ 1966f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 instanceCount; /* The number of named instances defined in the font 19755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * (the number of records in the instances array). */ 1986f335ed1e52c6161fa0b0295776856fc07f7f46fBehdad Esfahbod UINT16 instanceSize; /* The size in bytes of each InstanceRecord — set 19955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * to either axisCount * sizeof(Fixed) + 4, or to 20055d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod * axisCount * sizeof(Fixed) + 6. */ 20155d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 20255d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod public: 20355d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod DEFINE_SIZE_STATIC (16); 20455d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod}; 20555d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 20655d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod} /* namespace OT */ 20755d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 20855d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod 20955d42fd667b9c34a1109bb850bf2ea7322c01040Behdad Esfahbod#endif /* HB_OT_VAR_FVAR_TABLE_HH */ 210