(root)/
freetype-2.13.2/
src/
truetype/
ttgxvar.h
       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 */