1 /* 2 * Copyright © 2018 Ebrahim Byagowi 3 * 4 * This is part of HarfBuzz, a text shaping library. 5 * 6 * Permission is hereby granted, without written agreement and without 7 * license or royalty fees, to use, copy, modify, and distribute this 8 * software and its documentation for any purpose, provided that the 9 * above copyright notice and the following two paragraphs appear in 10 * all copies of this software. 11 * 12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16 * DAMAGE. 17 * 18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23 */ 24 25 #ifndef HB_OT_STAT_TABLE_HH 26 #define HB_OT_STAT_TABLE_HH 27 28 #include "hb-open-type.hh" 29 #include "hb-ot-layout-common.hh" 30 31 /* 32 * STAT -- Style Attributes 33 * https://docs.microsoft.com/en-us/typography/opentype/spec/stat 34 */ 35 #define HB_OT_TAG_STAT HB_TAG('S','T','A','T') 36 37 38 namespace OT { 39 40 enum 41 { 42 OLDER_SIBLING_FONT_ATTRIBUTE = 0x0001, /* If set, this axis value table 43 * provides axis value information 44 * that is applicable to other fonts 45 * within the same font family. This 46 * is used if the other fonts were 47 * released earlier and did not include 48 * information about values for some axis. 49 * If newer versions of the other 50 * fonts include the information 51 * themselves and are present, 52 * then this record is ignored. */ 53 ELIDABLE_AXIS_VALUE_NAME = 0x0002 /* If set, it indicates that the axis 54 * value represents the “normal” value 55 * for the axis and may be omitted when 56 * composing name strings. */ 57 // Reserved = 0xFFFC /* Reserved for future use — set to zero. */ 58 }; 59 60 struct AxisValueFormat1 61 { sanitizeOT::AxisValueFormat162 bool sanitize (hb_sanitize_context_t *c) const 63 { 64 TRACE_SANITIZE (this); 65 return_trace (likely (c->check_struct (this))); 66 } 67 68 protected: 69 HBUINT16 format; /* Format identifier — set to 1. */ 70 HBUINT16 axisIndex; /* Zero-base index into the axis record array 71 * identifying the axis of design variation 72 * to which the axis value record applies. 73 * Must be less than designAxisCount. */ 74 HBUINT16 flags; /* Flags — see below for details. */ 75 NameID valueNameID; /* The name ID for entries in the 'name' table 76 * that provide a display string for this 77 * attribute value. */ 78 Fixed value; /* A numeric value for this attribute value. */ 79 public: 80 DEFINE_SIZE_STATIC (12); 81 }; 82 83 struct AxisValueFormat2 84 { sanitizeOT::AxisValueFormat285 bool sanitize (hb_sanitize_context_t *c) const 86 { 87 TRACE_SANITIZE (this); 88 return_trace (likely (c->check_struct (this))); 89 } 90 91 protected: 92 HBUINT16 format; /* Format identifier — set to 2. */ 93 HBUINT16 axisIndex; /* Zero-base index into the axis record array 94 * identifying the axis of design variation 95 * to which the axis value record applies. 96 * Must be less than designAxisCount. */ 97 HBUINT16 flags; /* Flags — see below for details. */ 98 NameID valueNameID; /* The name ID for entries in the 'name' table 99 * that provide a display string for this 100 * attribute value. */ 101 Fixed nominalValue; /* A numeric value for this attribute value. */ 102 Fixed rangeMinValue; /* The minimum value for a range associated 103 * with the specified name ID. */ 104 Fixed rangeMaxValue; /* The maximum value for a range associated 105 * with the specified name ID. */ 106 public: 107 DEFINE_SIZE_STATIC (20); 108 }; 109 110 struct AxisValueFormat3 111 { sanitizeOT::AxisValueFormat3112 bool sanitize (hb_sanitize_context_t *c) const 113 { 114 TRACE_SANITIZE (this); 115 return_trace (likely (c->check_struct (this))); 116 } 117 118 protected: 119 HBUINT16 format; /* Format identifier — set to 3. */ 120 HBUINT16 axisIndex; /* Zero-base index into the axis record array 121 * identifying the axis of design variation 122 * to which the axis value record applies. 123 * Must be less than designAxisCount. */ 124 HBUINT16 flags; /* Flags — see below for details. */ 125 NameID valueNameID; /* The name ID for entries in the 'name' table 126 * that provide a display string for this 127 * attribute value. */ 128 Fixed value; /* A numeric value for this attribute value. */ 129 Fixed linkedValue; /* The numeric value for a style-linked mapping 130 * from this value. */ 131 public: 132 DEFINE_SIZE_STATIC (16); 133 }; 134 135 struct AxisValueRecord 136 { sanitizeOT::AxisValueRecord137 bool sanitize (hb_sanitize_context_t *c) const 138 { 139 TRACE_SANITIZE (this); 140 return_trace (likely (c->check_struct (this))); 141 } 142 143 protected: 144 HBUINT16 axisIndex; /* Zero-base index into the axis record array 145 * identifying the axis to which this value 146 * applies. Must be less than designAxisCount. */ 147 Fixed value; /* A numeric value for this attribute value. */ 148 public: 149 DEFINE_SIZE_STATIC (6); 150 }; 151 152 struct AxisValueFormat4 153 { sanitizeOT::AxisValueFormat4154 bool sanitize (hb_sanitize_context_t *c) const 155 { 156 TRACE_SANITIZE (this); 157 return_trace (likely (c->check_struct (this))); 158 } 159 160 protected: 161 HBUINT16 format; /* Format identifier — set to 4. */ 162 HBUINT16 axisCount; /* The total number of axes contributing to 163 * this axis-values combination. */ 164 HBUINT16 flags; /* Flags — see below for details. */ 165 NameID valueNameID; /* The name ID for entries in the 'name' table 166 * that provide a display string for this 167 * attribute value. */ 168 UnsizedArrayOf<AxisValueRecord> 169 axisValues; /* Array of AxisValue records that provide the 170 * combination of axis values, one for each 171 * contributing axis. */ 172 public: 173 DEFINE_SIZE_ARRAY (8, axisValues); 174 }; 175 176 struct AxisValue 177 { sanitizeOT::AxisValue178 bool sanitize (hb_sanitize_context_t *c) const 179 { 180 TRACE_SANITIZE (this); 181 if (unlikely (c->check_struct (this))) 182 return_trace (false); 183 184 switch (u.format) 185 { 186 case 1: return_trace (likely (u.format1.sanitize (c))); 187 case 2: return_trace (likely (u.format2.sanitize (c))); 188 case 3: return_trace (likely (u.format3.sanitize (c))); 189 case 4: return_trace (likely (u.format4.sanitize (c))); 190 default: return_trace (true); 191 } 192 } 193 194 protected: 195 union 196 { 197 HBUINT16 format; 198 AxisValueFormat1 format1; 199 AxisValueFormat2 format2; 200 AxisValueFormat3 format3; 201 AxisValueFormat4 format4; 202 } u; 203 public: 204 DEFINE_SIZE_UNION (2, format); 205 }; 206 207 struct StatAxisRecord 208 { sanitizeOT::StatAxisRecord209 bool sanitize (hb_sanitize_context_t *c) const 210 { 211 TRACE_SANITIZE (this); 212 return_trace (likely (c->check_struct (this))); 213 } 214 215 protected: 216 Tag tag; /* A tag identifying the axis of design variation. */ 217 NameID nameID; /* The name ID for entries in the 'name' table that 218 * provide a display string for this axis. */ 219 HBUINT16 ordering; /* A value that applications can use to determine 220 * primary sorting of face names, or for ordering 221 * of descriptors when composing family or face names. */ 222 public: 223 DEFINE_SIZE_STATIC (8); 224 }; 225 226 struct STAT 227 { 228 enum { tableTag = HB_OT_TAG_STAT }; 229 sanitizeOT::STAT230 bool sanitize (hb_sanitize_context_t *c) const 231 { 232 TRACE_SANITIZE (this); 233 return_trace (likely (c->check_struct (this) && 234 majorVersion == 1 && 235 minorVersion > 0 && 236 designAxesOffset.sanitize (c, this, designAxisCount) && 237 offsetToAxisValueOffsets.sanitize (c, this, axisValueCount, &(this+offsetToAxisValueOffsets)))); 238 } 239 240 protected: 241 HBUINT16 majorVersion; /* Major version number of the style attributes 242 * table — set to 1. */ 243 HBUINT16 minorVersion; /* Minor version number of the style attributes 244 * table — set to 2. */ 245 HBUINT16 designAxisSize; /* The size in bytes of each axis record. */ 246 HBUINT16 designAxisCount;/* The number of design axis records. In a 247 * font with an 'fvar' table, this value must be 248 * greater than or equal to the axisCount value 249 * in the 'fvar' table. In all fonts, must 250 * be greater than zero if axisValueCount 251 * is greater than zero. */ 252 LOffsetTo<UnsizedArrayOf<StatAxisRecord>, false> 253 designAxesOffset; 254 /* Offset in bytes from the beginning of 255 * the STAT table to the start of the design 256 * axes array. If designAxisCount is zero, 257 * set to zero; if designAxisCount is greater 258 * than zero, must be greater than zero. */ 259 HBUINT16 axisValueCount; /* The number of axis value tables. */ 260 LOffsetTo<UnsizedArrayOf<OffsetTo<AxisValue> >, false> 261 offsetToAxisValueOffsets; 262 /* Offset in bytes from the beginning of 263 * the STAT table to the start of the design 264 * axes value offsets array. If axisValueCount 265 * is zero, set to zero; if axisValueCount is 266 * greater than zero, must be greater than zero. */ 267 NameID elidedFallbackNameID; 268 /* Name ID used as fallback when projection of 269 * names into a particular font model produces 270 * a subfamily name containing only elidable 271 * elements. */ 272 public: 273 DEFINE_SIZE_STATIC (20); 274 }; 275 276 277 } /* namespace OT */ 278 279 280 #endif /* HB_OT_STAT_TABLE_HH */ 281