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