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