xref: /aosp_15_r20/external/freetype/src/truetype/ttgxvar.h (revision 63949dbd25bcc50c4e1178497ff9e9574d44fc5a)
1 /****************************************************************************
2  *
3  * ttgxvar.h
4  *
5  *   TrueType GX Font Variation loader (specification)
6  *
7  * Copyright (C) 2004-2023 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 <freetype/internal/ftmmtypes.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   /**************************************************************************
67    *
68    * @Struct:
69    *   GX_AVarTableRec
70    *
71    * @Description:
72    *   Data from the `avar' table.
73    */
74   typedef struct  GX_AVarTableRec_
75   {
76     GX_AVarSegment        avar_segment;   /* avar_segment[num_axis] */
77     GX_ItemVarStoreRec    itemStore;      /* Item Variation Store   */
78     GX_DeltaSetIdxMapRec  axisMap;        /* Axis Mapping           */
79 
80   } GX_AVarTableRec, *GX_AVarTable;
81 
82 
83   /**************************************************************************
84    *
85    * @Struct:
86    *   GX_HVVarTableRec
87    *
88    * @Description:
89    *   Data from either the `HVAR' or `VVAR' table.
90    */
91   typedef struct  GX_HVVarTableRec_
92   {
93     GX_ItemVarStoreRec    itemStore;        /* Item Variation Store  */
94     GX_DeltaSetIdxMapRec  widthMap;         /* Advance Width Mapping */
95 
96 #if 0
97     GX_DeltaSetIdxMapRec  lsbMap;           /* not implemented */
98     GX_DeltaSetIdxMapRec  rsbMap;           /* not implemented */
99 
100     GX_DeltaSetIdxMapRec  tsbMap;           /* not implemented */
101     GX_DeltaSetIdxMapRec  bsbMap;           /* not implemented */
102     GX_DeltaSetIdxMapRec  vorgMap;          /* not implemented */
103 #endif
104 
105   } GX_HVVarTableRec, *GX_HVVarTable;
106 
107 
108 #define MVAR_TAG_GASP_0  FT_MAKE_TAG( 'g', 's', 'p', '0' )
109 #define MVAR_TAG_GASP_1  FT_MAKE_TAG( 'g', 's', 'p', '1' )
110 #define MVAR_TAG_GASP_2  FT_MAKE_TAG( 'g', 's', 'p', '2' )
111 #define MVAR_TAG_GASP_3  FT_MAKE_TAG( 'g', 's', 'p', '3' )
112 #define MVAR_TAG_GASP_4  FT_MAKE_TAG( 'g', 's', 'p', '4' )
113 #define MVAR_TAG_GASP_5  FT_MAKE_TAG( 'g', 's', 'p', '5' )
114 #define MVAR_TAG_GASP_6  FT_MAKE_TAG( 'g', 's', 'p', '6' )
115 #define MVAR_TAG_GASP_7  FT_MAKE_TAG( 'g', 's', 'p', '7' )
116 #define MVAR_TAG_GASP_8  FT_MAKE_TAG( 'g', 's', 'p', '8' )
117 #define MVAR_TAG_GASP_9  FT_MAKE_TAG( 'g', 's', 'p', '9' )
118 
119 #define MVAR_TAG_CPHT  FT_MAKE_TAG( 'c', 'p', 'h', 't' )
120 #define MVAR_TAG_HASC  FT_MAKE_TAG( 'h', 'a', 's', 'c' )
121 #define MVAR_TAG_HCLA  FT_MAKE_TAG( 'h', 'c', 'l', 'a' )
122 #define MVAR_TAG_HCLD  FT_MAKE_TAG( 'h', 'c', 'l', 'd' )
123 #define MVAR_TAG_HCOF  FT_MAKE_TAG( 'h', 'c', 'o', 'f' )
124 #define MVAR_TAG_HCRN  FT_MAKE_TAG( 'h', 'c', 'r', 'n' )
125 #define MVAR_TAG_HCRS  FT_MAKE_TAG( 'h', 'c', 'r', 's' )
126 #define MVAR_TAG_HDSC  FT_MAKE_TAG( 'h', 'd', 's', 'c' )
127 #define MVAR_TAG_HLGP  FT_MAKE_TAG( 'h', 'l', 'g', 'p' )
128 #define MVAR_TAG_SBXO  FT_MAKE_TAG( 's', 'b', 'x', 'o' )
129 #define MVAR_TAG_SBXS  FT_MAKE_TAG( 's', 'b', 'x', 's' )
130 #define MVAR_TAG_SBYO  FT_MAKE_TAG( 's', 'b', 'y', 'o' )
131 #define MVAR_TAG_SBYS  FT_MAKE_TAG( 's', 'b', 'y', 's' )
132 #define MVAR_TAG_SPXO  FT_MAKE_TAG( 's', 'p', 'x', 'o' )
133 #define MVAR_TAG_SPXS  FT_MAKE_TAG( 's', 'p', 'x', 's' )
134 #define MVAR_TAG_SPYO  FT_MAKE_TAG( 's', 'p', 'y', 'o' )
135 #define MVAR_TAG_SPYS  FT_MAKE_TAG( 's', 'p', 'y', 's' )
136 #define MVAR_TAG_STRO  FT_MAKE_TAG( 's', 't', 'r', 'o' )
137 #define MVAR_TAG_STRS  FT_MAKE_TAG( 's', 't', 'r', 's' )
138 #define MVAR_TAG_UNDO  FT_MAKE_TAG( 'u', 'n', 'd', 'o' )
139 #define MVAR_TAG_UNDS  FT_MAKE_TAG( 'u', 'n', 'd', 's' )
140 #define MVAR_TAG_VASC  FT_MAKE_TAG( 'v', 'a', 's', 'c' )
141 #define MVAR_TAG_VCOF  FT_MAKE_TAG( 'v', 'c', 'o', 'f' )
142 #define MVAR_TAG_VCRN  FT_MAKE_TAG( 'v', 'c', 'r', 'n' )
143 #define MVAR_TAG_VCRS  FT_MAKE_TAG( 'v', 'c', 'r', 's' )
144 #define MVAR_TAG_VDSC  FT_MAKE_TAG( 'v', 'd', 's', 'c' )
145 #define MVAR_TAG_VLGP  FT_MAKE_TAG( 'v', 'l', 'g', 'p' )
146 #define MVAR_TAG_XHGT  FT_MAKE_TAG( 'x', 'h', 'g', 't' )
147 
148 
149   typedef struct  GX_ValueRec_
150   {
151     FT_ULong   tag;
152     FT_UShort  outerIndex;
153     FT_UShort  innerIndex;
154 
155     FT_Short  unmodified;  /* values are either FT_Short or FT_UShort */
156 
157   } GX_ValueRec, *GX_Value;
158 
159 
160   /**************************************************************************
161    *
162    * @Struct:
163    *   GX_MVarTableRec
164    *
165    * @Description:
166    *   Data from the `MVAR' table.
167    */
168   typedef struct  GX_MVarTableRec_
169   {
170     FT_UShort  valueCount;
171 
172     GX_ItemVarStoreRec  itemStore;        /* Item Variation Store  */
173     GX_Value            values;           /* Value Records         */
174 
175   } GX_MVarTableRec, *GX_MVarTable;
176 
177 
178   /**************************************************************************
179    *
180    * @Struct:
181    *   GX_BlendRec
182    *
183    * @Description:
184    *   Data for interpolating a font from a distortable font specified
185    *   by the GX *var tables ([fgcahvm]var).
186    *
187    * @Fields:
188    *   num_axis ::
189    *     The number of axes along which interpolation may happen.
190    *
191    *   coords ::
192    *     An array of design coordinates (in user space) indicating the
193    *     contribution along each axis to the final interpolated font.
194    *     `normalizedcoords' holds the same values.
195    *
196    *   normalizedcoords ::
197    *     An array of normalized values (between [-1,1]) indicating the
198    *     contribution along each axis to the final interpolated font.
199    *     `coords' holds the same values.
200    *
201    *   mmvar ::
202    *     Data from the `fvar' table.
203    *
204    *   mmvar_len ::
205    *     The length of the `mmvar' structure.
206    *
207    *   normalized_stylecoords ::
208    *     A two-dimensional array that holds the named instance data from
209    *     `mmvar' as normalized values.
210    *
211    *   avar_loaded ::
212    *     A Boolean; if set, FreeType tried to load (and parse) the `avar'
213    *     table.
214    *
215    *   avar_table ::
216    *     Data from the `avar' table.
217    *
218    *   hvar_loaded ::
219    *     A Boolean; if set, FreeType tried to load (and parse) the `hvar'
220    *     table.
221    *
222    *   hvar_checked ::
223    *     A Boolean; if set, FreeType successfully loaded and parsed the
224    *     `hvar' table.
225    *
226    *   hvar_error ::
227    *     If loading and parsing of the `hvar' table failed, this field
228    *     holds the corresponding error code.
229    *
230    *   hvar_table ::
231    *     Data from the `hvar' table.
232    *
233    *   vvar_loaded ::
234    *     A Boolean; if set, FreeType tried to load (and parse) the `vvar'
235    *     table.
236    *
237    *   vvar_checked ::
238    *     A Boolean; if set, FreeType successfully loaded and parsed the
239    *     `vvar' table.
240    *
241    *   vvar_error ::
242    *     If loading and parsing of the `vvar' table failed, this field
243    *     holds the corresponding error code.
244    *
245    *   vvar_table ::
246    *     Data from the `vvar' table.
247    *
248    *   mvar_table ::
249    *     Data from the `mvar' table.
250    *
251    *   tuplecount ::
252    *     The number of shared tuples in the `gvar' table.
253    *
254    *   tuplecoords ::
255    *     A two-dimensional array that holds the shared tuple coordinates
256    *     in the `gvar' table.
257    *
258    *   gv_glyphcnt ::
259    *     The number of glyphs handled in the `gvar' table.
260    *
261    *   glyphoffsets ::
262    *     Offsets into the glyph variation data array.
263    *
264    *   gvar_size ::
265    *     The size of the `gvar' table.
266    */
267   typedef struct  GX_BlendRec_
268   {
269     FT_UInt         num_axis;
270     FT_Fixed*       coords;
271     FT_Fixed*       normalizedcoords;
272 
273     FT_MM_Var*      mmvar;
274     FT_Offset       mmvar_len;
275 
276     FT_Fixed*       normalized_stylecoords;
277                       /* normalized_stylecoords[num_namedstyles][num_axis] */
278 
279     FT_Bool         avar_loaded;
280     GX_AVarTable    avar_table;
281 
282     FT_Bool         hvar_loaded;
283     FT_Bool         hvar_checked;
284     FT_Error        hvar_error;
285     GX_HVVarTable   hvar_table;
286 
287     FT_Bool         vvar_loaded;
288     FT_Bool         vvar_checked;
289     FT_Error        vvar_error;
290     GX_HVVarTable   vvar_table;
291 
292     GX_MVarTable    mvar_table;
293 
294     FT_UInt         tuplecount;
295     FT_Fixed*       tuplecoords;      /* tuplecoords[tuplecount][num_axis] */
296 
297     FT_UInt         gv_glyphcnt;
298     FT_ULong*       glyphoffsets;         /* glyphoffsets[gv_glyphcnt + 1] */
299 
300     FT_ULong        gvar_size;
301 
302   } GX_BlendRec;
303 
304 
305   /**************************************************************************
306    *
307    * @enum:
308    *   GX_TupleCountFlags
309    *
310    * @Description:
311    *   Flags used within the `TupleCount' field of the `gvar' table.
312    */
313   typedef enum  GX_TupleCountFlags_
314   {
315     GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
316     GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,
317     GX_TC_TUPLE_COUNT_MASK           = 0x0FFF
318 
319   } GX_TupleCountFlags;
320 
321 
322   /**************************************************************************
323    *
324    * @enum:
325    *   GX_TupleIndexFlags
326    *
327    * @Description:
328    *   Flags used within the `TupleIndex' field of the `gvar' and `cvar'
329    *   tables.
330    */
331   typedef enum  GX_TupleIndexFlags_
332   {
333     GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,
334     GX_TI_INTERMEDIATE_TUPLE    = 0x4000,
335     GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
336     GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,
337     GX_TI_TUPLE_INDEX_MASK      = 0x0FFF
338 
339   } GX_TupleIndexFlags;
340 
341 
342 #define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )
343 #define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )
344 #define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )
345 #define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )
346 #define TTAG_ital  FT_MAKE_TAG( 'i', 't', 'a', 'l' )
347 
348 
349   FT_LOCAL( FT_Error )
350   TT_Set_MM_Blend( FT_Face    face,
351                    FT_UInt    num_coords,
352                    FT_Fixed*  coords );
353 
354   FT_LOCAL( FT_Error )
355   TT_Get_MM_Blend( FT_Face    face,
356                    FT_UInt    num_coords,
357                    FT_Fixed*  coords );
358 
359   FT_LOCAL( FT_Error )
360   TT_Set_Var_Design( FT_Face    face,
361                      FT_UInt    num_coords,
362                      FT_Fixed*  coords );
363 
364   FT_LOCAL( FT_Error )
365   TT_Get_MM_Var( FT_Face      face,
366                  FT_MM_Var*  *master );
367 
368   FT_LOCAL( FT_Error )
369   TT_Get_Var_Design( FT_Face    face,
370                      FT_UInt    num_coords,
371                      FT_Fixed*  coords );
372 
373   FT_LOCAL( FT_Error )
374   TT_Set_Named_Instance( FT_Face  face,
375                          FT_UInt  instance_index );
376 
377   FT_LOCAL( FT_Error )
378   TT_Get_Default_Named_Instance( FT_Face   face,
379                                  FT_UInt  *instance_index );
380 
381   FT_LOCAL( void )
382   tt_construct_ps_name( FT_Face  face );
383 
384   FT_LOCAL( FT_Error )
385   tt_face_vary_cvt( TT_Face    face,
386                     FT_Stream  stream );
387 
388 
389   FT_LOCAL( FT_Error )
390   TT_Vary_Apply_Glyph_Deltas( TT_Loader    loader,
391                               FT_Outline*  outline,
392                               FT_Vector*   unrounded );
393 
394   FT_LOCAL( FT_Error )
395   tt_hadvance_adjust( FT_Face  face,
396                       FT_UInt  gindex,
397                       FT_Int  *adelta );
398 
399   FT_LOCAL( FT_Error )
400   tt_vadvance_adjust( FT_Face  face,
401                       FT_UInt  gindex,
402                       FT_Int  *adelta );
403 
404   FT_LOCAL( void )
405   tt_apply_mvar( FT_Face  face );
406 
407   FT_LOCAL( FT_Error )
408   tt_var_load_item_variation_store( FT_Face          face,
409                                     FT_ULong         offset,
410                                     GX_ItemVarStore  itemStore );
411 
412   FT_LOCAL( FT_Error )
413   tt_var_load_delta_set_index_mapping( FT_Face            face,
414                                        FT_ULong           offset,
415                                        GX_DeltaSetIdxMap  map,
416                                        GX_ItemVarStore    itemStore,
417                                        FT_ULong           table_len );
418 
419   FT_LOCAL( FT_ItemVarDelta )
420   tt_var_get_item_delta( FT_Face          face,
421                          GX_ItemVarStore  itemStore,
422                          FT_UInt          outerIndex,
423                          FT_UInt          innerIndex );
424 
425   FT_LOCAL( void )
426   tt_var_done_item_variation_store( FT_Face          face,
427                                     GX_ItemVarStore  itemStore );
428 
429   FT_LOCAL( void )
430   tt_var_done_delta_set_index_map( FT_Face            face,
431                                    GX_DeltaSetIdxMap  deltaSetIdxMap );
432 
433 
434   FT_LOCAL( FT_Error )
435   tt_get_var_blend( FT_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( FT_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