1 /****************************************************************************
2  *
3  * gxvmort4.c
4  *
5  *   TrueTypeGX/AAT mort table validation
6  *   body for type4 (Non-Contextual Glyph Substitution) subtable.
7  *
8  * Copyright (C) 2005-2019 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  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