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