1 /***************************************************************************/
2 /*                                                                         */
3 /*  ttgxvar.h                                                              */
4 /*                                                                         */
5 /*    TrueType GX Font Variation loader (specification)                    */
6 /*                                                                         */
7 /*  Copyright 2004-2018 by                                                 */
8 /*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */
9 /*                                                                         */
10 /*  This file is part of the FreeType project, and may only be used,       */
11 /*  modified, and distributed under the terms of the FreeType project      */
12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13 /*  this file you indicate that you have read the license and              */
14 /*  understand and accept it fully.                                        */
15 /*                                                                         */
16 /***************************************************************************/
17 
18 
19 #ifndef TTGXVAR_H_
20 #define TTGXVAR_H_
21 
22 
23 #include <ft2build.h>
24 #include "ttobjs.h"
25 
26 
27 FT_BEGIN_HEADER
28 
29 
30 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
31 
32   /*************************************************************************/
33   /*                                                                       */
34   /* <Struct>                                                              */
35   /*    GX_AVarCorrespondenceRec                                           */
36   /*                                                                       */
37   /* <Description>                                                         */
38   /*    A data structure representing `shortFracCorrespondence' in `avar'  */
39   /*    table according to the specifications from Apple.                  */
40   /*                                                                       */
41   typedef struct  GX_AVarCorrespondenceRec_
42   {
43     FT_Fixed  fromCoord;
44     FT_Fixed  toCoord;
45 
46   } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
47 
48 
49   /*************************************************************************/
50   /*                                                                       */
51   /* <Struct>                                                              */
52   /*    GX_AVarRec                                                         */
53   /*                                                                       */
54   /* <Description>                                                         */
55   /*    Data from the segment field of `avar' table.                       */
56   /*    There is one of these for each axis.                               */
57   /*                                                                       */
58   typedef struct  GX_AVarSegmentRec_
59   {
60     FT_UShort              pairCount;
61     GX_AVarCorrespondence  correspondence; /* array with pairCount entries */
62 
63   } GX_AVarSegmentRec, *GX_AVarSegment;
64 
65 
66   typedef struct  GX_ItemVarDataRec_
67   {
68     FT_UInt    itemCount;      /* number of delta sets per item         */
69     FT_UInt    regionIdxCount; /* number of region indices in this data */
70     FT_UInt*   regionIndices;  /* array of `regionCount' indices;       */
71                                /* these index `varRegionList'           */
72     FT_Short*  deltaSet;       /* array of `itemCount' deltas           */
73                                /* use `innerIndex' for this array       */
74 
75   } GX_ItemVarDataRec, *GX_ItemVarData;
76 
77 
78   /* contribution of one axis to a region */
79   typedef struct  GX_AxisCoordsRec_
80   {
81     FT_Fixed  startCoord;
82     FT_Fixed  peakCoord;      /* zero means no effect (factor = 1) */
83     FT_Fixed  endCoord;
84 
85   } GX_AxisCoordsRec, *GX_AxisCoords;
86 
87 
88   typedef struct  GX_VarRegionRec_
89   {
90     GX_AxisCoords  axisList;               /* array of axisCount records */
91 
92   } GX_VarRegionRec, *GX_VarRegion;
93 
94 
95   /* item variation store */
96   typedef struct  GX_ItemVarStoreRec_
97   {
98     FT_UInt         dataCount;
99     GX_ItemVarData  varData;            /* array of dataCount records;     */
100                                         /* use `outerIndex' for this array */
101     FT_UShort     axisCount;
102     FT_UInt       regionCount;          /* total number of regions defined */
103     GX_VarRegion  varRegionList;
104 
105   } GX_ItemVarStoreRec, *GX_ItemVarStore;
106 
107 
108   typedef struct  GX_DeltaSetIdxMapRec_
109   {
110     FT_UInt   mapCount;
111     FT_UInt*  outerIndex;             /* indices to item var data */
112     FT_UInt*  innerIndex;             /* indices to delta set     */
113 
114   } GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap;
115 
116 
117   /*************************************************************************/
118   /*                                                                       */
119   /* <Struct>                                                              */
120   /*    GX_HVVarTableRec                                                   */
121   /*                                                                       */
122   /* <Description>                                                         */
123   /*    Data from either the `HVAR' or `VVAR' table.                       */
124   /*                                                                       */
125   typedef struct  GX_HVVarTableRec_
126   {
127     GX_ItemVarStoreRec    itemStore;        /* Item Variation Store  */
128     GX_DeltaSetIdxMapRec  widthMap;         /* Advance Width Mapping */
129 
130 #if 0
131     GX_DeltaSetIdxMapRec  lsbMap;           /* not implemented */
132     GX_DeltaSetIdxMapRec  rsbMap;           /* not implemented */
133 
134     GX_DeltaSetIdxMapRec  tsbMap;           /* not implemented */
135     GX_DeltaSetIdxMapRec  bsbMap;           /* not implemented */
136     GX_DeltaSetIdxMapRec  vorgMap;          /* not implemented */
137 #endif
138 
139   } GX_HVVarTableRec, *GX_HVVarTable;
140 
141 
142 #define MVAR_TAG_GASP_0  FT_MAKE_TAG( 'g', 's', 'p', '0' )
143 #define MVAR_TAG_GASP_1  FT_MAKE_TAG( 'g', 's', 'p', '1' )
144 #define MVAR_TAG_GASP_2  FT_MAKE_TAG( 'g', 's', 'p', '2' )
145 #define MVAR_TAG_GASP_3  FT_MAKE_TAG( 'g', 's', 'p', '3' )
146 #define MVAR_TAG_GASP_4  FT_MAKE_TAG( 'g', 's', 'p', '4' )
147 #define MVAR_TAG_GASP_5  FT_MAKE_TAG( 'g', 's', 'p', '5' )
148 #define MVAR_TAG_GASP_6  FT_MAKE_TAG( 'g', 's', 'p', '6' )
149 #define MVAR_TAG_GASP_7  FT_MAKE_TAG( 'g', 's', 'p', '7' )
150 #define MVAR_TAG_GASP_8  FT_MAKE_TAG( 'g', 's', 'p', '8' )
151 #define MVAR_TAG_GASP_9  FT_MAKE_TAG( 'g', 's', 'p', '9' )
152 
153 #define MVAR_TAG_CPHT  FT_MAKE_TAG( 'c', 'p', 'h', 't' )
154 #define MVAR_TAG_HASC  FT_MAKE_TAG( 'h', 'a', 's', 'c' )
155 #define MVAR_TAG_HCLA  FT_MAKE_TAG( 'h', 'c', 'l', 'a' )
156 #define MVAR_TAG_HCLD  FT_MAKE_TAG( 'h', 'c', 'l', 'd' )
157 #define MVAR_TAG_HCOF  FT_MAKE_TAG( 'h', 'c', 'o', 'f' )
158 #define MVAR_TAG_HCRN  FT_MAKE_TAG( 'h', 'c', 'r', 'n' )
159 #define MVAR_TAG_HCRS  FT_MAKE_TAG( 'h', 'c', 'r', 's' )
160 #define MVAR_TAG_HDSC  FT_MAKE_TAG( 'h', 'd', 's', 'c' )
161 #define MVAR_TAG_HLGP  FT_MAKE_TAG( 'h', 'l', 'g', 'p' )
162 #define MVAR_TAG_SBXO  FT_MAKE_TAG( 's', 'b', 'x', 'o' )
163 #define MVAR_TAG_SBXS  FT_MAKE_TAG( 's', 'b', 'x', 's' )
164 #define MVAR_TAG_SBYO  FT_MAKE_TAG( 's', 'b', 'y', 'o' )
165 #define MVAR_TAG_SBYS  FT_MAKE_TAG( 's', 'b', 'y', 's' )
166 #define MVAR_TAG_SPXO  FT_MAKE_TAG( 's', 'p', 'x', 'o' )
167 #define MVAR_TAG_SPXS  FT_MAKE_TAG( 's', 'p', 'x', 's' )
168 #define MVAR_TAG_SPYO  FT_MAKE_TAG( 's', 'p', 'y', 'o' )
169 #define MVAR_TAG_SPYS  FT_MAKE_TAG( 's', 'p', 'y', 's' )
170 #define MVAR_TAG_STRO  FT_MAKE_TAG( 's', 't', 'r', 'o' )
171 #define MVAR_TAG_STRS  FT_MAKE_TAG( 's', 't', 'r', 's' )
172 #define MVAR_TAG_UNDO  FT_MAKE_TAG( 'u', 'n', 'd', 'o' )
173 #define MVAR_TAG_UNDS  FT_MAKE_TAG( 'u', 'n', 'd', 's' )
174 #define MVAR_TAG_VASC  FT_MAKE_TAG( 'v', 'a', 's', 'c' )
175 #define MVAR_TAG_VCOF  FT_MAKE_TAG( 'v', 'c', 'o', 'f' )
176 #define MVAR_TAG_VCRN  FT_MAKE_TAG( 'v', 'c', 'r', 'n' )
177 #define MVAR_TAG_VCRS  FT_MAKE_TAG( 'v', 'c', 'r', 's' )
178 #define MVAR_TAG_VDSC  FT_MAKE_TAG( 'v', 'd', 's', 'c' )
179 #define MVAR_TAG_VLGP  FT_MAKE_TAG( 'v', 'l', 'g', 'p' )
180 #define MVAR_TAG_XHGT  FT_MAKE_TAG( 'x', 'h', 'g', 't' )
181 
182 
183   typedef struct  GX_ValueRec_
184   {
185     FT_ULong   tag;
186     FT_UShort  outerIndex;
187     FT_UShort  innerIndex;
188 
189     FT_Short  unmodified;  /* values are either FT_Short or FT_UShort */
190 
191   } GX_ValueRec, *GX_Value;
192 
193 
194   /*************************************************************************/
195   /*                                                                       */
196   /* <Struct>                                                              */
197   /*    GX_MVarTableRec                                                    */
198   /*                                                                       */
199   /* <Description>                                                         */
200   /*    Data from the `MVAR' table.                                        */
201   /*                                                                       */
202   typedef struct  GX_MVarTableRec_
203   {
204     FT_UShort  valueCount;
205 
206     GX_ItemVarStoreRec  itemStore;        /* Item Variation Store  */
207     GX_Value            values;           /* Value Records         */
208 
209   } GX_MVarTableRec, *GX_MVarTable;
210 
211 
212   /*************************************************************************/
213   /*                                                                       */
214   /* <Struct>                                                              */
215   /*    GX_BlendRec                                                        */
216   /*                                                                       */
217   /* <Description>                                                         */
218   /*    Data for interpolating a font from a distortable font specified    */
219   /*    by the GX *var tables ([fgcahvm]var).                              */
220   /*                                                                       */
221   /* <Fields>                                                              */
222   /*    num_axis ::                                                        */
223   /*      The number of axes along which interpolation may happen.         */
224   /*                                                                       */
225   /*    coords ::                                                          */
226   /*      An array of design coordinates (in user space) indicating the    */
227   /*      contribution along each axis to the final interpolated font.     */
228   /*      `normalizedcoords' holds the same values.                        */
229   /*                                                                       */
230   /*    normalizedcoords ::                                                */
231   /*      An array of normalized values (between [-1,1]) indicating the    */
232   /*      contribution along each axis to the final interpolated font.     */
233   /*      `coords' holds the same values.                                  */
234   /*                                                                       */
235   /*    mmvar ::                                                           */
236   /*      Data from the `fvar' table.                                      */
237   /*                                                                       */
238   /*    mmvar_len ::                                                       */
239   /*      The length of the `mmvar' structure.                             */
240   /*                                                                       */
241   /*    normalized_stylecoords ::                                          */
242   /*      A two-dimensional array that holds the named instance data from  */
243   /*      `mmvar' as normalized values.                                    */
244   /*                                                                       */
245   /*    avar_loaded ::                                                     */
246   /*      A Boolean; if set, FreeType tried to load (and parse) the `avar' */
247   /*      table.                                                           */
248   /*                                                                       */
249   /*    avar_segment ::                                                    */
250   /*      Data from the `avar' table.                                      */
251   /*                                                                       */
252   /*    hvar_loaded ::                                                     */
253   /*      A Boolean; if set, FreeType tried to load (and parse) the `hvar' */
254   /*      table.                                                           */
255   /*                                                                       */
256   /*    hvar_checked ::                                                    */
257   /*      A Boolean; if set, FreeType successfully loaded and parsed the   */
258   /*      `hvar' table.                                                    */
259   /*                                                                       */
260   /*    hvar_error ::                                                      */
261   /*      If loading and parsing of the `hvar' table failed, this field    */
262   /*      holds the corresponding error code.                              */
263   /*                                                                       */
264   /*    hvar_table ::                                                      */
265   /*      Data from the `hvar' table.                                      */
266   /*                                                                       */
267   /*    vvar_loaded ::                                                     */
268   /*      A Boolean; if set, FreeType tried to load (and parse) the `vvar' */
269   /*      table.                                                           */
270   /*                                                                       */
271   /*    vvar_checked ::                                                    */
272   /*      A Boolean; if set, FreeType successfully loaded and parsed the   */
273   /*      `vvar' table.                                                    */
274   /*                                                                       */
275   /*    vvar_error ::                                                      */
276   /*      If loading and parsing of the `vvar' table failed, this field    */
277   /*      holds the corresponding error code.                              */
278   /*                                                                       */
279   /*    vvar_table ::                                                      */
280   /*      Data from the `vvar' table.                                      */
281   /*                                                                       */
282   /*    mvar_table ::                                                      */
283   /*      Data from the `mvar' table.                                      */
284   /*                                                                       */
285   /*    tuplecount ::                                                      */
286   /*      The number of shared tuples in the `gvar' table.                 */
287   /*                                                                       */
288   /*    tuplecoords ::                                                     */
289   /*      A two-dimensional array that holds the shared tuple coordinates  */
290   /*      in the `gvar' table.                                             */
291   /*                                                                       */
292   /*    gv_glyphcnt ::                                                     */
293   /*      The number of glyphs handled in the `gvar' table.                */
294   /*                                                                       */
295   /*    glyphoffsets ::                                                    */
296   /*      Offsets into the glyph variation data array.                     */
297   /*                                                                       */
298   /*    gvar_size ::                                                       */
299   /*      The size of the `gvar' table.                                    */
300   /*                                                                       */
301   typedef struct  GX_BlendRec_
302   {
303     FT_UInt         num_axis;
304     FT_Fixed*       coords;
305     FT_Fixed*       normalizedcoords;
306 
307     FT_MM_Var*      mmvar;
308     FT_Offset       mmvar_len;
309 
310     FT_Fixed*       normalized_stylecoords;
311                       /* normalized_stylecoords[num_namedstyles][num_axis] */
312 
313     FT_Bool         avar_loaded;
314     GX_AVarSegment  avar_segment;                /* avar_segment[num_axis] */
315 
316     FT_Bool         hvar_loaded;
317     FT_Bool         hvar_checked;
318     FT_Error        hvar_error;
319     GX_HVVarTable   hvar_table;
320 
321     FT_Bool         vvar_loaded;
322     FT_Bool         vvar_checked;
323     FT_Error        vvar_error;
324     GX_HVVarTable   vvar_table;
325 
326     GX_MVarTable    mvar_table;
327 
328     FT_UInt         tuplecount;
329     FT_Fixed*       tuplecoords;      /* tuplecoords[tuplecount][num_axis] */
330 
331     FT_UInt         gv_glyphcnt;
332     FT_ULong*       glyphoffsets;         /* glyphoffsets[gv_glyphcnt + 1] */
333 
334     FT_ULong        gvar_size;
335 
336   } GX_BlendRec;
337 
338 
339   /*************************************************************************/
340   /*                                                                       */
341   /* <enum>                                                                */
342   /*    GX_TupleCountFlags                                                 */
343   /*                                                                       */
344   /* <Description>                                                         */
345   /*    Flags used within the `TupleCount' field of the `gvar' table.      */
346   /*                                                                       */
347   typedef enum  GX_TupleCountFlags_
348   {
349     GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
350     GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,
351     GX_TC_TUPLE_COUNT_MASK           = 0x0FFF
352 
353   } GX_TupleCountFlags;
354 
355 
356   /*************************************************************************/
357   /*                                                                       */
358   /* <enum>                                                                */
359   /*    GX_TupleIndexFlags                                                 */
360   /*                                                                       */
361   /* <Description>                                                         */
362   /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */
363   /*    tables.                                                            */
364   /*                                                                       */
365   typedef enum  GX_TupleIndexFlags_
366   {
367     GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,
368     GX_TI_INTERMEDIATE_TUPLE    = 0x4000,
369     GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
370     GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,
371     GX_TI_TUPLE_INDEX_MASK      = 0x0FFF
372 
373   } GX_TupleIndexFlags;
374 
375 
376 #define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )
377 #define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )
378 #define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )
379 #define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )
380 
381 
382   FT_LOCAL( FT_Error )
383   TT_Set_MM_Blend( TT_Face    face,
384                    FT_UInt    num_coords,
385                    FT_Fixed*  coords );
386 
387   FT_LOCAL( FT_Error )
388   TT_Get_MM_Blend( TT_Face    face,
389                    FT_UInt    num_coords,
390                    FT_Fixed*  coords );
391 
392   FT_LOCAL( FT_Error )
393   TT_Set_Var_Design( TT_Face    face,
394                      FT_UInt    num_coords,
395                      FT_Fixed*  coords );
396 
397   FT_LOCAL( FT_Error )
398   TT_Get_MM_Var( TT_Face      face,
399                  FT_MM_Var*  *master );
400 
401   FT_LOCAL( FT_Error )
402   TT_Get_Var_Design( TT_Face    face,
403                      FT_UInt    num_coords,
404                      FT_Fixed*  coords );
405 
406   FT_LOCAL( FT_Error )
407   TT_Set_Named_Instance( TT_Face  face,
408                          FT_UInt  instance_index );
409 
410   FT_LOCAL( FT_Error )
411   tt_face_vary_cvt( TT_Face    face,
412                     FT_Stream  stream );
413 
414 
415   FT_LOCAL( FT_Error )
416   TT_Vary_Apply_Glyph_Deltas( TT_Face      face,
417                               FT_UInt      glyph_index,
418                               FT_Outline*  outline,
419                               FT_UInt      n_points );
420 
421   FT_LOCAL( FT_Error )
422   tt_hadvance_adjust( TT_Face  face,
423                       FT_UInt  gindex,
424                       FT_Int  *adelta );
425 
426   FT_LOCAL( FT_Error )
427   tt_vadvance_adjust( TT_Face  face,
428                       FT_UInt  gindex,
429                       FT_Int  *adelta );
430 
431   FT_LOCAL( void )
432   tt_apply_mvar( TT_Face  face );
433 
434   FT_LOCAL( FT_Error )
435   tt_get_var_blend( TT_Face      face,
436                     FT_UInt     *num_coords,
437                     FT_Fixed*   *coords,
438                     FT_Fixed*   *normalizedcoords,
439                     FT_MM_Var*  *mm_var );
440 
441   FT_LOCAL( void )
442   tt_done_blend( TT_Face  face );
443 
444 #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
445 
446 
447 FT_END_HEADER
448 
449 
450 #endif /* TTGXVAR_H_ */
451 
452 
453 /* END */
454