• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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