(root)/
freetype-2.13.2/
src/
otvalid/
otvcommn.h
       1  /****************************************************************************
       2   *
       3   * otvcommn.h
       4   *
       5   *   OpenType common tables validation (specification).
       6   *
       7   * Copyright (C) 2004-2023 by
       8   * David Turner, Robert Wilhelm, and Werner Lemberg.
       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 OTVCOMMN_H_
      20  #define OTVCOMMN_H_
      21  
      22  
      23  #include "otvalid.h"
      24  #include <freetype/internal/ftdebug.h>
      25  
      26  
      27  FT_BEGIN_HEADER
      28  
      29  
      30    /*************************************************************************/
      31    /*************************************************************************/
      32    /*****                                                               *****/
      33    /*****                         VALIDATION                            *****/
      34    /*****                                                               *****/
      35    /*************************************************************************/
      36    /*************************************************************************/
      37  
      38    typedef struct OTV_ValidatorRec_*  OTV_Validator;
      39  
      40    typedef void  (*OTV_Validate_Func)( FT_Bytes       table,
      41                                        OTV_Validator  otvalid );
      42  
      43    typedef struct  OTV_ValidatorRec_
      44    {
      45      FT_Validator        root;
      46      FT_UInt             type_count;
      47      OTV_Validate_Func*  type_funcs;
      48  
      49      FT_UInt             lookup_count;
      50      FT_UInt             glyph_count;
      51  
      52      FT_UInt             nesting_level;
      53  
      54      OTV_Validate_Func   func[3];
      55  
      56      FT_UInt             extra1;     /* for passing parameters */
      57      FT_UInt             extra2;
      58      FT_Bytes            extra3;
      59  
      60  #ifdef FT_DEBUG_LEVEL_TRACE
      61      FT_UInt             debug_indent;
      62      const FT_String*    debug_function_name[3];
      63  #endif
      64  
      65    } OTV_ValidatorRec;
      66  
      67  
      68  #undef  FT_INVALID_
      69  #define FT_INVALID_( _error )                                     \
      70            ft_validator_error( otvalid->root, FT_THROW( _error ) )
      71  
      72  #define OTV_OPTIONAL_TABLE( _table )  FT_UShort  _table;      \
      73                                        FT_Bytes   _table ## _p
      74  
      75  #define OTV_OPTIONAL_TABLE32( _table )  FT_ULong  _table;       \
      76                                          FT_Bytes   _table ## _p
      77  
      78  #define OTV_OPTIONAL_OFFSET( _offset )           \
      79            FT_BEGIN_STMNT                         \
      80              _offset ## _p = p;                   \
      81              _offset       = FT_NEXT_USHORT( p ); \
      82            FT_END_STMNT
      83  
      84  #define OTV_OPTIONAL_OFFSET32( _offset )        \
      85            FT_BEGIN_STMNT                        \
      86              _offset ## _p = p;                  \
      87              _offset       = FT_NEXT_ULONG( p ); \
      88            FT_END_STMNT
      89  
      90  #define OTV_LIMIT_CHECK( _count )                      \
      91            FT_BEGIN_STMNT                               \
      92              if ( p + (_count) > otvalid->root->limit ) \
      93                FT_INVALID_TOO_SHORT;                    \
      94            FT_END_STMNT
      95  
      96  #define OTV_SIZE_CHECK( _size )                                     \
      97            FT_BEGIN_STMNT                                            \
      98              if ( _size > 0 && _size < table_size )                  \
      99              {                                                       \
     100                if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
     101                  FT_INVALID_OFFSET;                                  \
     102                else                                                  \
     103                {                                                     \
     104                  /* strip off `const' */                             \
     105                  FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
     106                                                                      \
     107                                                                      \
     108                  FT_TRACE3(( "\n" ));                                \
     109                  FT_TRACE3(( "Invalid offset to optional table `%s'" \
     110                              " set to zero.\n",                      \
     111                              #_size ));                              \
     112                  FT_TRACE3(( "\n" ));                                \
     113                                                                      \
     114                  _size = pp[0] = pp[1] = 0;                          \
     115                }                                                     \
     116              }                                                       \
     117            FT_END_STMNT
     118  
     119  #define OTV_SIZE_CHECK32( _size )                                   \
     120            FT_BEGIN_STMNT                                            \
     121              if ( _size > 0 && _size < table_size )                  \
     122              {                                                       \
     123                if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
     124                  FT_INVALID_OFFSET;                                  \
     125                else                                                  \
     126                {                                                     \
     127                  /* strip off `const' */                             \
     128                  FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
     129                                                                      \
     130                                                                      \
     131                  FT_TRACE3(( "\n" ));                                \
     132                  FT_TRACE3(( "Invalid offset to optional table `%s'" \
     133                              " set to zero.\n",                      \
     134                              #_size ));                              \
     135                  FT_TRACE3(( "\n" ));                                \
     136                                                                      \
     137                  _size = pp[0] = pp[1] = pp[2] = pp[3] = 0;          \
     138                }                                                     \
     139              }                                                       \
     140            FT_END_STMNT
     141  
     142  
     143  #define  OTV_NAME_(x)  #x
     144  #define  OTV_NAME(x)   OTV_NAME_(x)
     145  
     146  #define  OTV_FUNC_(x)  x##Func
     147  #define  OTV_FUNC(x)   OTV_FUNC_(x)
     148  
     149  #ifdef FT_DEBUG_LEVEL_TRACE
     150  
     151  #define OTV_NEST1( x )                                       \
     152            FT_BEGIN_STMNT                                     \
     153              otvalid->nesting_level          = 0;             \
     154              otvalid->func[0]                = OTV_FUNC( x ); \
     155              otvalid->debug_function_name[0] = OTV_NAME( x ); \
     156            FT_END_STMNT
     157  
     158  #define OTV_NEST2( x, y )                                    \
     159            FT_BEGIN_STMNT                                     \
     160              otvalid->nesting_level          = 0;             \
     161              otvalid->func[0]                = OTV_FUNC( x ); \
     162              otvalid->func[1]                = OTV_FUNC( y ); \
     163              otvalid->debug_function_name[0] = OTV_NAME( x ); \
     164              otvalid->debug_function_name[1] = OTV_NAME( y ); \
     165            FT_END_STMNT
     166  
     167  #define OTV_NEST3( x, y, z )                                 \
     168            FT_BEGIN_STMNT                                     \
     169              otvalid->nesting_level          = 0;             \
     170              otvalid->func[0]                = OTV_FUNC( x ); \
     171              otvalid->func[1]                = OTV_FUNC( y ); \
     172              otvalid->func[2]                = OTV_FUNC( z ); \
     173              otvalid->debug_function_name[0] = OTV_NAME( x ); \
     174              otvalid->debug_function_name[1] = OTV_NAME( y ); \
     175              otvalid->debug_function_name[2] = OTV_NAME( z ); \
     176            FT_END_STMNT
     177  
     178  #define OTV_INIT  otvalid->debug_indent = 0
     179  
     180  #define OTV_ENTER                                                                \
     181            FT_BEGIN_STMNT                                                         \
     182              otvalid->debug_indent += 2;                                          \
     183              FT_TRACE4(( "%*.s", otvalid->debug_indent, "" ));                    \
     184              FT_TRACE4(( "%s table\n",                                            \
     185                          otvalid->debug_function_name[otvalid->nesting_level] )); \
     186            FT_END_STMNT
     187  
     188  #define OTV_NAME_ENTER( name )                                \
     189            FT_BEGIN_STMNT                                      \
     190              otvalid->debug_indent += 2;                       \
     191              FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \
     192              FT_TRACE4(( "%s table\n", name ));                \
     193            FT_END_STMNT
     194  
     195  #define OTV_EXIT  otvalid->debug_indent -= 2
     196  
     197  #define OTV_TRACE( s )                                        \
     198            FT_BEGIN_STMNT                                      \
     199              FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \
     200              FT_TRACE4( s );                                   \
     201            FT_END_STMNT
     202  
     203  #else   /* !FT_DEBUG_LEVEL_TRACE */
     204  
     205  #define OTV_NEST1( x )                              \
     206            FT_BEGIN_STMNT                            \
     207              otvalid->nesting_level = 0;             \
     208              otvalid->func[0]       = OTV_FUNC( x ); \
     209            FT_END_STMNT
     210  
     211  #define OTV_NEST2( x, y )                           \
     212            FT_BEGIN_STMNT                            \
     213              otvalid->nesting_level = 0;             \
     214              otvalid->func[0]       = OTV_FUNC( x ); \
     215              otvalid->func[1]       = OTV_FUNC( y ); \
     216            FT_END_STMNT
     217  
     218  #define OTV_NEST3( x, y, z )                        \
     219            FT_BEGIN_STMNT                            \
     220              otvalid->nesting_level = 0;             \
     221              otvalid->func[0]       = OTV_FUNC( x ); \
     222              otvalid->func[1]       = OTV_FUNC( y ); \
     223              otvalid->func[2]       = OTV_FUNC( z ); \
     224            FT_END_STMNT
     225  
     226  #define OTV_INIT                do { } while ( 0 )
     227  #define OTV_ENTER               do { } while ( 0 )
     228  #define OTV_NAME_ENTER( name )  do { } while ( 0 )
     229  #define OTV_EXIT                do { } while ( 0 )
     230  
     231  #define OTV_TRACE( s )          do { } while ( 0 )
     232  
     233  #endif  /* !FT_DEBUG_LEVEL_TRACE */
     234  
     235  
     236  #define OTV_RUN  otvalid->func[0]
     237  
     238  
     239    /*************************************************************************/
     240    /*************************************************************************/
     241    /*****                                                               *****/
     242    /*****                       COVERAGE TABLE                          *****/
     243    /*****                                                               *****/
     244    /*************************************************************************/
     245    /*************************************************************************/
     246  
     247    FT_LOCAL( void )
     248    otv_Coverage_validate( FT_Bytes       table,
     249                           OTV_Validator  otvalid,
     250                           FT_Int         expected_count );
     251  
     252    /* return first covered glyph */
     253    FT_LOCAL( FT_UInt )
     254    otv_Coverage_get_first( FT_Bytes  table );
     255  
     256    /* return last covered glyph */
     257    FT_LOCAL( FT_UInt )
     258    otv_Coverage_get_last( FT_Bytes  table );
     259  
     260    /* return number of covered glyphs */
     261    FT_LOCAL( FT_UInt )
     262    otv_Coverage_get_count( FT_Bytes  table );
     263  
     264  
     265    /*************************************************************************/
     266    /*************************************************************************/
     267    /*****                                                               *****/
     268    /*****                  CLASS DEFINITION TABLE                       *****/
     269    /*****                                                               *****/
     270    /*************************************************************************/
     271    /*************************************************************************/
     272  
     273    FT_LOCAL( void )
     274    otv_ClassDef_validate( FT_Bytes       table,
     275                           OTV_Validator  otvalid );
     276  
     277  
     278    /*************************************************************************/
     279    /*************************************************************************/
     280    /*****                                                               *****/
     281    /*****                      DEVICE TABLE                             *****/
     282    /*****                                                               *****/
     283    /*************************************************************************/
     284    /*************************************************************************/
     285  
     286    FT_LOCAL( void )
     287    otv_Device_validate( FT_Bytes       table,
     288                         OTV_Validator  otvalid );
     289  
     290  
     291    /*************************************************************************/
     292    /*************************************************************************/
     293    /*****                                                               *****/
     294    /*****                           LOOKUPS                             *****/
     295    /*****                                                               *****/
     296    /*************************************************************************/
     297    /*************************************************************************/
     298  
     299    FT_LOCAL( void )
     300    otv_Lookup_validate( FT_Bytes       table,
     301                         OTV_Validator  otvalid );
     302  
     303    FT_LOCAL( void )
     304    otv_LookupList_validate( FT_Bytes       table,
     305                             OTV_Validator  otvalid );
     306  
     307  
     308    /*************************************************************************/
     309    /*************************************************************************/
     310    /*****                                                               *****/
     311    /*****                        FEATURES                               *****/
     312    /*****                                                               *****/
     313    /*************************************************************************/
     314    /*************************************************************************/
     315  
     316    FT_LOCAL( void )
     317    otv_Feature_validate( FT_Bytes       table,
     318                          OTV_Validator  otvalid );
     319  
     320    /* lookups must already be validated */
     321    FT_LOCAL( void )
     322    otv_FeatureList_validate( FT_Bytes       table,
     323                              FT_Bytes       lookups,
     324                              OTV_Validator  otvalid );
     325  
     326  
     327    /*************************************************************************/
     328    /*************************************************************************/
     329    /*****                                                               *****/
     330    /*****                       LANGUAGE SYSTEM                         *****/
     331    /*****                                                               *****/
     332    /*************************************************************************/
     333    /*************************************************************************/
     334  
     335    FT_LOCAL( void )
     336    otv_LangSys_validate( FT_Bytes       table,
     337                          OTV_Validator  otvalid );
     338  
     339  
     340    /*************************************************************************/
     341    /*************************************************************************/
     342    /*****                                                               *****/
     343    /*****                           SCRIPTS                             *****/
     344    /*****                                                               *****/
     345    /*************************************************************************/
     346    /*************************************************************************/
     347  
     348    FT_LOCAL( void )
     349    otv_Script_validate( FT_Bytes       table,
     350                         OTV_Validator  otvalid );
     351  
     352    /* features must already be validated */
     353    FT_LOCAL( void )
     354    otv_ScriptList_validate( FT_Bytes       table,
     355                             FT_Bytes       features,
     356                             OTV_Validator  otvalid );
     357  
     358  
     359    /*************************************************************************/
     360    /*************************************************************************/
     361    /*****                                                               *****/
     362    /*****                      UTILITY FUNCTIONS                        *****/
     363    /*****                                                               *****/
     364    /*************************************************************************/
     365    /*************************************************************************/
     366  
     367  #define ChainPosClassSetFunc  otv_x_Ox
     368  #define ChainPosRuleSetFunc   otv_x_Ox
     369  #define ChainSubClassSetFunc  otv_x_Ox
     370  #define ChainSubRuleSetFunc   otv_x_Ox
     371  #define JstfLangSysFunc       otv_x_Ox
     372  #define JstfMaxFunc           otv_x_Ox
     373  #define LigGlyphFunc          otv_x_Ox
     374  #define LigatureArrayFunc     otv_x_Ox
     375  #define LigatureSetFunc       otv_x_Ox
     376  #define PosClassSetFunc       otv_x_Ox
     377  #define PosRuleSetFunc        otv_x_Ox
     378  #define SubClassSetFunc       otv_x_Ox
     379  #define SubRuleSetFunc        otv_x_Ox
     380  
     381    FT_LOCAL( void )
     382    otv_x_Ox ( FT_Bytes       table,
     383               OTV_Validator  otvalid );
     384  
     385  #define AlternateSubstFormat1Func     otv_u_C_x_Ox
     386  #define ChainContextPosFormat1Func    otv_u_C_x_Ox
     387  #define ChainContextSubstFormat1Func  otv_u_C_x_Ox
     388  #define ContextPosFormat1Func         otv_u_C_x_Ox
     389  #define ContextSubstFormat1Func       otv_u_C_x_Ox
     390  #define LigatureSubstFormat1Func      otv_u_C_x_Ox
     391  #define MultipleSubstFormat1Func      otv_u_C_x_Ox
     392  
     393    FT_LOCAL( void )
     394    otv_u_C_x_Ox( FT_Bytes       table,
     395                  OTV_Validator  otvalid );
     396  
     397  #define AlternateSetFunc     otv_x_ux
     398  #define AttachPointFunc      otv_x_ux
     399  #define ExtenderGlyphFunc    otv_x_ux
     400  #define JstfGPOSModListFunc  otv_x_ux
     401  #define JstfGSUBModListFunc  otv_x_ux
     402  #define SequenceFunc         otv_x_ux
     403  
     404    FT_LOCAL( void )
     405    otv_x_ux( FT_Bytes       table,
     406              OTV_Validator  otvalid );
     407  
     408  #define PosClassRuleFunc  otv_x_y_ux_sy
     409  #define PosRuleFunc       otv_x_y_ux_sy
     410  #define SubClassRuleFunc  otv_x_y_ux_sy
     411  #define SubRuleFunc       otv_x_y_ux_sy
     412  
     413    FT_LOCAL( void )
     414    otv_x_y_ux_sy( FT_Bytes       table,
     415                   OTV_Validator  otvalid );
     416  
     417  #define ChainPosClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
     418  #define ChainPosRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
     419  #define ChainSubClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
     420  #define ChainSubRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
     421  
     422    FT_LOCAL( void )
     423    otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,
     424                             OTV_Validator  otvalid );
     425  
     426  #define ContextPosFormat2Func    otv_u_O_O_x_Onx
     427  #define ContextSubstFormat2Func  otv_u_O_O_x_Onx
     428  
     429    FT_LOCAL( void )
     430    otv_u_O_O_x_Onx( FT_Bytes       table,
     431                     OTV_Validator  otvalid );
     432  
     433  #define ContextPosFormat3Func    otv_u_x_y_Ox_sy
     434  #define ContextSubstFormat3Func  otv_u_x_y_Ox_sy
     435  
     436    FT_LOCAL( void )
     437    otv_u_x_y_Ox_sy( FT_Bytes       table,
     438                     OTV_Validator  otvalid );
     439  
     440  #define ChainContextPosFormat2Func    otv_u_O_O_O_O_x_Onx
     441  #define ChainContextSubstFormat2Func  otv_u_O_O_O_O_x_Onx
     442  
     443    FT_LOCAL( void )
     444    otv_u_O_O_O_O_x_Onx( FT_Bytes       table,
     445                         OTV_Validator  otvalid );
     446  
     447  #define ChainContextPosFormat3Func    otv_u_x_Ox_y_Oy_z_Oz_p_sp
     448  #define ChainContextSubstFormat3Func  otv_u_x_Ox_y_Oy_z_Oz_p_sp
     449  
     450    FT_LOCAL( void )
     451    otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,
     452                               OTV_Validator  otvalid );
     453  
     454  
     455    FT_LOCAL( FT_UInt )
     456    otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table );
     457  
     458    FT_LOCAL( FT_UInt )
     459    otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table );
     460  
     461   /* */
     462  
     463  FT_END_HEADER
     464  
     465  #endif /* OTVCOMMN_H_ */
     466  
     467  
     468  /* END */