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 gxv_mort_subtable_type4_lookupval_validate(FT_UShort glyph,GXV_LookupValueCPtr value_p,GXV_Validator gxvalid)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 gxv_mort_subtable_type4_lookupfmt4_transit(FT_UShort relative_gindex,GXV_LookupValueCPtr base_value_p,FT_Bytes lookuptbl_limit,GXV_Validator gxvalid)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 ) gxv_mort_subtable_type4_validate(FT_Bytes table,FT_Bytes limit,GXV_Validator gxvalid)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