Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygengxvcommn.h
Go to the documentation of this file.
00001 /***************************************************************************/ 00002 /* */ 00003 /* gxvcommn.h */ 00004 /* */ 00005 /* TrueTypeGX/AAT common tables validation (specification). */ 00006 /* */ 00007 /* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ 00008 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 00009 /* */ 00010 /* This file is part of the FreeType project, and may only be used, */ 00011 /* modified, and distributed under the terms of the FreeType project */ 00012 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 00013 /* this file you indicate that you have read the license and */ 00014 /* understand and accept it fully. */ 00015 /* */ 00016 /***************************************************************************/ 00017 00018 /***************************************************************************/ 00019 /* */ 00020 /* gxvalid is derived from both gxlayout module and otvalid module. */ 00021 /* Development of gxlayout is supported by the Information-technology */ 00022 /* Promotion Agency(IPA), Japan. */ 00023 /* */ 00024 /***************************************************************************/ 00025 00026 00027 /* 00028 * keywords in variable naming 00029 * --------------------------- 00030 * table: Of type FT_Bytes, pointing to the start of this table/subtable. 00031 * limit: Of type FT_Bytes, pointing to the end of this table/subtable, 00032 * including padding for alignment. 00033 * offset: Of type FT_UInt, the number of octets from the start to target. 00034 * length: Of type FT_UInt, the number of octets from the start to the 00035 * end in this table/subtable, including padding for alignment. 00036 * 00037 * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc. 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 /***** VALIDATION *****/ 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 /* ====================== LookupTable Validator ======================== */ 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 /* ====================== StateTable Validator ========================= */ 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 /* ----------------------- 16bit StateTable ---------------------------- */ 00127 00128 typedef union GXV_StateTable_GlyphOffsetDesc_ 00129 { 00130 FT_Byte uc; 00131 FT_UShort u; /* same as GXV_LookupValueDesc */ 00132 FT_ULong ul; 00133 FT_Char c; 00134 FT_Short s; /* same as GXV_LookupValueDesc */ 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 /* ---------------------- 32bit XStateTable ---------------------------- */ 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 /* !FT_DEBUG_LEVEL_TRACE */ 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 /* !FT_DEBUG_LEVEL_TRACE */ 00290 00291 00292 /*************************************************************************/ 00293 /*************************************************************************/ 00294 /***** *****/ 00295 /***** 32bit alignment checking *****/ 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 /***** Dumping Binary Data *****/ 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 /***** LOOKUP TABLE *****/ 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 /***** Glyph ID *****/ 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 /***** CONTROL POINT *****/ 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 /***** SFNT NAME *****/ 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 /***** STATE TABLE *****/ 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 /***** UTILITY MACROS AND FUNCTIONS *****/ 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 /***** Table overlapping *****/ 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 /* __GXVCOMMN_H__ */ 00563 00564 00565 /* END */ Generated on Sat May 26 2012 04:32:41 for ReactOS by
1.7.6.1
|