Home | History | Annotate | Download | only in truetype
      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