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