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