Home | History | Annotate | Download | only in otvalid
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  otvcommn.h                                                             */
      4 /*                                                                         */
      5 /*    OpenType common tables validation (specification).                   */
      6 /*                                                                         */
      7 /*  Copyright 2004-2015 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_OFFSET( _offset )           \
     77           FT_BEGIN_STMNT                         \
     78             _offset ## _p = p;                   \
     79             _offset       = FT_NEXT_USHORT( p ); \
     80           FT_END_STMNT
     81 
     82 #define OTV_LIMIT_CHECK( _count )                    \
     83           FT_BEGIN_STMNT                             \
     84             if ( p + (_count) > otvalid->root->limit ) \
     85               FT_INVALID_TOO_SHORT;                  \
     86           FT_END_STMNT
     87 
     88 #define OTV_SIZE_CHECK( _size )                                     \
     89           FT_BEGIN_STMNT                                            \
     90             if ( _size > 0 && _size < table_size )                  \
     91             {                                                       \
     92               if ( otvalid->root->level == FT_VALIDATE_PARANOID )     \
     93                 FT_INVALID_OFFSET;                                  \
     94               else                                                  \
     95               {                                                     \
     96                 /* strip off `const' */                             \
     97                 FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
     98                                                                     \
     99                                                                     \
    100                 FT_TRACE3(( "\n"                                    \
    101                             "Invalid offset to optional table `%s'" \
    102                             " set to zero.\n"                       \
    103                             "\n", #_size ));                        \
    104                                                                     \
    105                 /* always assume 16bit entities */                  \
    106                 _size = pp[0] = pp[1] = 0;                          \
    107               }                                                     \
    108             }                                                       \
    109           FT_END_STMNT
    110 
    111 
    112 #define  OTV_NAME_(x)  #x
    113 #define  OTV_NAME(x)   OTV_NAME_(x)
    114 
    115 #define  OTV_FUNC_(x)  x##Func
    116 #define  OTV_FUNC(x)   OTV_FUNC_(x)
    117 
    118 #ifdef FT_DEBUG_LEVEL_TRACE
    119 
    120 #define OTV_NEST1( x )                                       \
    121           FT_BEGIN_STMNT                                     \
    122             otvalid->nesting_level          = 0;             \
    123             otvalid->func[0]                = OTV_FUNC( x ); \
    124             otvalid->debug_function_name[0] = OTV_NAME( x ); \
    125           FT_END_STMNT
    126 
    127 #define OTV_NEST2( x, y )                                    \
    128           FT_BEGIN_STMNT                                     \
    129             otvalid->nesting_level          = 0;             \
    130             otvalid->func[0]                = OTV_FUNC( x ); \
    131             otvalid->func[1]                = OTV_FUNC( y ); \
    132             otvalid->debug_function_name[0] = OTV_NAME( x ); \
    133             otvalid->debug_function_name[1] = OTV_NAME( y ); \
    134           FT_END_STMNT
    135 
    136 #define OTV_NEST3( x, y, z )                                 \
    137           FT_BEGIN_STMNT                                     \
    138             otvalid->nesting_level          = 0;             \
    139             otvalid->func[0]                = OTV_FUNC( x ); \
    140             otvalid->func[1]                = OTV_FUNC( y ); \
    141             otvalid->func[2]                = OTV_FUNC( z ); \
    142             otvalid->debug_function_name[0] = OTV_NAME( x ); \
    143             otvalid->debug_function_name[1] = OTV_NAME( y ); \
    144             otvalid->debug_function_name[2] = OTV_NAME( z ); \
    145           FT_END_STMNT
    146 
    147 #define OTV_INIT  otvalid->debug_indent = 0
    148 
    149 #define OTV_ENTER                                                              \
    150           FT_BEGIN_STMNT                                                       \
    151             otvalid->debug_indent += 2;                                        \
    152             FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 ));                   \
    153             FT_TRACE4(( "%s table\n",                                          \
    154                         otvalid->debug_function_name[otvalid->nesting_level] )); \
    155           FT_END_STMNT
    156 
    157 #define OTV_NAME_ENTER( name )                               \
    158           FT_BEGIN_STMNT                                     \
    159             otvalid->debug_indent += 2;                      \
    160             FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 )); \
    161             FT_TRACE4(( "%s table\n", name ));               \
    162           FT_END_STMNT
    163 
    164 #define OTV_EXIT  otvalid->debug_indent -= 2
    165 
    166 #define OTV_TRACE( s )                                       \
    167           FT_BEGIN_STMNT                                     \
    168             FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 )); \
    169             FT_TRACE4( s );                                  \
    170           FT_END_STMNT
    171 
    172 #else   /* !FT_DEBUG_LEVEL_TRACE */
    173 
    174 #define OTV_NEST1( x )                              \
    175           FT_BEGIN_STMNT                            \
    176             otvalid->nesting_level = 0;             \
    177             otvalid->func[0]       = OTV_FUNC( x ); \
    178           FT_END_STMNT
    179 
    180 #define OTV_NEST2( x, y )                           \
    181           FT_BEGIN_STMNT                            \
    182             otvalid->nesting_level = 0;             \
    183             otvalid->func[0]       = OTV_FUNC( x ); \
    184             otvalid->func[1]       = OTV_FUNC( y ); \
    185           FT_END_STMNT
    186 
    187 #define OTV_NEST3( x, y, z )                        \
    188           FT_BEGIN_STMNT                            \
    189             otvalid->nesting_level = 0;             \
    190             otvalid->func[0]       = OTV_FUNC( x ); \
    191             otvalid->func[1]       = OTV_FUNC( y ); \
    192             otvalid->func[2]       = OTV_FUNC( z ); \
    193           FT_END_STMNT
    194 
    195 #define OTV_INIT                do { } while ( 0 )
    196 #define OTV_ENTER               do { } while ( 0 )
    197 #define OTV_NAME_ENTER( name )  do { } while ( 0 )
    198 #define OTV_EXIT                do { } while ( 0 )
    199 
    200 #define OTV_TRACE( s )          do { } while ( 0 )
    201 
    202 #endif  /* !FT_DEBUG_LEVEL_TRACE */
    203 
    204 
    205 #define OTV_RUN  otvalid->func[0]
    206 
    207 
    208   /*************************************************************************/
    209   /*************************************************************************/
    210   /*****                                                               *****/
    211   /*****                       COVERAGE TABLE                          *****/
    212   /*****                                                               *****/
    213   /*************************************************************************/
    214   /*************************************************************************/
    215 
    216   FT_LOCAL( void )
    217   otv_Coverage_validate( FT_Bytes       table,
    218                          OTV_Validator  otvalid,
    219                          FT_Int         expected_count );
    220 
    221   /* return first covered glyph */
    222   FT_LOCAL( FT_UInt )
    223   otv_Coverage_get_first( FT_Bytes  table );
    224 
    225   /* return last covered glyph */
    226   FT_LOCAL( FT_UInt )
    227   otv_Coverage_get_last( FT_Bytes  table );
    228 
    229   /* return number of covered glyphs */
    230   FT_LOCAL( FT_UInt )
    231   otv_Coverage_get_count( FT_Bytes  table );
    232 
    233 
    234   /*************************************************************************/
    235   /*************************************************************************/
    236   /*****                                                               *****/
    237   /*****                  CLASS DEFINITION TABLE                       *****/
    238   /*****                                                               *****/
    239   /*************************************************************************/
    240   /*************************************************************************/
    241 
    242   FT_LOCAL( void )
    243   otv_ClassDef_validate( FT_Bytes       table,
    244                          OTV_Validator  otvalid );
    245 
    246 
    247   /*************************************************************************/
    248   /*************************************************************************/
    249   /*****                                                               *****/
    250   /*****                      DEVICE TABLE                             *****/
    251   /*****                                                               *****/
    252   /*************************************************************************/
    253   /*************************************************************************/
    254 
    255   FT_LOCAL( void )
    256   otv_Device_validate( FT_Bytes       table,
    257                        OTV_Validator  otvalid );
    258 
    259 
    260   /*************************************************************************/
    261   /*************************************************************************/
    262   /*****                                                               *****/
    263   /*****                           LOOKUPS                             *****/
    264   /*****                                                               *****/
    265   /*************************************************************************/
    266   /*************************************************************************/
    267 
    268   FT_LOCAL( void )
    269   otv_Lookup_validate( FT_Bytes       table,
    270                        OTV_Validator  otvalid );
    271 
    272   FT_LOCAL( void )
    273   otv_LookupList_validate( FT_Bytes       table,
    274                            OTV_Validator  otvalid );
    275 
    276 
    277   /*************************************************************************/
    278   /*************************************************************************/
    279   /*****                                                               *****/
    280   /*****                        FEATURES                               *****/
    281   /*****                                                               *****/
    282   /*************************************************************************/
    283   /*************************************************************************/
    284 
    285   FT_LOCAL( void )
    286   otv_Feature_validate( FT_Bytes       table,
    287                         OTV_Validator  otvalid );
    288 
    289   /* lookups must already be validated */
    290   FT_LOCAL( void )
    291   otv_FeatureList_validate( FT_Bytes       table,
    292                             FT_Bytes       lookups,
    293                             OTV_Validator  otvalid );
    294 
    295 
    296   /*************************************************************************/
    297   /*************************************************************************/
    298   /*****                                                               *****/
    299   /*****                       LANGUAGE SYSTEM                         *****/
    300   /*****                                                               *****/
    301   /*************************************************************************/
    302   /*************************************************************************/
    303 
    304   FT_LOCAL( void )
    305   otv_LangSys_validate( FT_Bytes       table,
    306                         OTV_Validator  otvalid );
    307 
    308 
    309   /*************************************************************************/
    310   /*************************************************************************/
    311   /*****                                                               *****/
    312   /*****                           SCRIPTS                             *****/
    313   /*****                                                               *****/
    314   /*************************************************************************/
    315   /*************************************************************************/
    316 
    317   FT_LOCAL( void )
    318   otv_Script_validate( FT_Bytes       table,
    319                        OTV_Validator  otvalid );
    320 
    321   /* features must already be validated */
    322   FT_LOCAL( void )
    323   otv_ScriptList_validate( FT_Bytes       table,
    324                            FT_Bytes       features,
    325                            OTV_Validator  otvalid );
    326 
    327 
    328   /*************************************************************************/
    329   /*************************************************************************/
    330   /*****                                                               *****/
    331   /*****                      UTILITY FUNCTIONS                        *****/
    332   /*****                                                               *****/
    333   /*************************************************************************/
    334   /*************************************************************************/
    335 
    336 #define ChainPosClassSetFunc  otv_x_Ox
    337 #define ChainPosRuleSetFunc   otv_x_Ox
    338 #define ChainSubClassSetFunc  otv_x_Ox
    339 #define ChainSubRuleSetFunc   otv_x_Ox
    340 #define JstfLangSysFunc       otv_x_Ox
    341 #define JstfMaxFunc           otv_x_Ox
    342 #define LigGlyphFunc          otv_x_Ox
    343 #define LigatureArrayFunc     otv_x_Ox
    344 #define LigatureSetFunc       otv_x_Ox
    345 #define PosClassSetFunc       otv_x_Ox
    346 #define PosRuleSetFunc        otv_x_Ox
    347 #define SubClassSetFunc       otv_x_Ox
    348 #define SubRuleSetFunc        otv_x_Ox
    349 
    350   FT_LOCAL( void )
    351   otv_x_Ox ( FT_Bytes       table,
    352              OTV_Validator  otvalid );
    353 
    354 #define AlternateSubstFormat1Func     otv_u_C_x_Ox
    355 #define ChainContextPosFormat1Func    otv_u_C_x_Ox
    356 #define ChainContextSubstFormat1Func  otv_u_C_x_Ox
    357 #define ContextPosFormat1Func         otv_u_C_x_Ox
    358 #define ContextSubstFormat1Func       otv_u_C_x_Ox
    359 #define LigatureSubstFormat1Func      otv_u_C_x_Ox
    360 #define MultipleSubstFormat1Func      otv_u_C_x_Ox
    361 
    362   FT_LOCAL( void )
    363   otv_u_C_x_Ox( FT_Bytes       table,
    364                 OTV_Validator  otvalid );
    365 
    366 #define AlternateSetFunc     otv_x_ux
    367 #define AttachPointFunc      otv_x_ux
    368 #define ExtenderGlyphFunc    otv_x_ux
    369 #define JstfGPOSModListFunc  otv_x_ux
    370 #define JstfGSUBModListFunc  otv_x_ux
    371 #define SequenceFunc         otv_x_ux
    372 
    373   FT_LOCAL( void )
    374   otv_x_ux( FT_Bytes       table,
    375             OTV_Validator  otvalid );
    376 
    377 #define PosClassRuleFunc  otv_x_y_ux_sy
    378 #define PosRuleFunc       otv_x_y_ux_sy
    379 #define SubClassRuleFunc  otv_x_y_ux_sy
    380 #define SubRuleFunc       otv_x_y_ux_sy
    381 
    382   FT_LOCAL( void )
    383   otv_x_y_ux_sy( FT_Bytes       table,
    384                  OTV_Validator  otvalid );
    385 
    386 #define ChainPosClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
    387 #define ChainPosRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
    388 #define ChainSubClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
    389 #define ChainSubRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
    390 
    391   FT_LOCAL( void )
    392   otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,
    393                            OTV_Validator  otvalid );
    394 
    395 #define ContextPosFormat2Func    otv_u_O_O_x_Onx
    396 #define ContextSubstFormat2Func  otv_u_O_O_x_Onx
    397 
    398   FT_LOCAL( void )
    399   otv_u_O_O_x_Onx( FT_Bytes       table,
    400                    OTV_Validator  otvalid );
    401 
    402 #define ContextPosFormat3Func    otv_u_x_y_Ox_sy
    403 #define ContextSubstFormat3Func  otv_u_x_y_Ox_sy
    404 
    405   FT_LOCAL( void )
    406   otv_u_x_y_Ox_sy( FT_Bytes       table,
    407                    OTV_Validator  otvalid );
    408 
    409 #define ChainContextPosFormat2Func    otv_u_O_O_O_O_x_Onx
    410 #define ChainContextSubstFormat2Func  otv_u_O_O_O_O_x_Onx
    411 
    412   FT_LOCAL( void )
    413   otv_u_O_O_O_O_x_Onx( FT_Bytes       table,
    414                        OTV_Validator  otvalid );
    415 
    416 #define ChainContextPosFormat3Func    otv_u_x_Ox_y_Oy_z_Oz_p_sp
    417 #define ChainContextSubstFormat3Func  otv_u_x_Ox_y_Oy_z_Oz_p_sp
    418 
    419   FT_LOCAL( void )
    420   otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,
    421                              OTV_Validator  otvalid );
    422 
    423 
    424   FT_LOCAL( FT_UInt )
    425   otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table );
    426 
    427   FT_LOCAL( FT_UInt )
    428   otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table );
    429 
    430  /* */
    431 
    432 FT_END_HEADER
    433 
    434 #endif /* __OTVCOMMN_H__ */
    435 
    436 
    437 /* END */
    438