/***************************************************************************/ /* */ /* gxvcommn.h */ /* */ /* TrueTypeGX/AAT common tables validation (specification). */ /* */ /* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /***************************************************************************/ /* gxvalid is derived from both gxlayout module and otvalid module. */ /* Development of gxlayout was support of Information-technology Promotion */ /* Agency(IPA), Japan. */ /***************************************************************************/ /* * keywords in variable naming * --------------------------- * table: FT_Bytes typed, pointing the start of this table/subtable. * limit: FT_Bytes typed, pointing the end of this table/subtable * including padding for alignment. * offset: FT_UInt typed, the number of octets from the start to target. * length: FT_UInt typed, the number of octets from the start to the end. * in this table/subtable, including padding for alignment. * * _MIN, _MAX: should be added to the tail of macros, as INT_MIN etc. */ #ifndef __GXVCOMMN_H__ #define __GXVCOMMN_H__ #include #include "gxvalid.h" #include FT_INTERNAL_DEBUG_H #include FT_SFNT_NAMES_H FT_BEGIN_HEADER /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** VALIDATION *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct GXV_ValidatorRec_* GXV_Validator; #define DUMMY_LIMIT 0 typedef void (*GXV_Validate_Func)( FT_Bytes table, FT_Bytes limit, GXV_Validator valid ); /* ====================== LookupTable Validator ======================== */ typedef union GXV_LookupValueDesc_ { FT_UShort u; FT_Short s; } GXV_LookupValueDesc; typedef enum GXV_LookupValue_SignSpec_ { GXV_LOOKUPVALUE_UNSIGNED = 0, GXV_LOOKUPVALUE_SIGNED } GXV_LookupValue_SignSpec; typedef void (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph, GXV_LookupValueDesc value, GXV_Validator valid ); typedef GXV_LookupValueDesc (*GXV_Lookup_Fmt4_Transit_Func) ( FT_UShort relative_gindex, GXV_LookupValueDesc base_value, FT_Bytes lookuptbl_limit, GXV_Validator valid ); /* ====================== StateTable Validator ========================= */ typedef enum GXV_GlyphOffset_Format_ { GXV_GLYPHOFFSET_NONE = -1, GXV_GLYPHOFFSET_UCHAR = 2, GXV_GLYPHOFFSET_CHAR, GXV_GLYPHOFFSET_USHORT = 4, GXV_GLYPHOFFSET_SHORT, GXV_GLYPHOFFSET_ULONG = 8, GXV_GLYPHOFFSET_LONG } GXV_GlyphOffset_Format; #define GXV_GLYPHOFFSET_FMT( table ) \ ( valid-> table . entry_glyphoffset_fmt ) #define GXV_GLYPHOFFSET_SIZE( table ) \ ( ( valid-> table . entry_glyphoffset_fmt ) / 2 ) /* ----------------------- 16bit StateTable ---------------------------- */ typedef union GXV_StateTable_GlyphOffsetDesc_ { FT_Byte uc; FT_UShort u; /* same with GXV_LookupValueDesc */ FT_ULong ul; FT_Char c; FT_Short s; /* same with GXV_LookupValueDesc */ FT_Long l; } GXV_StateTable_GlyphOffsetDesc; typedef void (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size, FT_UShort classTable, FT_UShort stateArray, FT_UShort entryTable, FT_UShort* classTable_length_p, FT_UShort* stateArray_length_p, FT_UShort* entryTable_length_p, GXV_Validator valid ); typedef void (*GXV_StateTable_Entry_Validate_Func)( FT_Byte state, FT_UShort flags, GXV_StateTable_GlyphOffsetDesc glyphOffset, FT_Bytes statetable_table, FT_Bytes statetable_limit, GXV_Validator valid ); typedef void (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table, FT_Bytes limit, GXV_Validator valid ); typedef struct GXV_StateTable_ValidatorRec_ { GXV_GlyphOffset_Format entry_glyphoffset_fmt; void* optdata; GXV_StateTable_Subtable_Setup_Func subtable_setup_func; GXV_StateTable_Entry_Validate_Func entry_validate_func; GXV_StateTable_OptData_Load_Func optdata_load_func; } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData; /* ---------------------- 32bit XStateTable ---------------------------- */ typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc; typedef void (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size, FT_ULong classTable, FT_ULong stateArray, FT_ULong entryTable, FT_ULong* classTable_length_p, FT_ULong* stateArray_length_p, FT_ULong* entryTable_length_p, GXV_Validator valid ); typedef void (*GXV_XStateTable_Entry_Validate_Func)( FT_UShort state, FT_UShort flags, GXV_StateTable_GlyphOffsetDesc glyphOffset, FT_Bytes xstatetable_table, FT_Bytes xstatetable_limit, GXV_Validator valid ); typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func; typedef struct GXV_XStateTable_ValidatorRec_ { int entry_glyphoffset_fmt; void* optdata; GXV_XStateTable_Subtable_Setup_Func subtable_setup_func; GXV_XStateTable_Entry_Validate_Func entry_validate_func; GXV_XStateTable_OptData_Load_Func optdata_load_func; FT_ULong nClasses; FT_UShort maxClassID; } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData; /* ===================================================================== */ typedef struct GXV_ValidatorRec_ { FT_Validator root; FT_Face face; void* table_data; FT_ULong subtable_length; GXV_LookupValue_SignSpec lookupval_sign; GXV_Lookup_Value_Validate_Func lookupval_func; GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans; FT_Bytes lookuptbl_head; GXV_StateTable_ValidatorRec statetable; GXV_XStateTable_ValidatorRec xstatetable; #ifdef FT_DEBUG_LEVEL_TRACE FT_UInt debug_indent; const FT_String* debug_function_name[3]; #endif } GXV_ValidatorRec; #define GXV_TABLE_DATA( tag, field ) \ ( ( (GXV_ ## tag ## _Data)valid->table_data )->field ) #undef FT_INVALID_ #define FT_INVALID_( _prefix, _error ) \ ft_validator_error( valid->root, _prefix ## _error ) #define GXV_LIMIT_CHECK( _count ) \ FT_BEGIN_STMNT \ if ( p + _count > ( limit? limit : valid->root->limit ) ) \ FT_INVALID_TOO_SHORT; \ FT_END_STMNT #ifdef FT_DEBUG_LEVEL_TRACE #define GXV_INIT valid->debug_indent = 0 #define GXV_NAME_ENTER( name ) \ FT_BEGIN_STMNT \ valid->debug_indent += 2; \ FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ FT_TRACE4(( "%s table\n", name )); \ FT_END_STMNT #define GXV_EXIT valid->debug_indent -= 2 #define GXV_TRACE( s ) \ FT_BEGIN_STMNT \ FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ FT_TRACE4( s ); \ FT_END_STMNT #else /* !FT_DEBUG_LEVEL_TRACE */ #define GXV_INIT do ; while ( 0 ) #define GXV_NAME_ENTER( name ) do ; while ( 0 ) #define GXV_EXIT do ; while ( 0 ) #define GXV_TRACE( s ) do ; while ( 0 ) #endif /* !FT_DEBUG_LEVEL_TRACE */ /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** 32bit alignment checking *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ #define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \ FT_BEGIN_STMNT \ { \ if ( 0 != ( (a) % 4 ) ) FT_INVALID_OFFSET ; \ } \ FT_END_STMNT /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** Dumping Binary Data *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ #define GXV_TRACE_HEXDUMP( p, len ) \ FT_BEGIN_STMNT \ { \ FT_Bytes b; \ for (b = p; b < (FT_Bytes)p + len; b++) \ FT_TRACE1(("\\x%02x", *b)) ; \ } \ FT_END_STMNT #define GXV_TRACE_HEXDUMP_C( p, len ) \ FT_BEGIN_STMNT \ { \ FT_Bytes b; \ for (b = p; b < (FT_Bytes)p + len; b++) \ if (0x40 < *b && *b < 0x7e) \ FT_TRACE1(("%c", *b)) ; \ else \ FT_TRACE1(("\\x%02x", *b)) ; \ } \ FT_END_STMNT #define GXV_TRACE_HEXDUMP_SFNTNAME( n ) GXV_TRACE_HEXDUMP( n.string, n.string_len ) /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** LOOKUP TABLE *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ FT_LOCAL( void ) gxv_BinSrchHeader_validate( FT_Bytes p, FT_Bytes limit, FT_UShort* unitSize_p, FT_UShort* nUnits_p, GXV_Validator valid ); FT_LOCAL( void ) gxv_LookupTable_validate( FT_Bytes table, FT_Bytes limit, GXV_Validator valid ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** Glyph ID *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ FT_LOCAL( FT_Int ) gxv_glyphid_validate( FT_UShort gid, GXV_Validator valid ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** CONTROL POINT *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ FT_LOCAL( void ) gxv_ctlPoint_validate( FT_UShort gid, FT_Short ctl_point, GXV_Validator valid ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** SFNT NAME *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ FT_LOCAL( void ) gxv_sfntName_validate( FT_UShort name_index, FT_UShort min_index, FT_UShort max_index, GXV_Validator valid ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** STATE TABLE *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ FT_LOCAL( void ) gxv_StateTable_validate( FT_Bytes table, FT_Bytes limit, GXV_Validator valid ); /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** UTILITY MACRO *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ #define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \ FT_BEGIN_STMNT \ if ( (_offset) > valid->subtable_length ) \ FT_INVALID_OFFSET; \ FT_END_STMNT #define GXV_SUBTABLE_LIMIT_CHECK( _count ) \ FT_BEGIN_STMNT \ if ( ( p + (_count) - valid->subtable_start ) > valid->subtable_length ) \ FT_INVALID_TOO_SHORT; \ FT_END_STMNT #define GXV_USHORT_TO_SHORT( _us ) \ ( ( 0x8000 < ( _us ) ) ? ( ( _us ) - 0x8000 ) : ( _us ) ) /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** Table overlapping *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ typedef struct GXV_odtect_DataRec_ { FT_Bytes start; FT_ULong length; FT_String* name; } GXV_odtect_DataRec, *GXV_odtect_Data; typedef struct GXV_odtect_RangeRec_ { FT_UInt nRanges; GXV_odtect_Data range; } GXV_odtect_RangeRec, *GXV_odtect_Range; #define GXV_ODTECT( n, odtect ) \ GXV_odtect_DataRec odtect ## _range[ n ]; \ GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \ GXV_odtect_Range odtect = NULL #define GXV_ODTECT_INIT( odtect ) \ FT_BEGIN_STMNT \ odtect ## _rec.nRanges = 0; \ odtect ## _rec.range = odtect ## _range; \ odtect = & odtect ## _rec; \ FT_END_STMNT /* */ FT_END_HEADER #endif /* Not def: __GXVCOMMN_H__ */ /* END */