1 /***************************************************************************/ 2 /* */ 3 /* gxvmort4.c */ 4 /* */ 5 /* TrueTypeGX/AAT mort table validation */ 6 /* body for type4 (Non-Contextual Glyph Substitution) subtable. */ 7 /* */ 8 /* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ 9 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 10 /* */ 11 /* This file is part of the FreeType project, and may only be used, */ 12 /* modified, and distributed under the terms of the FreeType project */ 13 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 14 /* this file you indicate that you have read the license and */ 15 /* understand and accept it fully. */ 16 /* */ 17 /***************************************************************************/ 18 19 /***************************************************************************/ 20 /* */ 21 /* gxvalid is derived from both gxlayout module and otvalid module. */ 22 /* Development of gxlayout is supported by the Information-technology */ 23 /* Promotion Agency(IPA), Japan. */ 24 /* */ 25 /***************************************************************************/ 26 27 28 #include "gxvmort.h" 29 30 31 /*************************************************************************/ 32 /* */ 33 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 34 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 35 /* messages during execution. */ 36 /* */ 37 #undef FT_COMPONENT 38 #define FT_COMPONENT trace_gxvmort 39 40 41 static void gxv_mort_subtable_type4_lookupval_validate(FT_UShort glyph,GXV_LookupValueCPtr value_p,GXV_Validator valid)42 gxv_mort_subtable_type4_lookupval_validate( FT_UShort glyph, 43 GXV_LookupValueCPtr value_p, 44 GXV_Validator valid ) 45 { 46 FT_UNUSED( glyph ); 47 48 gxv_glyphid_validate( value_p->u, valid ); 49 } 50 51 /* 52 +===============+ --------+ 53 | lookup header | | 54 +===============+ | 55 | BinSrchHeader | | 56 +===============+ | 57 | lastGlyph[0] | | 58 +---------------+ | 59 | firstGlyph[0] | | head of lookup table 60 +---------------+ | + 61 | offset[0] | -> | offset [byte] 62 +===============+ | + 63 | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] 64 +---------------+ | 65 | firstGlyph[1] | | 66 +---------------+ | 67 | offset[1] | | 68 +===============+ | 69 | 70 .... | 71 | 72 16bit value array | 73 +===============+ | 74 | value | <-------+ 75 .... 76 */ 77 78 static GXV_LookupValueDesc gxv_mort_subtable_type4_lookupfmt4_transit(FT_UShort relative_gindex,GXV_LookupValueCPtr base_value_p,FT_Bytes lookuptbl_limit,GXV_Validator valid)79 gxv_mort_subtable_type4_lookupfmt4_transit( 80 FT_UShort relative_gindex, 81 GXV_LookupValueCPtr base_value_p, 82 FT_Bytes lookuptbl_limit, 83 GXV_Validator valid ) 84 { 85 FT_Bytes p; 86 FT_Bytes limit; 87 FT_UShort offset; 88 GXV_LookupValueDesc value; 89 90 /* XXX: check range? */ 91 offset = (FT_UShort)( base_value_p->u + 92 relative_gindex * sizeof ( FT_UShort ) ); 93 94 p = valid->lookuptbl_head + offset; 95 limit = lookuptbl_limit; 96 97 GXV_LIMIT_CHECK( 2 ); 98 value.u = FT_NEXT_USHORT( p ); 99 100 return value; 101 } 102 103 104 FT_LOCAL_DEF( void ) gxv_mort_subtable_type4_validate(FT_Bytes table,FT_Bytes limit,GXV_Validator valid)105 gxv_mort_subtable_type4_validate( FT_Bytes table, 106 FT_Bytes limit, 107 GXV_Validator valid ) 108 { 109 FT_Bytes p = table; 110 111 112 GXV_NAME_ENTER( "mort chain subtable type4 " 113 "(Non-Contextual Glyph Substitution)" ); 114 115 valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; 116 valid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate; 117 valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit; 118 119 gxv_LookupTable_validate( p, limit, valid ); 120 121 GXV_EXIT; 122 } 123 124 125 /* END */ 126