00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __OTVCOMMN_H__
00020 #define __OTVCOMMN_H__
00021
00022
00023 #include <ft2build.h>
00024 #include "otvalid.h"
00025 #include FT_INTERNAL_DEBUG_H
00026
00027
00028 FT_BEGIN_HEADER
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 typedef struct OTV_ValidatorRec_* OTV_Validator;
00040
00041 typedef void (*OTV_Validate_Func)( FT_Bytes table,
00042 OTV_Validator valid );
00043
00044 typedef struct OTV_ValidatorRec_
00045 {
00046 FT_Validator root;
00047 FT_UInt type_count;
00048 OTV_Validate_Func* type_funcs;
00049
00050 FT_UInt lookup_count;
00051 FT_UInt glyph_count;
00052
00053 FT_UInt nesting_level;
00054
00055 OTV_Validate_Func func[3];
00056
00057 FT_UInt extra1;
00058 FT_UInt extra2;
00059 FT_Bytes extra3;
00060
00061 #ifdef FT_DEBUG_LEVEL_TRACE
00062 FT_UInt debug_indent;
00063 const FT_String* debug_function_name[3];
00064 #endif
00065
00066 } OTV_ValidatorRec;
00067
00068
00069 #undef FT_INVALID_
00070 #define FT_INVALID_( _prefix, _error ) \
00071 ft_validator_error( valid->root, _prefix ## _error )
00072
00073 #define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \
00074 FT_Bytes _table ## _p
00075
00076 #define OTV_OPTIONAL_OFFSET( _offset ) \
00077 FT_BEGIN_STMNT \
00078 _offset ## _p = p; \
00079 _offset = FT_NEXT_USHORT( p ); \
00080 FT_END_STMNT
00081
00082 #define OTV_LIMIT_CHECK( _count ) \
00083 FT_BEGIN_STMNT \
00084 if ( p + (_count) > valid->root->limit ) \
00085 FT_INVALID_TOO_SHORT; \
00086 FT_END_STMNT
00087
00088 #define OTV_SIZE_CHECK( _size ) \
00089 FT_BEGIN_STMNT \
00090 if ( _size > 0 && _size < table_size ) \
00091 { \
00092 if ( valid->root->level == FT_VALIDATE_PARANOID ) \
00093 FT_INVALID_OFFSET; \
00094 else \
00095 { \
00096 \
00097 FT_Byte* pp = (FT_Byte*)_size ## _p; \
00098 \
00099 \
00100 FT_TRACE3(( "\n" \
00101 "Invalid offset to optional table `%s'" \
00102 " set to zero.\n" \
00103 "\n", #_size )); \
00104 \
00105 \
00106 _size = pp[0] = pp[1] = 0; \
00107 } \
00108 } \
00109 FT_END_STMNT
00110
00111
00112 #define OTV_NAME_(x) #x
00113 #define OTV_NAME(x) OTV_NAME_(x)
00114
00115 #define OTV_FUNC_(x) x##Func
00116 #define OTV_FUNC(x) OTV_FUNC_(x)
00117
00118 #ifdef FT_DEBUG_LEVEL_TRACE
00119
00120 #define OTV_NEST1( x ) \
00121 FT_BEGIN_STMNT \
00122 valid->nesting_level = 0; \
00123 valid->func[0] = OTV_FUNC( x ); \
00124 valid->debug_function_name[0] = OTV_NAME( x ); \
00125 FT_END_STMNT
00126
00127 #define OTV_NEST2( x, y ) \
00128 FT_BEGIN_STMNT \
00129 valid->nesting_level = 0; \
00130 valid->func[0] = OTV_FUNC( x ); \
00131 valid->func[1] = OTV_FUNC( y ); \
00132 valid->debug_function_name[0] = OTV_NAME( x ); \
00133 valid->debug_function_name[1] = OTV_NAME( y ); \
00134 FT_END_STMNT
00135
00136 #define OTV_NEST3( x, y, z ) \
00137 FT_BEGIN_STMNT \
00138 valid->nesting_level = 0; \
00139 valid->func[0] = OTV_FUNC( x ); \
00140 valid->func[1] = OTV_FUNC( y ); \
00141 valid->func[2] = OTV_FUNC( z ); \
00142 valid->debug_function_name[0] = OTV_NAME( x ); \
00143 valid->debug_function_name[1] = OTV_NAME( y ); \
00144 valid->debug_function_name[2] = OTV_NAME( z ); \
00145 FT_END_STMNT
00146
00147 #define OTV_INIT valid->debug_indent = 0
00148
00149 #define OTV_ENTER \
00150 FT_BEGIN_STMNT \
00151 valid->debug_indent += 2; \
00152 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
00153 FT_TRACE4(( "%s table\n", \
00154 valid->debug_function_name[valid->nesting_level] )); \
00155 FT_END_STMNT
00156
00157 #define OTV_NAME_ENTER( name ) \
00158 FT_BEGIN_STMNT \
00159 valid->debug_indent += 2; \
00160 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
00161 FT_TRACE4(( "%s table\n", name )); \
00162 FT_END_STMNT
00163
00164 #define OTV_EXIT valid->debug_indent -= 2
00165
00166 #define OTV_TRACE( s ) \
00167 FT_BEGIN_STMNT \
00168 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
00169 FT_TRACE4( s ); \
00170 FT_END_STMNT
00171
00172 #else
00173
00174 #define OTV_NEST1( x ) \
00175 FT_BEGIN_STMNT \
00176 valid->nesting_level = 0; \
00177 valid->func[0] = OTV_FUNC( x ); \
00178 FT_END_STMNT
00179
00180 #define OTV_NEST2( x, y ) \
00181 FT_BEGIN_STMNT \
00182 valid->nesting_level = 0; \
00183 valid->func[0] = OTV_FUNC( x ); \
00184 valid->func[1] = OTV_FUNC( y ); \
00185 FT_END_STMNT
00186
00187 #define OTV_NEST3( x, y, z ) \
00188 FT_BEGIN_STMNT \
00189 valid->nesting_level = 0; \
00190 valid->func[0] = OTV_FUNC( x ); \
00191 valid->func[1] = OTV_FUNC( y ); \
00192 valid->func[2] = OTV_FUNC( z ); \
00193 FT_END_STMNT
00194
00195 #define OTV_INIT do { } while ( 0 )
00196 #define OTV_ENTER do { } while ( 0 )
00197 #define OTV_NAME_ENTER( name ) do { } while ( 0 )
00198 #define OTV_EXIT do { } while ( 0 )
00199
00200 #define OTV_TRACE( s ) do { } while ( 0 )
00201
00202 #endif
00203
00204
00205 #define OTV_RUN valid->func[0]
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 FT_LOCAL( void )
00217 otv_Coverage_validate( FT_Bytes table,
00218 OTV_Validator valid,
00219 FT_Int expected_count );
00220
00221
00222 FT_LOCAL( FT_UInt )
00223 otv_Coverage_get_first( FT_Bytes table );
00224
00225
00226 FT_LOCAL( FT_UInt )
00227 otv_Coverage_get_last( FT_Bytes table );
00228
00229
00230 FT_LOCAL( FT_UInt )
00231 otv_Coverage_get_count( FT_Bytes table );
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 FT_LOCAL( void )
00243 otv_ClassDef_validate( FT_Bytes table,
00244 OTV_Validator valid );
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 FT_LOCAL( void )
00256 otv_Device_validate( FT_Bytes table,
00257 OTV_Validator valid );
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 FT_LOCAL( void )
00269 otv_Lookup_validate( FT_Bytes table,
00270 OTV_Validator valid );
00271
00272 FT_LOCAL( void )
00273 otv_LookupList_validate( FT_Bytes table,
00274 OTV_Validator valid );
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 FT_LOCAL( void )
00286 otv_Feature_validate( FT_Bytes table,
00287 OTV_Validator valid );
00288
00289
00290 FT_LOCAL( void )
00291 otv_FeatureList_validate( FT_Bytes table,
00292 FT_Bytes lookups,
00293 OTV_Validator valid );
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 FT_LOCAL( void )
00305 otv_LangSys_validate( FT_Bytes table,
00306 OTV_Validator valid );
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 FT_LOCAL( void )
00318 otv_Script_validate( FT_Bytes table,
00319 OTV_Validator valid );
00320
00321
00322 FT_LOCAL( void )
00323 otv_ScriptList_validate( FT_Bytes table,
00324 FT_Bytes features,
00325 OTV_Validator valid );
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336 #define ChainPosClassSetFunc otv_x_Ox
00337 #define ChainPosRuleSetFunc otv_x_Ox
00338 #define ChainSubClassSetFunc otv_x_Ox
00339 #define ChainSubRuleSetFunc otv_x_Ox
00340 #define JstfLangSysFunc otv_x_Ox
00341 #define JstfMaxFunc otv_x_Ox
00342 #define LigGlyphFunc otv_x_Ox
00343 #define LigatureArrayFunc otv_x_Ox
00344 #define LigatureSetFunc otv_x_Ox
00345 #define PosClassSetFunc otv_x_Ox
00346 #define PosRuleSetFunc otv_x_Ox
00347 #define SubClassSetFunc otv_x_Ox
00348 #define SubRuleSetFunc otv_x_Ox
00349
00350 FT_LOCAL( void )
00351 otv_x_Ox ( FT_Bytes table,
00352 OTV_Validator valid );
00353
00354 #define AlternateSubstFormat1Func otv_u_C_x_Ox
00355 #define ChainContextPosFormat1Func otv_u_C_x_Ox
00356 #define ChainContextSubstFormat1Func otv_u_C_x_Ox
00357 #define ContextPosFormat1Func otv_u_C_x_Ox
00358 #define ContextSubstFormat1Func otv_u_C_x_Ox
00359 #define LigatureSubstFormat1Func otv_u_C_x_Ox
00360 #define MultipleSubstFormat1Func otv_u_C_x_Ox
00361
00362 FT_LOCAL( void )
00363 otv_u_C_x_Ox( FT_Bytes table,
00364 OTV_Validator valid );
00365
00366 #define AlternateSetFunc otv_x_ux
00367 #define AttachPointFunc otv_x_ux
00368 #define ExtenderGlyphFunc otv_x_ux
00369 #define JstfGPOSModListFunc otv_x_ux
00370 #define JstfGSUBModListFunc otv_x_ux
00371 #define SequenceFunc otv_x_ux
00372
00373 FT_LOCAL( void )
00374 otv_x_ux( FT_Bytes table,
00375 OTV_Validator valid );
00376
00377 #define PosClassRuleFunc otv_x_y_ux_sy
00378 #define PosRuleFunc otv_x_y_ux_sy
00379 #define SubClassRuleFunc otv_x_y_ux_sy
00380 #define SubRuleFunc otv_x_y_ux_sy
00381
00382 FT_LOCAL( void )
00383 otv_x_y_ux_sy( FT_Bytes table,
00384 OTV_Validator valid );
00385
00386 #define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
00387 #define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp
00388 #define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
00389 #define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp
00390
00391 FT_LOCAL( void )
00392 otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table,
00393 OTV_Validator valid );
00394
00395 #define ContextPosFormat2Func otv_u_O_O_x_Onx
00396 #define ContextSubstFormat2Func otv_u_O_O_x_Onx
00397
00398 FT_LOCAL( void )
00399 otv_u_O_O_x_Onx( FT_Bytes table,
00400 OTV_Validator valid );
00401
00402 #define ContextPosFormat3Func otv_u_x_y_Ox_sy
00403 #define ContextSubstFormat3Func otv_u_x_y_Ox_sy
00404
00405 FT_LOCAL( void )
00406 otv_u_x_y_Ox_sy( FT_Bytes table,
00407 OTV_Validator valid );
00408
00409 #define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx
00410 #define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx
00411
00412 FT_LOCAL( void )
00413 otv_u_O_O_O_O_x_Onx( FT_Bytes table,
00414 OTV_Validator valid );
00415
00416 #define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
00417 #define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
00418
00419 FT_LOCAL( void )
00420 otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table,
00421 OTV_Validator valid );
00422
00423
00424 FT_LOCAL( FT_UInt )
00425 otv_GSUBGPOS_get_Lookup_count( FT_Bytes table );
00426
00427 FT_LOCAL( FT_UInt )
00428 otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table );
00429
00430
00431
00432 FT_END_HEADER
00433
00434 #endif
00435
00436
00437