1/***************************************************************************/
2/*                                                                         */
3/*  ttgxvar.h                                                              */
4/*                                                                         */
5/*    TrueType GX Font Variation loader (specification)                    */
6/*                                                                         */
7/*  Copyright 2004-2017 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
27FT_BEGIN_HEADER
28
29
30  /*************************************************************************/
31  /*                                                                       */
32  /* <Struct>                                                              */
33  /*    GX_AVarCorrespondenceRec                                           */
34  /*                                                                       */
35  /* <Description>                                                         */
36  /*    A data structure representing `shortFracCorrespondence' in `avar'  */
37  /*    table according to the specifications from Apple.                  */
38  /*                                                                       */
39  typedef struct  GX_AVarCorrespondenceRec_
40  {
41    FT_Fixed  fromCoord;
42    FT_Fixed  toCoord;
43
44  } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
45
46
47  /*************************************************************************/
48  /*                                                                       */
49  /* <Struct>                                                              */
50  /*    GX_AVarRec                                                         */
51  /*                                                                       */
52  /* <Description>                                                         */
53  /*    Data from the segment field of `avar' table.                       */
54  /*    There is one of these for each axis.                               */
55  /*                                                                       */
56  typedef struct  GX_AVarSegmentRec_
57  {
58    FT_UShort              pairCount;
59    GX_AVarCorrespondence  correspondence; /* array with pairCount entries */
60
61  } GX_AVarSegmentRec, *GX_AVarSegment;
62
63
64  typedef struct  GX_ItemVarDataRec_
65  {
66    FT_UInt    itemCount;      /* number of delta sets per item         */
67    FT_UInt    regionIdxCount; /* number of region indices in this data */
68    FT_UInt*   regionIndices;  /* array of `regionCount' indices;       */
69                               /* these index `varRegionList'           */
70    FT_Short*  deltaSet;       /* array of `itemCount' deltas           */
71                               /* use `innerIndex' for this array       */
72
73  } GX_ItemVarDataRec, *GX_ItemVarData;
74
75
76  /* contribution of one axis to a region */
77  typedef struct  GX_AxisCoordsRec_
78  {
79    FT_Fixed  startCoord;
80    FT_Fixed  peakCoord;      /* zero means no effect (factor = 1) */
81    FT_Fixed  endCoord;
82
83  } GX_AxisCoordsRec, *GX_AxisCoords;
84
85
86  typedef struct  GX_VarRegionRec_
87  {
88    GX_AxisCoords  axisList;               /* array of axisCount records */
89
90  } GX_VarRegionRec, *GX_VarRegion;
91
92
93  /* item variation store */
94  typedef struct  GX_ItemVarStoreRec_
95  {
96    FT_UInt         dataCount;
97    GX_ItemVarData  varData;            /* array of dataCount records;     */
98                                        /* use `outerIndex' for this array */
99    FT_UShort     axisCount;
100    FT_UInt       regionCount;          /* total number of regions defined */
101    GX_VarRegion  varRegionList;
102
103  } GX_ItemVarStoreRec, *GX_ItemVarStore;
104
105
106  typedef struct  GX_DeltaSetIdxMapRec_
107  {
108    FT_UInt   mapCount;
109    FT_UInt*  outerIndex;             /* indices to item var data */
110    FT_UInt*  innerIndex;             /* indices to delta set     */
111
112  } GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap;
113
114
115  /*************************************************************************/
116  /*                                                                       */
117  /* <Struct>                                                              */
118  /*    GX_HVVarTableRec                                                   */
119  /*                                                                       */
120  /* <Description>                                                         */
121  /*    Data from either the `HVAR' or `VVAR' table.                       */
122  /*                                                                       */
123  typedef struct  GX_HVVarTableRec_
124  {
125    GX_ItemVarStoreRec    itemStore;        /* Item Variation Store  */
126    GX_DeltaSetIdxMapRec  widthMap;         /* Advance Width Mapping */
127
128#if 0
129    GX_DeltaSetIdxMapRec  lsbMap;           /* not implemented */
130    GX_DeltaSetIdxMapRec  rsbMap;           /* not implemented */
131
132    GX_DeltaSetIdxMapRec  tsbMap;           /* not implemented */
133    GX_DeltaSetIdxMapRec  bsbMap;           /* not implemented */
134    GX_DeltaSetIdxMapRec  vorgMap;          /* not implemented */
135#endif
136
137  } GX_HVVarTableRec, *GX_HVVarTable;
138
139
140#define MVAR_TAG_GASP_0  FT_MAKE_TAG( 'g', 's', 'p', '0' )
141#define MVAR_TAG_GASP_1  FT_MAKE_TAG( 'g', 's', 'p', '1' )
142#define MVAR_TAG_GASP_2  FT_MAKE_TAG( 'g', 's', 'p', '2' )
143#define MVAR_TAG_GASP_3  FT_MAKE_TAG( 'g', 's', 'p', '3' )
144#define MVAR_TAG_GASP_4  FT_MAKE_TAG( 'g', 's', 'p', '4' )
145#define MVAR_TAG_GASP_5  FT_MAKE_TAG( 'g', 's', 'p', '5' )
146#define MVAR_TAG_GASP_6  FT_MAKE_TAG( 'g', 's', 'p', '6' )
147#define MVAR_TAG_GASP_7  FT_MAKE_TAG( 'g', 's', 'p', '7' )
148#define MVAR_TAG_GASP_8  FT_MAKE_TAG( 'g', 's', 'p', '8' )
149#define MVAR_TAG_GASP_9  FT_MAKE_TAG( 'g', 's', 'p', '9' )
150
151#define MVAR_TAG_CPHT  FT_MAKE_TAG( 'c', 'p', 'h', 't' )
152#define MVAR_TAG_HASC  FT_MAKE_TAG( 'h', 'a', 's', 'c' )
153#define MVAR_TAG_HCLA  FT_MAKE_TAG( 'h', 'c', 'l', 'a' )
154#define MVAR_TAG_HCLD  FT_MAKE_TAG( 'h', 'c', 'l', 'd' )
155#define MVAR_TAG_HCOF  FT_MAKE_TAG( 'h', 'c', 'o', 'f' )
156#define MVAR_TAG_HCRN  FT_MAKE_TAG( 'h', 'c', 'r', 'n' )
157#define MVAR_TAG_HCRS  FT_MAKE_TAG( 'h', 'c', 'r', 's' )
158#define MVAR_TAG_HDSC  FT_MAKE_TAG( 'h', 'd', 's', 'c' )
159#define MVAR_TAG_HLGP  FT_MAKE_TAG( 'h', 'l', 'g', 'p' )
160#define MVAR_TAG_SBXO  FT_MAKE_TAG( 's', 'b', 'x', 'o' )
161#define MVAR_TAG_SBXS  FT_MAKE_TAG( 's', 'b', 'x', 's' )
162#define MVAR_TAG_SBYO  FT_MAKE_TAG( 's', 'b', 'y', 'o' )
163#define MVAR_TAG_SBYS  FT_MAKE_TAG( 's', 'b', 'y', 's' )
164#define MVAR_TAG_SPXO  FT_MAKE_TAG( 's', 'p', 'x', 'o' )
165#define MVAR_TAG_SPXS  FT_MAKE_TAG( 's', 'p', 'x', 's' )
166#define MVAR_TAG_SPYO  FT_MAKE_TAG( 's', 'p', 'y', 'o' )
167#define MVAR_TAG_SPYS  FT_MAKE_TAG( 's', 'p', 'y', 's' )
168#define MVAR_TAG_STRO  FT_MAKE_TAG( 's', 't', 'r', 'o' )
169#define MVAR_TAG_STRS  FT_MAKE_TAG( 's', 't', 'r', 's' )
170#define MVAR_TAG_UNDO  FT_MAKE_TAG( 'u', 'n', 'd', 'o' )
171#define MVAR_TAG_UNDS  FT_MAKE_TAG( 'u', 'n', 'd', 's' )
172#define MVAR_TAG_VASC  FT_MAKE_TAG( 'v', 'a', 's', 'c' )
173#define MVAR_TAG_VCOF  FT_MAKE_TAG( 'v', 'c', 'o', 'f' )
174#define MVAR_TAG_VCRN  FT_MAKE_TAG( 'v', 'c', 'r', 'n' )
175#define MVAR_TAG_VCRS  FT_MAKE_TAG( 'v', 'c', 'r', 's' )
176#define MVAR_TAG_VDSC  FT_MAKE_TAG( 'v', 'd', 's', 'c' )
177#define MVAR_TAG_VLGP  FT_MAKE_TAG( 'v', 'l', 'g', 'p' )
178#define MVAR_TAG_XHGT  FT_MAKE_TAG( 'x', 'h', 'g', 't' )
179
180
181  typedef struct  GX_ValueRec_
182  {
183    FT_ULong   tag;
184    FT_UShort  outerIndex;
185    FT_UShort  innerIndex;
186
187    FT_Short  unmodified;  /* values are either FT_Short or FT_UShort */
188
189  } GX_ValueRec, *GX_Value;
190
191
192  /*************************************************************************/
193  /*                                                                       */
194  /* <Struct>                                                              */
195  /*    GX_MVarTableRec                                                    */
196  /*                                                                       */
197  /* <Description>                                                         */
198  /*    Data from the `MVAR' table.                                        */
199  /*                                                                       */
200  typedef struct  GX_MVarTableRec_
201  {
202    FT_UShort  valueCount;
203
204    GX_ItemVarStoreRec  itemStore;        /* Item Variation Store  */
205    GX_Value            values;           /* Value Records         */
206
207  } GX_MVarTableRec, *GX_MVarTable;
208
209
210  /*************************************************************************/
211  /*                                                                       */
212  /* <Struct>                                                              */
213  /*    GX_BlendRec                                                        */
214  /*                                                                       */
215  /* <Description>                                                         */
216  /*    Data for interpolating a font from a distortable font specified    */
217  /*    by the GX *var tables ([fgca]var).                                 */
218  /*                                                                       */
219  /* <Fields>                                                              */
220  /*    num_axis         :: The number of axes along which interpolation   */
221  /*                         may happen                                    */
222  /*                                                                       */
223  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */
224  /*                        the contribution along each axis to the final  */
225  /*                        interpolated font.                             */
226  /*                                                                       */
227  typedef struct  GX_BlendRec_
228  {
229    FT_UInt         num_axis;
230    FT_Fixed*       normalizedcoords;
231
232    FT_MM_Var*      mmvar;
233    FT_Offset       mmvar_len;
234
235    FT_Bool         avar_checked;
236    GX_AVarSegment  avar_segment;
237
238    FT_Bool         hvar_loaded;
239    FT_Bool         hvar_checked;
240    FT_Error        hvar_error;
241    GX_HVVarTable   hvar_table;
242
243    FT_Bool         vvar_loaded;
244    FT_Bool         vvar_checked;
245    FT_Error        vvar_error;
246    GX_HVVarTable   vvar_table;
247
248    GX_MVarTable    mvar_table;
249
250    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */
251    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */
252
253    FT_UInt         gv_glyphcnt;
254    FT_ULong*       glyphoffsets;
255
256    FT_ULong        gvar_size;
257
258  } GX_BlendRec;
259
260
261  /*************************************************************************/
262  /*                                                                       */
263  /* <enum>                                                                */
264  /*    GX_TupleCountFlags                                                 */
265  /*                                                                       */
266  /* <Description>                                                         */
267  /*    Flags used within the `TupleCount' field of the `gvar' table.      */
268  /*                                                                       */
269  typedef enum  GX_TupleCountFlags_
270  {
271    GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
272    GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,
273    GX_TC_TUPLE_COUNT_MASK           = 0x0FFF
274
275  } GX_TupleCountFlags;
276
277
278  /*************************************************************************/
279  /*                                                                       */
280  /* <enum>                                                                */
281  /*    GX_TupleIndexFlags                                                 */
282  /*                                                                       */
283  /* <Description>                                                         */
284  /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */
285  /*    tables.                                                            */
286  /*                                                                       */
287  typedef enum  GX_TupleIndexFlags_
288  {
289    GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,
290    GX_TI_INTERMEDIATE_TUPLE    = 0x4000,
291    GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
292    GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,
293    GX_TI_TUPLE_INDEX_MASK      = 0x0FFF
294
295  } GX_TupleIndexFlags;
296
297
298#define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )
299#define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )
300#define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )
301#define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )
302
303
304  FT_LOCAL( FT_Error )
305  TT_Set_MM_Blend( TT_Face    face,
306                   FT_UInt    num_coords,
307                   FT_Fixed*  coords );
308
309  FT_LOCAL( FT_Error )
310  TT_Get_MM_Blend( TT_Face    face,
311                   FT_UInt    num_coords,
312                   FT_Fixed*  coords );
313
314  FT_LOCAL( FT_Error )
315  TT_Set_Var_Design( TT_Face    face,
316                     FT_UInt    num_coords,
317                     FT_Fixed*  coords );
318
319  FT_LOCAL( FT_Error )
320  TT_Get_MM_Var( TT_Face      face,
321                 FT_MM_Var*  *master );
322
323  FT_LOCAL( FT_Error )
324  TT_Get_Var_Design( TT_Face    face,
325                     FT_UInt    num_coords,
326                     FT_Fixed*  coords );
327
328  FT_LOCAL( FT_Error )
329  tt_face_vary_cvt( TT_Face    face,
330                    FT_Stream  stream );
331
332
333  FT_LOCAL( FT_Error )
334  TT_Vary_Apply_Glyph_Deltas( TT_Face      face,
335                              FT_UInt      glyph_index,
336                              FT_Outline*  outline,
337                              FT_UInt      n_points );
338
339  FT_LOCAL( FT_Error )
340  tt_hadvance_adjust( TT_Face  face,
341                      FT_UInt  gindex,
342                      FT_Int  *adelta );
343
344  FT_LOCAL( FT_Error )
345  tt_vadvance_adjust( TT_Face  face,
346                      FT_UInt  gindex,
347                      FT_Int  *adelta );
348
349  FT_LOCAL( void )
350  tt_apply_mvar( TT_Face  face );
351
352  FT_LOCAL( FT_Error )
353  tt_get_var_blend( TT_Face      face,
354                    FT_UInt     *num_coords,
355                    FT_Fixed*   *coords,
356                    FT_MM_Var*  *mm_var );
357
358  FT_LOCAL( void )
359  tt_done_blend( TT_Face  face );
360
361
362FT_END_HEADER
363
364
365#endif /* TTGXVAR_H_ */
366
367
368/* END */
369