1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  ttgxvar.h                                                              */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    TrueType GX Font Variation loader (specification)                    */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Copyright 2004 by                                                      */
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  This file is part of the FreeType project, and may only be used,       */
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  modified, and distributed under the terms of the FreeType project      */
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  this file you indicate that you have read the license and              */
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  understand and accept it fully.                                        */
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef __TTGXVAR_H__
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define __TTGXVAR_H__
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h>
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttobjs.h"
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFT_BEGIN_HEADER
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Struct>                                                              */
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    GX_AVarCorrespondenceRec                                           */
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    A data structure representing `shortFracCorrespondence' in `avar'  */
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    table according to the specifications from Apple.                  */
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  typedef struct  GX_AVarCorrespondenceRec_
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Fixed  fromCoord;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Fixed  toCoord;
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Struct>                                                              */
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    GX_AVarRec                                                         */
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Data from the segment field of `avar' table.                       */
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    There is one of these for each axis.                               */
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  typedef struct  GX_AVarSegmentRec_
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UShort              pairCount;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_AVarCorrespondence  correspondence; /* array with pairCount entries */
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } GX_AVarSegmentRec, *GX_AVarSegment;
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Struct>                                                              */
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    GX_BlendRec                                                        */
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Data for interpolating a font from a distortable font specified    */
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    by the GX *var tables ([fgca]var).                                 */
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Fields>                                                              */
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    num_axis         :: The number of axes along which interpolation   */
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                         may happen                                    */
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                        the contribution along each axis to the final  */
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                        interpolated font.                             */
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  typedef struct  GX_BlendRec_
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt         num_axis;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Fixed*       normalizedcoords;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_MM_Var*      mmvar;
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Offset       mmvar_len;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Bool         avar_checked;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_AVarSegment  avar_segment;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt         gv_glyphcnt;
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_ULong*       glyphoffsets;
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } GX_BlendRec;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <enum>                                                                */
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    GX_TupleCountFlags                                                 */
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Flags used within the `TupleCount' field of the `gvar' table.      */
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  typedef enum  GX_TupleCountFlags_
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TC_TUPLE_COUNT_MASK           = 0x0FFF
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } GX_TupleCountFlags;
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <enum>                                                                */
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    GX_TupleIndexFlags                                                 */
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* <Description>                                                         */
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*    tables.                                                            */
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  typedef enum  GX_TupleIndexFlags_
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TI_INTERMEDIATE_TUPLE    = 0x4000,
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GX_TI_TUPLE_INDEX_MASK      = 0x0FFF
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  } GX_TupleIndexFlags;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL( FT_Error )
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TT_Set_MM_Blend( TT_Face    face,
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_UInt    num_coords,
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                   FT_Fixed*  coords );
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL( FT_Error )
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TT_Set_Var_Design( TT_Face    face,
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     FT_UInt    num_coords,
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     FT_Fixed*  coords );
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL( FT_Error )
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TT_Get_MM_Var( TT_Face      face,
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 FT_MM_Var*  *master );
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL( FT_Error )
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_face_vary_cvt( TT_Face    face,
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FT_Stream  stream );
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL( FT_Error )
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  TT_Vary_Get_Glyph_Deltas( TT_Face      face,
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FT_UInt      glyph_index,
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FT_Vector*  *deltas,
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                            FT_UInt      n_points );
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL( void )
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_done_blend( FT_Memory  memory,
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 GX_Blend   blend );
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFT_END_HEADER
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* __TTGXVAR_H__ */
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
183