(root)/
freetype-2.13.2/
src/
gxvalid/
gxvcommn.h
       1  /****************************************************************************
       2   *
       3   * gxvcommn.h
       4   *
       5   *   TrueTypeGX/AAT common tables validation (specification).
       6   *
       7   * Copyright (C) 2004-2023 by
       8   * suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
       9   * David Turner, Robert Wilhelm, and Werner Lemberg.
      10   *
      11   * This file is part of the FreeType project, and may only be used,
      12   * modified, and distributed under the terms of the FreeType project
      13   * license, LICENSE.TXT.  By continuing to use, modify, or distribute
      14   * this file you indicate that you have read the license and
      15   * understand and accept it fully.
      16   *
      17   */
      18  
      19  /****************************************************************************
      20   *
      21   * gxvalid is derived from both gxlayout module and otvalid module.
      22   * Development of gxlayout is supported by the Information-technology
      23   * Promotion Agency(IPA), Japan.
      24   *
      25   */
      26  
      27  
      28    /*
      29     * keywords in variable naming
      30     * ---------------------------
      31     * table:  Of type FT_Bytes, pointing to the start of this table/subtable.
      32     * limit:  Of type FT_Bytes, pointing to the end of this table/subtable,
      33     *         including padding for alignment.
      34     * offset: Of type FT_UInt, the number of octets from the start to target.
      35     * length: Of type FT_UInt, the number of octets from the start to the
      36     *         end in this table/subtable, including padding for alignment.
      37     *
      38     *  _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
      39     */
      40  
      41  
      42  #ifndef GXVCOMMN_H_
      43  #define GXVCOMMN_H_
      44  
      45  
      46  #include "gxvalid.h"
      47  #include <freetype/internal/ftdebug.h>
      48  #include <freetype/ftsnames.h>
      49  
      50  
      51  FT_BEGIN_HEADER
      52  
      53  
      54    /* some variables are not evaluated or only used in trace */
      55  
      56  #ifdef  FT_DEBUG_LEVEL_TRACE
      57  #define GXV_LOAD_TRACE_VARS
      58  #else
      59  #undef  GXV_LOAD_TRACE_VARS
      60  #endif
      61  
      62  #undef GXV_LOAD_UNUSED_VARS /* debug purpose */
      63  
      64  #define IS_PARANOID_VALIDATION                             \
      65            ( gxvalid->root->level >= FT_VALIDATE_PARANOID )
      66  #define GXV_SET_ERR_IF_PARANOID( err )                              \
      67            do { if ( IS_PARANOID_VALIDATION ) ( err ); } while ( 0 )
      68  
      69  
      70    /*************************************************************************/
      71    /*************************************************************************/
      72    /*****                                                               *****/
      73    /*****                         VALIDATION                            *****/
      74    /*****                                                               *****/
      75    /*************************************************************************/
      76    /*************************************************************************/
      77  
      78    typedef struct GXV_ValidatorRec_*  GXV_Validator;
      79  
      80  
      81  #define DUMMY_LIMIT 0
      82  
      83    typedef void
      84    (*GXV_Validate_Func)( FT_Bytes       table,
      85                          FT_Bytes       limit,
      86                          GXV_Validator  gxvalid );
      87  
      88  
      89    /* ====================== LookupTable Validator ======================== */
      90  
      91    typedef union  GXV_LookupValueDesc_
      92    {
      93      FT_UShort u;
      94      FT_Short  s;
      95  
      96    } GXV_LookupValueDesc;
      97  
      98    typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
      99  
     100    typedef enum  GXV_LookupValue_SignSpec_
     101    {
     102      GXV_LOOKUPVALUE_UNSIGNED = 0,
     103      GXV_LOOKUPVALUE_SIGNED
     104  
     105    } GXV_LookupValue_SignSpec;
     106  
     107  
     108    typedef void
     109    (*GXV_Lookup_Value_Validate_Func)( FT_UShort            glyph,
     110                                       GXV_LookupValueCPtr  value_p,
     111                                       GXV_Validator        gxvalid );
     112  
     113    typedef GXV_LookupValueDesc
     114    (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort            relative_gindex,
     115                                     GXV_LookupValueCPtr  base_value_p,
     116                                     FT_Bytes             lookuptbl_limit,
     117                                     GXV_Validator        gxvalid );
     118  
     119  
     120    /* ====================== StateTable Validator ========================= */
     121  
     122    typedef enum  GXV_GlyphOffset_Format_
     123    {
     124      GXV_GLYPHOFFSET_NONE   = -1,
     125      GXV_GLYPHOFFSET_UCHAR  = 2,
     126      GXV_GLYPHOFFSET_CHAR,
     127      GXV_GLYPHOFFSET_USHORT = 4,
     128      GXV_GLYPHOFFSET_SHORT,
     129      GXV_GLYPHOFFSET_ULONG  = 8,
     130      GXV_GLYPHOFFSET_LONG
     131  
     132    } GXV_GlyphOffset_Format;
     133  
     134  
     135  #define GXV_GLYPHOFFSET_FMT( table )           \
     136          ( gxvalid->table.entry_glyphoffset_fmt )
     137  
     138  #define GXV_GLYPHOFFSET_SIZE( table )              \
     139          ( gxvalid->table.entry_glyphoffset_fmt / 2 )
     140  
     141  
     142    /* ----------------------- 16bit StateTable ---------------------------- */
     143  
     144    typedef union  GXV_StateTable_GlyphOffsetDesc_
     145    {
     146      FT_Byte    uc;
     147      FT_UShort  u;       /* same as GXV_LookupValueDesc */
     148      FT_ULong   ul;
     149      FT_Char    c;
     150      FT_Short   s;       /* same as GXV_LookupValueDesc */
     151      FT_Long    l;
     152  
     153    } GXV_StateTable_GlyphOffsetDesc;
     154  
     155    typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
     156  
     157    typedef void
     158    (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort      table_size,
     159                                           FT_UShort      classTable,
     160                                           FT_UShort      stateArray,
     161                                           FT_UShort      entryTable,
     162                                           FT_UShort*     classTable_length_p,
     163                                           FT_UShort*     stateArray_length_p,
     164                                           FT_UShort*     entryTable_length_p,
     165                                           GXV_Validator  gxvalid );
     166  
     167    typedef void
     168    (*GXV_StateTable_Entry_Validate_Func)(
     169       FT_Byte                         state,
     170       FT_UShort                       flags,
     171       GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
     172       FT_Bytes                        statetable_table,
     173       FT_Bytes                        statetable_limit,
     174       GXV_Validator                   gxvalid );
     175  
     176    typedef void
     177    (*GXV_StateTable_OptData_Load_Func)( FT_Bytes       table,
     178                                         FT_Bytes       limit,
     179                                         GXV_Validator  gxvalid );
     180  
     181    typedef struct  GXV_StateTable_ValidatorRec_
     182    {
     183      GXV_GlyphOffset_Format              entry_glyphoffset_fmt;
     184      void*                               optdata;
     185  
     186      GXV_StateTable_Subtable_Setup_Func  subtable_setup_func;
     187      GXV_StateTable_Entry_Validate_Func  entry_validate_func;
     188      GXV_StateTable_OptData_Load_Func    optdata_load_func;
     189  
     190    } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
     191  
     192  
     193    /* ---------------------- 32bit XStateTable ---------------------------- */
     194  
     195    typedef GXV_StateTable_GlyphOffsetDesc  GXV_XStateTable_GlyphOffsetDesc;
     196  
     197    typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
     198  
     199    typedef void
     200    (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong       table_size,
     201                                            FT_ULong       classTable,
     202                                            FT_ULong       stateArray,
     203                                            FT_ULong       entryTable,
     204                                            FT_ULong*      classTable_length_p,
     205                                            FT_ULong*      stateArray_length_p,
     206                                            FT_ULong*      entryTable_length_p,
     207                                            GXV_Validator  gxvalid );
     208  
     209    typedef void
     210    (*GXV_XStateTable_Entry_Validate_Func)(
     211       FT_UShort                       state,
     212       FT_UShort                       flags,
     213       GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
     214       FT_Bytes                        xstatetable_table,
     215       FT_Bytes                        xstatetable_limit,
     216       GXV_Validator                   gxvalid );
     217  
     218  
     219    typedef GXV_StateTable_OptData_Load_Func  GXV_XStateTable_OptData_Load_Func;
     220  
     221  
     222    typedef struct  GXV_XStateTable_ValidatorRec_
     223    {
     224      int                                  entry_glyphoffset_fmt;
     225      void*                                optdata;
     226  
     227      GXV_XStateTable_Subtable_Setup_Func  subtable_setup_func;
     228      GXV_XStateTable_Entry_Validate_Func  entry_validate_func;
     229      GXV_XStateTable_OptData_Load_Func    optdata_load_func;
     230  
     231      FT_ULong                             nClasses;
     232      FT_UShort                            maxClassID;
     233  
     234    } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
     235  
     236  
     237    /* ===================================================================== */
     238  
     239    typedef struct  GXV_ValidatorRec_
     240    {
     241      FT_Validator  root;
     242  
     243      FT_Face       face;
     244      void*         table_data;
     245  
     246      FT_ULong      subtable_length;
     247  
     248      GXV_LookupValue_SignSpec        lookupval_sign;
     249      GXV_Lookup_Value_Validate_Func  lookupval_func;
     250      GXV_Lookup_Fmt4_Transit_Func    lookupfmt4_trans;
     251      FT_Bytes                        lookuptbl_head;
     252  
     253      FT_UShort  min_gid;
     254      FT_UShort  max_gid;
     255  
     256      GXV_StateTable_ValidatorRec     statetable;
     257      GXV_XStateTable_ValidatorRec    xstatetable;
     258  
     259  #ifdef FT_DEBUG_LEVEL_TRACE
     260      FT_UInt             debug_indent;
     261      const FT_String*    debug_function_name[3];
     262  #endif
     263  
     264    } GXV_ValidatorRec;
     265  
     266  
     267  #define GXV_TABLE_DATA( tag, field )                             \
     268          ( ( (GXV_ ## tag ## _Data)gxvalid->table_data )->field )
     269  
     270  #undef  FT_INVALID_
     271  #define FT_INVALID_( _error )                                     \
     272            ft_validator_error( gxvalid->root, FT_THROW( _error ) )
     273  
     274  #define GXV_LIMIT_CHECK( _count )                                       \
     275            FT_BEGIN_STMNT                                                \
     276              if ( p + _count > ( limit? limit : gxvalid->root->limit ) ) \
     277                FT_INVALID_TOO_SHORT;                                     \
     278            FT_END_STMNT
     279  
     280  
     281  #ifdef FT_DEBUG_LEVEL_TRACE
     282  
     283  #define GXV_INIT  gxvalid->debug_indent = 0
     284  
     285  #define GXV_NAME_ENTER( name )                                \
     286            FT_BEGIN_STMNT                                      \
     287              gxvalid->debug_indent += 2;                       \
     288              FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \
     289              FT_TRACE4(( "%s table\n", name ));                \
     290            FT_END_STMNT
     291  
     292  #define GXV_EXIT  gxvalid->debug_indent -= 2
     293  
     294  #define GXV_TRACE( s )                                        \
     295            FT_BEGIN_STMNT                                      \
     296              FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \
     297              FT_TRACE4( s );                                   \
     298            FT_END_STMNT
     299  
     300  #else /* !FT_DEBUG_LEVEL_TRACE */
     301  
     302  #define GXV_INIT                do { } while ( 0 )
     303  #define GXV_NAME_ENTER( name )  do { } while ( 0 )
     304  #define GXV_EXIT                do { } while ( 0 )
     305  
     306  #define GXV_TRACE( s )          do { } while ( 0 )
     307  
     308  #endif  /* !FT_DEBUG_LEVEL_TRACE */
     309  
     310  
     311    /*************************************************************************/
     312    /*************************************************************************/
     313    /*****                                                               *****/
     314    /*****                    32bit alignment checking                   *****/
     315    /*****                                                               *****/
     316    /*************************************************************************/
     317    /*************************************************************************/
     318  
     319  #define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
     320            FT_BEGIN_STMNT                  \
     321              {                             \
     322                if ( (a) & 3 )              \
     323                  FT_INVALID_OFFSET;        \
     324              }                             \
     325            FT_END_STMNT
     326  
     327  
     328    /*************************************************************************/
     329    /*************************************************************************/
     330    /*****                                                               *****/
     331    /*****                    Dumping Binary Data                        *****/
     332    /*****                                                               *****/
     333    /*************************************************************************/
     334    /*************************************************************************/
     335  
     336  #define GXV_TRACE_HEXDUMP( p, len )                     \
     337            FT_BEGIN_STMNT                                \
     338              {                                           \
     339                FT_Bytes  b;                              \
     340                                                          \
     341                                                          \
     342                for ( b = p; b < (FT_Bytes)p + len; b++ ) \
     343                  FT_TRACE1(("\\x%02x", *b));             \
     344              }                                           \
     345            FT_END_STMNT
     346  
     347  #define GXV_TRACE_HEXDUMP_C( p, len )                   \
     348            FT_BEGIN_STMNT                                \
     349              {                                           \
     350                FT_Bytes  b;                              \
     351                                                          \
     352                                                          \
     353                for ( b = p; b < (FT_Bytes)p + len; b++ ) \
     354                  if ( 0x40 < *b && *b < 0x7E )           \
     355                    FT_TRACE1(("%c", *b));                \
     356                  else                                    \
     357                    FT_TRACE1(("\\x%02x", *b));           \
     358              }                                           \
     359            FT_END_STMNT
     360  
     361  #define GXV_TRACE_HEXDUMP_SFNTNAME( n )               \
     362            GXV_TRACE_HEXDUMP( n.string, n.string_len )
     363  
     364  
     365    /*************************************************************************/
     366    /*************************************************************************/
     367    /*****                                                               *****/
     368    /*****                         LOOKUP TABLE                          *****/
     369    /*****                                                               *****/
     370    /*************************************************************************/
     371    /*************************************************************************/
     372  
     373    FT_LOCAL( void )
     374    gxv_BinSrchHeader_validate( FT_Bytes       p,
     375                                FT_Bytes       limit,
     376                                FT_UShort*     unitSize_p,
     377                                FT_UShort*     nUnits_p,
     378                                GXV_Validator  gxvalid );
     379  
     380    FT_LOCAL( void )
     381    gxv_LookupTable_validate( FT_Bytes       table,
     382                              FT_Bytes       limit,
     383                              GXV_Validator  gxvalid );
     384  
     385  
     386    /*************************************************************************/
     387    /*************************************************************************/
     388    /*****                                                               *****/
     389    /*****                          Glyph ID                             *****/
     390    /*****                                                               *****/
     391    /*************************************************************************/
     392    /*************************************************************************/
     393  
     394    FT_LOCAL( FT_Int )
     395    gxv_glyphid_validate( FT_UShort      gid,
     396                          GXV_Validator  gxvalid );
     397  
     398  
     399    /*************************************************************************/
     400    /*************************************************************************/
     401    /*****                                                               *****/
     402    /*****                        CONTROL POINT                          *****/
     403    /*****                                                               *****/
     404    /*************************************************************************/
     405    /*************************************************************************/
     406  
     407    FT_LOCAL( void )
     408    gxv_ctlPoint_validate( FT_UShort      gid,
     409                           FT_UShort      ctl_point,
     410                           GXV_Validator  gxvalid );
     411  
     412  
     413    /*************************************************************************/
     414    /*************************************************************************/
     415    /*****                                                               *****/
     416    /*****                          SFNT NAME                            *****/
     417    /*****                                                               *****/
     418    /*************************************************************************/
     419    /*************************************************************************/
     420  
     421    FT_LOCAL( void )
     422    gxv_sfntName_validate( FT_UShort      name_index,
     423                           FT_UShort      min_index,
     424                           FT_UShort      max_index,
     425                           GXV_Validator  gxvalid );
     426  
     427  
     428    /*************************************************************************/
     429    /*************************************************************************/
     430    /*****                                                               *****/
     431    /*****                          STATE TABLE                          *****/
     432    /*****                                                               *****/
     433    /*************************************************************************/
     434    /*************************************************************************/
     435  
     436    FT_LOCAL( void )
     437    gxv_StateTable_subtable_setup( FT_UShort      table_size,
     438                                   FT_UShort      classTable,
     439                                   FT_UShort      stateArray,
     440                                   FT_UShort      entryTable,
     441                                   FT_UShort*     classTable_length_p,
     442                                   FT_UShort*     stateArray_length_p,
     443                                   FT_UShort*     entryTable_length_p,
     444                                   GXV_Validator  gxvalid );
     445  
     446    FT_LOCAL( void )
     447    gxv_XStateTable_subtable_setup( FT_ULong       table_size,
     448                                    FT_ULong       classTable,
     449                                    FT_ULong       stateArray,
     450                                    FT_ULong       entryTable,
     451                                    FT_ULong*      classTable_length_p,
     452                                    FT_ULong*      stateArray_length_p,
     453                                    FT_ULong*      entryTable_length_p,
     454                                    GXV_Validator  gxvalid );
     455  
     456    FT_LOCAL( void )
     457    gxv_StateTable_validate( FT_Bytes       table,
     458                             FT_Bytes       limit,
     459                             GXV_Validator  gxvalid );
     460  
     461    FT_LOCAL( void )
     462    gxv_XStateTable_validate( FT_Bytes       table,
     463                              FT_Bytes       limit,
     464                              GXV_Validator  gxvalid );
     465  
     466  
     467    /*************************************************************************/
     468    /*************************************************************************/
     469    /*****                                                               *****/
     470    /*****                 UTILITY MACROS AND FUNCTIONS                  *****/
     471    /*****                                                               *****/
     472    /*************************************************************************/
     473    /*************************************************************************/
     474  
     475    FT_LOCAL( void )
     476    gxv_array_getlimits_byte( FT_Bytes       table,
     477                              FT_Bytes       limit,
     478                              FT_Byte*       min,
     479                              FT_Byte*       max,
     480                              GXV_Validator  gxvalid );
     481  
     482    FT_LOCAL( void )
     483    gxv_array_getlimits_ushort( FT_Bytes       table,
     484                                FT_Bytes       limit,
     485                                FT_UShort*     min,
     486                                FT_UShort*     max,
     487                                GXV_Validator  gxvalid );
     488  
     489    FT_LOCAL( void )
     490    gxv_set_length_by_ushort_offset( FT_UShort*     offset,
     491                                     FT_UShort**    length,
     492                                     FT_UShort*     buff,
     493                                     FT_UInt        nmemb,
     494                                     FT_UShort      limit,
     495                                     GXV_Validator  gxvalid );
     496  
     497    FT_LOCAL( void )
     498    gxv_set_length_by_ulong_offset( FT_ULong*      offset,
     499                                    FT_ULong**     length,
     500                                    FT_ULong*      buff,
     501                                    FT_UInt        nmemb,
     502                                    FT_ULong       limit,
     503                                    GXV_Validator  gxvalid);
     504  
     505  
     506  #define GXV_SUBTABLE_OFFSET_CHECK( _offset )          \
     507            FT_BEGIN_STMNT                              \
     508              if ( (_offset) > gxvalid->subtable_length ) \
     509                FT_INVALID_OFFSET;                      \
     510            FT_END_STMNT
     511  
     512  #define GXV_SUBTABLE_LIMIT_CHECK( _count )                  \
     513            FT_BEGIN_STMNT                                    \
     514              if ( ( p + (_count) - gxvalid->subtable_start ) > \
     515                     gxvalid->subtable_length )                 \
     516                FT_INVALID_TOO_SHORT;                         \
     517            FT_END_STMNT
     518  
     519  #define GXV_USHORT_TO_SHORT( _us )                                    \
     520            ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
     521  
     522  #define GXV_STATETABLE_HEADER_SIZE  ( 2 + 2 + 2 + 2 )
     523  #define GXV_STATEHEADER_SIZE        GXV_STATETABLE_HEADER_SIZE
     524  
     525  #define GXV_XSTATETABLE_HEADER_SIZE  ( 4 + 4 + 4 + 4 )
     526  #define GXV_XSTATEHEADER_SIZE        GXV_XSTATETABLE_HEADER_SIZE
     527  
     528  
     529    /*************************************************************************/
     530    /*************************************************************************/
     531    /*****                                                               *****/
     532    /*****                        Table overlapping                      *****/
     533    /*****                                                               *****/
     534    /*************************************************************************/
     535    /*************************************************************************/
     536  
     537    typedef struct  GXV_odtect_DataRec_
     538    {
     539      FT_Bytes    start;
     540      FT_ULong    length;
     541      FT_String*  name;
     542  
     543    } GXV_odtect_DataRec,  *GXV_odtect_Data;
     544  
     545    typedef struct  GXV_odtect_RangeRec_
     546    {
     547      FT_UInt          nRanges;
     548      GXV_odtect_Data  range;
     549  
     550    } GXV_odtect_RangeRec, *GXV_odtect_Range;
     551  
     552  
     553    FT_LOCAL( void )
     554    gxv_odtect_add_range( FT_Bytes          start,
     555                          FT_ULong          length,
     556                          const FT_String*  name,
     557                          GXV_odtect_Range  odtect );
     558  
     559    FT_LOCAL( void )
     560    gxv_odtect_validate( GXV_odtect_Range  odtect,
     561                         GXV_Validator     gxvalid );
     562  
     563  
     564  #define GXV_ODTECT( n, odtect )                              \
     565            GXV_odtect_DataRec   odtect ## _range[n];          \
     566            GXV_odtect_RangeRec  odtect ## _rec = { 0, NULL }; \
     567            GXV_odtect_Range     odtect = NULL
     568  
     569  #define GXV_ODTECT_INIT( odtect )                      \
     570            FT_BEGIN_STMNT                               \
     571              odtect ## _rec.nRanges = 0;                \
     572              odtect ## _rec.range   = odtect ## _range; \
     573              odtect                 = & odtect ## _rec; \
     574            FT_END_STMNT
     575  
     576  
     577   /* */
     578  
     579  FT_END_HEADER
     580  
     581  #endif /* GXVCOMMN_H_ */
     582  
     583  
     584  /* END */