00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef __GXVCOMMN_H__
00042 #define __GXVCOMMN_H__
00043
00044
00045 #include <ft2build.h>
00046 #include "gxvalid.h"
00047 #include FT_INTERNAL_DEBUG_H
00048 #include FT_SFNT_NAMES_H
00049
00050
00051 FT_BEGIN_HEADER
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 typedef struct GXV_ValidatorRec_* GXV_Validator;
00063
00064
00065 #define DUMMY_LIMIT 0
00066
00067 typedef void
00068 (*GXV_Validate_Func)( FT_Bytes table,
00069 FT_Bytes limit,
00070 GXV_Validator valid );
00071
00072
00073
00074
00075 typedef union GXV_LookupValueDesc_
00076 {
00077 FT_UShort u;
00078 FT_Short s;
00079
00080 } GXV_LookupValueDesc;
00081
00082 typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
00083
00084 typedef enum GXV_LookupValue_SignSpec_
00085 {
00086 GXV_LOOKUPVALUE_UNSIGNED = 0,
00087 GXV_LOOKUPVALUE_SIGNED
00088
00089 } GXV_LookupValue_SignSpec;
00090
00091
00092 typedef void
00093 (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph,
00094 GXV_LookupValueCPtr value_p,
00095 GXV_Validator valid );
00096
00097 typedef GXV_LookupValueDesc
00098 (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex,
00099 GXV_LookupValueCPtr base_value_p,
00100 FT_Bytes lookuptbl_limit,
00101 GXV_Validator valid );
00102
00103
00104
00105
00106 typedef enum GXV_GlyphOffset_Format_
00107 {
00108 GXV_GLYPHOFFSET_NONE = -1,
00109 GXV_GLYPHOFFSET_UCHAR = 2,
00110 GXV_GLYPHOFFSET_CHAR,
00111 GXV_GLYPHOFFSET_USHORT = 4,
00112 GXV_GLYPHOFFSET_SHORT,
00113 GXV_GLYPHOFFSET_ULONG = 8,
00114 GXV_GLYPHOFFSET_LONG
00115
00116 } GXV_GlyphOffset_Format;
00117
00118
00119 #define GXV_GLYPHOFFSET_FMT( table ) \
00120 ( valid->table.entry_glyphoffset_fmt )
00121
00122 #define GXV_GLYPHOFFSET_SIZE( table ) \
00123 ( valid->table.entry_glyphoffset_fmt / 2 )
00124
00125
00126
00127
00128 typedef union GXV_StateTable_GlyphOffsetDesc_
00129 {
00130 FT_Byte uc;
00131 FT_UShort u;
00132 FT_ULong ul;
00133 FT_Char c;
00134 FT_Short s;
00135 FT_Long l;
00136
00137 } GXV_StateTable_GlyphOffsetDesc;
00138
00139 typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
00140
00141 typedef void
00142 (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size,
00143 FT_UShort classTable,
00144 FT_UShort stateArray,
00145 FT_UShort entryTable,
00146 FT_UShort* classTable_length_p,
00147 FT_UShort* stateArray_length_p,
00148 FT_UShort* entryTable_length_p,
00149 GXV_Validator valid );
00150
00151 typedef void
00152 (*GXV_StateTable_Entry_Validate_Func)(
00153 FT_Byte state,
00154 FT_UShort flags,
00155 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
00156 FT_Bytes statetable_table,
00157 FT_Bytes statetable_limit,
00158 GXV_Validator valid );
00159
00160 typedef void
00161 (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table,
00162 FT_Bytes limit,
00163 GXV_Validator valid );
00164
00165 typedef struct GXV_StateTable_ValidatorRec_
00166 {
00167 GXV_GlyphOffset_Format entry_glyphoffset_fmt;
00168 void* optdata;
00169
00170 GXV_StateTable_Subtable_Setup_Func subtable_setup_func;
00171 GXV_StateTable_Entry_Validate_Func entry_validate_func;
00172 GXV_StateTable_OptData_Load_Func optdata_load_func;
00173
00174 } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
00175
00176
00177
00178
00179 typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc;
00180
00181 typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
00182
00183 typedef void
00184 (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size,
00185 FT_ULong classTable,
00186 FT_ULong stateArray,
00187 FT_ULong entryTable,
00188 FT_ULong* classTable_length_p,
00189 FT_ULong* stateArray_length_p,
00190 FT_ULong* entryTable_length_p,
00191 GXV_Validator valid );
00192
00193 typedef void
00194 (*GXV_XStateTable_Entry_Validate_Func)(
00195 FT_UShort state,
00196 FT_UShort flags,
00197 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
00198 FT_Bytes xstatetable_table,
00199 FT_Bytes xstatetable_limit,
00200 GXV_Validator valid );
00201
00202
00203 typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func;
00204
00205
00206 typedef struct GXV_XStateTable_ValidatorRec_
00207 {
00208 int entry_glyphoffset_fmt;
00209 void* optdata;
00210
00211 GXV_XStateTable_Subtable_Setup_Func subtable_setup_func;
00212 GXV_XStateTable_Entry_Validate_Func entry_validate_func;
00213 GXV_XStateTable_OptData_Load_Func optdata_load_func;
00214
00215 FT_ULong nClasses;
00216 FT_UShort maxClassID;
00217
00218 } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
00219
00220
00221
00222
00223 typedef struct GXV_ValidatorRec_
00224 {
00225 FT_Validator root;
00226
00227 FT_Face face;
00228 void* table_data;
00229
00230 FT_ULong subtable_length;
00231
00232 GXV_LookupValue_SignSpec lookupval_sign;
00233 GXV_Lookup_Value_Validate_Func lookupval_func;
00234 GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans;
00235 FT_Bytes lookuptbl_head;
00236
00237 GXV_StateTable_ValidatorRec statetable;
00238 GXV_XStateTable_ValidatorRec xstatetable;
00239
00240 #ifdef FT_DEBUG_LEVEL_TRACE
00241 FT_UInt debug_indent;
00242 const FT_String* debug_function_name[3];
00243 #endif
00244
00245 } GXV_ValidatorRec;
00246
00247
00248 #define GXV_TABLE_DATA( tag, field ) \
00249 ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )
00250
00251 #undef FT_INVALID_
00252 #define FT_INVALID_( _prefix, _error ) \
00253 ft_validator_error( valid->root, _prefix ## _error )
00254
00255 #define GXV_LIMIT_CHECK( _count ) \
00256 FT_BEGIN_STMNT \
00257 if ( p + _count > ( limit? limit : valid->root->limit ) ) \
00258 FT_INVALID_TOO_SHORT; \
00259 FT_END_STMNT
00260
00261
00262 #ifdef FT_DEBUG_LEVEL_TRACE
00263
00264 #define GXV_INIT valid->debug_indent = 0
00265
00266 #define GXV_NAME_ENTER( name ) \
00267 FT_BEGIN_STMNT \
00268 valid->debug_indent += 2; \
00269 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
00270 FT_TRACE4(( "%s table\n", name )); \
00271 FT_END_STMNT
00272
00273 #define GXV_EXIT valid->debug_indent -= 2
00274
00275 #define GXV_TRACE( s ) \
00276 FT_BEGIN_STMNT \
00277 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
00278 FT_TRACE4( s ); \
00279 FT_END_STMNT
00280
00281 #else
00282
00283 #define GXV_INIT do { } while ( 0 )
00284 #define GXV_NAME_ENTER( name ) do { } while ( 0 )
00285 #define GXV_EXIT do { } while ( 0 )
00286
00287 #define GXV_TRACE( s ) do { } while ( 0 )
00288
00289 #endif
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 #define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
00301 FT_BEGIN_STMNT \
00302 { \
00303 if ( 0 != ( (a) % 4 ) ) \
00304 FT_INVALID_OFFSET ; \
00305 } \
00306 FT_END_STMNT
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 #define GXV_TRACE_HEXDUMP( p, len ) \
00318 FT_BEGIN_STMNT \
00319 { \
00320 FT_Bytes b; \
00321 \
00322 \
00323 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
00324 FT_TRACE1(("\\x%02x", *b)) ; \
00325 } \
00326 FT_END_STMNT
00327
00328 #define GXV_TRACE_HEXDUMP_C( p, len ) \
00329 FT_BEGIN_STMNT \
00330 { \
00331 FT_Bytes b; \
00332 \
00333 \
00334 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
00335 if ( 0x40 < *b && *b < 0x7e ) \
00336 FT_TRACE1(("%c", *b)) ; \
00337 else \
00338 FT_TRACE1(("\\x%02x", *b)) ; \
00339 } \
00340 FT_END_STMNT
00341
00342 #define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \
00343 GXV_TRACE_HEXDUMP( n.string, n.string_len )
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 FT_LOCAL( void )
00355 gxv_BinSrchHeader_validate( FT_Bytes p,
00356 FT_Bytes limit,
00357 FT_UShort* unitSize_p,
00358 FT_UShort* nUnits_p,
00359 GXV_Validator valid );
00360
00361 FT_LOCAL( void )
00362 gxv_LookupTable_validate( FT_Bytes table,
00363 FT_Bytes limit,
00364 GXV_Validator valid );
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 FT_LOCAL( FT_Int )
00376 gxv_glyphid_validate( FT_UShort gid,
00377 GXV_Validator valid );
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 FT_LOCAL( void )
00389 gxv_ctlPoint_validate( FT_UShort gid,
00390 FT_Short ctl_point,
00391 GXV_Validator valid );
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402 FT_LOCAL( void )
00403 gxv_sfntName_validate( FT_UShort name_index,
00404 FT_UShort min_index,
00405 FT_UShort max_index,
00406 GXV_Validator valid );
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417 FT_LOCAL( void )
00418 gxv_StateTable_subtable_setup( FT_UShort table_size,
00419 FT_UShort classTable,
00420 FT_UShort stateArray,
00421 FT_UShort entryTable,
00422 FT_UShort* classTable_length_p,
00423 FT_UShort* stateArray_length_p,
00424 FT_UShort* entryTable_length_p,
00425 GXV_Validator valid );
00426
00427 FT_LOCAL( void )
00428 gxv_XStateTable_subtable_setup( FT_ULong table_size,
00429 FT_ULong classTable,
00430 FT_ULong stateArray,
00431 FT_ULong entryTable,
00432 FT_ULong* classTable_length_p,
00433 FT_ULong* stateArray_length_p,
00434 FT_ULong* entryTable_length_p,
00435 GXV_Validator valid );
00436
00437 FT_LOCAL( void )
00438 gxv_StateTable_validate( FT_Bytes table,
00439 FT_Bytes limit,
00440 GXV_Validator valid );
00441
00442 FT_LOCAL( void )
00443 gxv_XStateTable_validate( FT_Bytes table,
00444 FT_Bytes limit,
00445 GXV_Validator valid );
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456 FT_LOCAL( void )
00457 gxv_array_getlimits_byte( FT_Bytes table,
00458 FT_Bytes limit,
00459 FT_Byte* min,
00460 FT_Byte* max,
00461 GXV_Validator valid );
00462
00463 FT_LOCAL( void )
00464 gxv_array_getlimits_ushort( FT_Bytes table,
00465 FT_Bytes limit,
00466 FT_UShort* min,
00467 FT_UShort* max,
00468 GXV_Validator valid );
00469
00470 FT_LOCAL( void )
00471 gxv_set_length_by_ushort_offset( FT_UShort* offset,
00472 FT_UShort** length,
00473 FT_UShort* buff,
00474 FT_UInt nmemb,
00475 FT_UShort limit,
00476 GXV_Validator valid );
00477
00478 FT_LOCAL( void )
00479 gxv_set_length_by_ulong_offset( FT_ULong* offset,
00480 FT_ULong** length,
00481 FT_ULong* buff,
00482 FT_UInt nmemb,
00483 FT_ULong limit,
00484 GXV_Validator valid);
00485
00486
00487 #define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \
00488 FT_BEGIN_STMNT \
00489 if ( (_offset) > valid->subtable_length ) \
00490 FT_INVALID_OFFSET; \
00491 FT_END_STMNT
00492
00493 #define GXV_SUBTABLE_LIMIT_CHECK( _count ) \
00494 FT_BEGIN_STMNT \
00495 if ( ( p + (_count) - valid->subtable_start ) > \
00496 valid->subtable_length ) \
00497 FT_INVALID_TOO_SHORT; \
00498 FT_END_STMNT
00499
00500 #define GXV_USHORT_TO_SHORT( _us ) \
00501 ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
00502
00503 #define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 )
00504 #define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE
00505
00506 #define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 )
00507 #define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518 typedef struct GXV_odtect_DataRec_
00519 {
00520 FT_Bytes start;
00521 FT_ULong length;
00522 FT_String* name;
00523
00524 } GXV_odtect_DataRec, *GXV_odtect_Data;
00525
00526 typedef struct GXV_odtect_RangeRec_
00527 {
00528 FT_UInt nRanges;
00529 GXV_odtect_Data range;
00530
00531 } GXV_odtect_RangeRec, *GXV_odtect_Range;
00532
00533
00534 FT_LOCAL( void )
00535 gxv_odtect_add_range( FT_Bytes start,
00536 FT_ULong length,
00537 const FT_String* name,
00538 GXV_odtect_Range odtect );
00539
00540 FT_LOCAL( void )
00541 gxv_odtect_validate( GXV_odtect_Range odtect,
00542 GXV_Validator valid );
00543
00544
00545 #define GXV_ODTECT( n, odtect ) \
00546 GXV_odtect_DataRec odtect ## _range[n]; \
00547 GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \
00548 GXV_odtect_Range odtect = NULL
00549
00550 #define GXV_ODTECT_INIT( odtect ) \
00551 FT_BEGIN_STMNT \
00552 odtect ## _rec.nRanges = 0; \
00553 odtect ## _rec.range = odtect ## _range; \
00554 odtect = & odtect ## _rec; \
00555 FT_END_STMNT
00556
00557
00558
00559
00560 FT_END_HEADER
00561
00562 #endif
00563
00564
00565