misc/libfreetype/src/otvalid/otvcommn.h
changeset 5172 88f2e05288ba
equal deleted inserted replaced
5171:f9283dc4860d 5172:88f2e05288ba
       
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  otvcommn.h                                                             */
       
     4 /*                                                                         */
       
     5 /*    OpenType common tables validation (specification).                   */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2004, 2005, 2007, 2009 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  valid );
       
    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_( _prefix, _error )                         \
       
    71           ft_validator_error( valid->root, _prefix ## _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) > valid->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 ( valid->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             valid->nesting_level          = 0;             \
       
   123             valid->func[0]                = OTV_FUNC( x ); \
       
   124             valid->debug_function_name[0] = OTV_NAME( x ); \
       
   125           FT_END_STMNT
       
   126 
       
   127 #define OTV_NEST2( x, y )                                  \
       
   128           FT_BEGIN_STMNT                                   \
       
   129             valid->nesting_level          = 0;             \
       
   130             valid->func[0]                = OTV_FUNC( x ); \
       
   131             valid->func[1]                = OTV_FUNC( y ); \
       
   132             valid->debug_function_name[0] = OTV_NAME( x ); \
       
   133             valid->debug_function_name[1] = OTV_NAME( y ); \
       
   134           FT_END_STMNT
       
   135 
       
   136 #define OTV_NEST3( x, y, z )                               \
       
   137           FT_BEGIN_STMNT                                   \
       
   138             valid->nesting_level          = 0;             \
       
   139             valid->func[0]                = OTV_FUNC( x ); \
       
   140             valid->func[1]                = OTV_FUNC( y ); \
       
   141             valid->func[2]                = OTV_FUNC( z ); \
       
   142             valid->debug_function_name[0] = OTV_NAME( x ); \
       
   143             valid->debug_function_name[1] = OTV_NAME( y ); \
       
   144             valid->debug_function_name[2] = OTV_NAME( z ); \
       
   145           FT_END_STMNT
       
   146 
       
   147 #define OTV_INIT  valid->debug_indent = 0
       
   148 
       
   149 #define OTV_ENTER                                                            \
       
   150           FT_BEGIN_STMNT                                                     \
       
   151             valid->debug_indent += 2;                                        \
       
   152             FT_TRACE4(( "%*.s", valid->debug_indent, 0 ));                   \
       
   153             FT_TRACE4(( "%s table\n",                                        \
       
   154                         valid->debug_function_name[valid->nesting_level] )); \
       
   155           FT_END_STMNT
       
   156 
       
   157 #define OTV_NAME_ENTER( name )                             \
       
   158           FT_BEGIN_STMNT                                   \
       
   159             valid->debug_indent += 2;                      \
       
   160             FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
       
   161             FT_TRACE4(( "%s table\n", name ));             \
       
   162           FT_END_STMNT
       
   163 
       
   164 #define OTV_EXIT  valid->debug_indent -= 2
       
   165 
       
   166 #define OTV_TRACE( s )                                     \
       
   167           FT_BEGIN_STMNT                                   \
       
   168             FT_TRACE4(( "%*.s", valid->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             valid->nesting_level = 0;             \
       
   177             valid->func[0]       = OTV_FUNC( x ); \
       
   178           FT_END_STMNT
       
   179 
       
   180 #define OTV_NEST2( x, y )                         \
       
   181           FT_BEGIN_STMNT                          \
       
   182             valid->nesting_level = 0;             \
       
   183             valid->func[0]       = OTV_FUNC( x ); \
       
   184             valid->func[1]       = OTV_FUNC( y ); \
       
   185           FT_END_STMNT
       
   186 
       
   187 #define OTV_NEST3( x, y, z )                      \
       
   188           FT_BEGIN_STMNT                          \
       
   189             valid->nesting_level = 0;             \
       
   190             valid->func[0]       = OTV_FUNC( x ); \
       
   191             valid->func[1]       = OTV_FUNC( y ); \
       
   192             valid->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  valid->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  valid,
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   271 
       
   272   FT_LOCAL( void )
       
   273   otv_LookupList_validate( FT_Bytes       table,
       
   274                            OTV_Validator  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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  valid );
       
   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 */