ReactOS 0.4.16-dev-297-gc569aee
gxvmorx2.c
Go to the documentation of this file.
1/***************************************************************************/
2/* */
3/* gxvmorx2.c */
4/* */
5/* TrueTypeGX/AAT morx table validation */
6/* body for type2 (Ligature 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 "gxvmorx.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_gxvmorx
40
41
43 {
50
53
54
55#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE \
56 ( GXV_XSTATETABLE_HEADER_SIZE + 4 + 4 + 4 )
57
58
59 static void
62 GXV_Validator gxvalid )
63 {
65
68
69
70 GXV_LIMIT_CHECK( 4 + 4 + 4 );
71 optdata->ligActionTable = FT_NEXT_ULONG( p );
72 optdata->componentTable = FT_NEXT_ULONG( p );
73 optdata->ligatureTable = FT_NEXT_ULONG( p );
74
75 GXV_TRACE(( "offset to ligActionTable=0x%08x\n",
76 optdata->ligActionTable ));
77 GXV_TRACE(( "offset to componentTable=0x%08x\n",
78 optdata->componentTable ));
79 GXV_TRACE(( "offset to ligatureTable=0x%08x\n",
80 optdata->ligatureTable ));
81 }
82
83
84 static void
86 FT_ULong classTable,
87 FT_ULong stateArray,
88 FT_ULong entryTable,
89 FT_ULong* classTable_length_p,
90 FT_ULong* stateArray_length_p,
91 FT_ULong* entryTable_length_p,
92 GXV_Validator gxvalid )
93 {
94 FT_ULong o[6];
95 FT_ULong* l[6];
96 FT_ULong buff[7];
97
100
101
102 GXV_NAME_ENTER( "subtable boundaries setup" );
103
104 o[0] = classTable;
105 o[1] = stateArray;
106 o[2] = entryTable;
107 o[3] = optdata->ligActionTable;
108 o[4] = optdata->componentTable;
109 o[5] = optdata->ligatureTable;
110 l[0] = classTable_length_p;
111 l[1] = stateArray_length_p;
112 l[2] = entryTable_length_p;
113 l[3] = &(optdata->ligActionTable_length);
114 l[4] = &(optdata->componentTable_length);
115 l[5] = &(optdata->ligatureTable_length);
116
118
119 GXV_TRACE(( "classTable: offset=0x%08x length=0x%08x\n",
120 classTable, *classTable_length_p ));
121 GXV_TRACE(( "stateArray: offset=0x%08x length=0x%08x\n",
122 stateArray, *stateArray_length_p ));
123 GXV_TRACE(( "entryTable: offset=0x%08x length=0x%08x\n",
124 entryTable, *entryTable_length_p ));
125 GXV_TRACE(( "ligActionTable: offset=0x%08x length=0x%08x\n",
126 optdata->ligActionTable,
127 optdata->ligActionTable_length ));
128 GXV_TRACE(( "componentTable: offset=0x%08x length=0x%08x\n",
129 optdata->componentTable,
130 optdata->componentTable_length ));
131 GXV_TRACE(( "ligatureTable: offset=0x%08x length=0x%08x\n",
132 optdata->ligatureTable,
133 optdata->ligatureTable_length ));
134
135 GXV_EXIT;
136 }
137
138
139#define GXV_MORX_LIGACTION_ENTRY_SIZE 4
140
141
142 static void
145 FT_UShort ligActionIndex,
146 GXV_Validator gxvalid )
147 {
148 /* access ligActionTable */
151
152 FT_Bytes lat_base = table + optdata->ligActionTable;
153 FT_Bytes p = lat_base +
154 ligActionIndex * GXV_MORX_LIGACTION_ENTRY_SIZE;
155 FT_Bytes lat_limit = lat_base + optdata->ligActionTable;
156
157
158 if ( p < lat_base )
159 {
160 GXV_TRACE(( "p < lat_base (%d byte rewind)\n", lat_base - p ));
162 }
163 else if ( lat_limit < p )
164 {
165 GXV_TRACE(( "lat_limit < p (%d byte overrun)\n", p - lat_limit ));
167 }
168
169 {
170 /* validate entry in ligActionTable */
171 FT_ULong lig_action;
172#ifdef GXV_LOAD_UNUSED_VARS
174 FT_UShort store;
175#endif
177 FT_Long gid_limit;
178
179
180 lig_action = FT_NEXT_ULONG( p );
181#ifdef GXV_LOAD_UNUSED_VARS
182 last = (FT_UShort)( ( lig_action >> 31 ) & 1 );
183 store = (FT_UShort)( ( lig_action >> 30 ) & 1 );
184#endif
185
186 offset = lig_action & 0x3FFFFFFFUL;
187
188 /* this offset is 30-bit signed value to add to GID */
189 /* it is different from the location offset in mort */
190 if ( ( offset & 0x3FFF0000UL ) == 0x3FFF0000UL )
191 { /* negative offset */
192 gid_limit = gxvalid->face->num_glyphs -
193 (FT_Long)( offset & 0x0000FFFFUL );
194 if ( gid_limit > 0 )
195 return;
196
197 GXV_TRACE(( "ligature action table includes"
198 " too negative offset moving all GID"
199 " below defined range: 0x%04x\n",
200 offset & 0xFFFFU ));
202 }
203 else if ( ( offset & 0x3FFF0000UL ) == 0x00000000UL )
204 { /* positive offset */
205 if ( (FT_Long)offset < gxvalid->face->num_glyphs )
206 return;
207
208 GXV_TRACE(( "ligature action table includes"
209 " too large offset moving all GID"
210 " over defined range: 0x%04x\n",
211 offset & 0xFFFFU ));
213 }
214
215 GXV_TRACE(( "ligature action table includes"
216 " invalid offset to add to 16-bit GID:"
217 " 0x%08x\n", offset ));
219 }
220 }
221
222
223 static void
227 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
230 GXV_Validator gxvalid )
231 {
232#ifdef GXV_LOAD_UNUSED_VARS
233 FT_UShort setComponent;
234 FT_UShort dontAdvance;
235 FT_UShort performAction;
236#endif
238 FT_UShort ligActionIndex;
239
240 FT_UNUSED( state );
241 FT_UNUSED( limit );
242
243
244#ifdef GXV_LOAD_UNUSED_VARS
245 setComponent = (FT_UShort)( ( flags >> 15 ) & 1 );
246 dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
247 performAction = (FT_UShort)( ( flags >> 13 ) & 1 );
248#endif
249
250 reserved = (FT_UShort)( flags & 0x1FFF );
251 ligActionIndex = glyphOffset_p->u;
252
253 if ( reserved > 0 )
254 GXV_TRACE(( " reserved 14bit is non-zero\n" ));
255
256 if ( 0 < ligActionIndex )
258 table, ligActionIndex, gxvalid );
259 }
260
261
262 static void
264 GXV_Validator gxvalid )
265 {
268
269 FT_Bytes p = table + optdata->ligatureTable;
270 FT_Bytes limit = table + optdata->ligatureTable
271 + optdata->ligatureTable_length;
272
273
274 GXV_NAME_ENTER( "morx chain subtable type2 - substitutionTable" );
275
276 if ( 0 != optdata->ligatureTable )
277 {
278 /* Apple does not give specification of ligatureTable format */
279 while ( p < limit )
280 {
281 FT_UShort lig_gid;
282
283
284 GXV_LIMIT_CHECK( 2 );
285 lig_gid = FT_NEXT_USHORT( p );
286 if ( lig_gid < gxvalid->face->num_glyphs )
288 }
289 }
290
291 GXV_EXIT;
292 }
293
294
295 FT_LOCAL_DEF( void )
298 GXV_Validator gxvalid )
299 {
300 FT_Bytes p = table;
301
303
304
305 GXV_NAME_ENTER( "morx chain subtable type2 (Ligature Substitution)" );
306
308
309 gxvalid->xstatetable.optdata =
310 &lig_rec;
311 gxvalid->xstatetable.optdata_load_func =
313 gxvalid->xstatetable.subtable_setup_func =
315 gxvalid->xstatetable.entry_glyphoffset_fmt =
317 gxvalid->xstatetable.entry_validate_func =
319
320 gxv_XStateTable_validate( p, limit, gxvalid );
321
322#if 0
323 p += gxvalid->subtable_length;
324#endif
326
327 GXV_EXIT;
328 }
329
330
331/* END */
static int state
Definition: maze.c:121
r l[0]
Definition: byte_order.h:168
r reserved
Definition: btrfs.c:3006
static unsigned char buff[32768]
Definition: fatten.c:17
#define FT_LOCAL_DEF(x)
Definition: ftconfig.h:388
#define FT_UNUSED(arg)
Definition: ftconfig.h:101
#define FT_NEXT_USHORT(buffer)
Definition: ftstream.h:226
#define FT_NEXT_ULONG(buffer)
Definition: ftstream.h:238
unsigned long FT_ULong
Definition: fttypes.h:253
signed long FT_Long
Definition: fttypes.h:242
unsigned short FT_UShort
Definition: fttypes.h:209
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
#define FT_INVALID_OFFSET
Definition: ftvalid.h:138
#define FT_INVALID_GLYPH_ID
Definition: ftvalid.h:146
GLenum GLuint GLint GLenum face
Definition: glext.h:7025
GLint limit
Definition: glext.h:10326
GLbitfield flags
Definition: glext.h:7161
GLfloat GLfloat p
Definition: glext.h:8902
GLintptr offset
Definition: glext.h:5920
gxv_set_length_by_ulong_offset(FT_ULong *offset, FT_ULong **length, FT_ULong *buff, FT_UInt nmemb, FT_ULong limit, GXV_Validator gxvalid)
Definition: gxvcommn.c:128
gxv_XStateTable_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvcommn.c:1554
#define GXV_NAME_ENTER(name)
Definition: gxvcommn.h:301
#define GXV_SET_ERR_IF_PARANOID(err)
Definition: gxvcommn.h:66
#define GXV_TRACE(s)
Definition: gxvcommn.h:304
@ GXV_GLYPHOFFSET_USHORT
Definition: gxvcommn.h:125
#define GXV_EXIT
Definition: gxvcommn.h:302
#define GXV_LIMIT_CHECK(_count)
Definition: gxvcommn.h:272
static void gxv_morx_subtable_type2_opttable_load(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmorx2.c:60
gxv_morx_subtable_type2_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmorx2.c:296
static void gxv_morx_subtable_type2_ligActionIndex_validate(FT_Bytes table, FT_UShort ligActionIndex, GXV_Validator gxvalid)
Definition: gxvmorx2.c:143
static void gxv_morx_subtable_type2_ligatureTable_validate(FT_Bytes table, GXV_Validator gxvalid)
Definition: gxvmorx2.c:263
struct GXV_morx_subtable_type2_StateOptRec_ * GXV_morx_subtable_type2_StateOptRecData
#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE
Definition: gxvmorx2.c:55
#define GXV_MORX_LIGACTION_ENTRY_SIZE
Definition: gxvmorx2.c:139
static void gxv_morx_subtable_type2_subtable_setup(FT_ULong table_size, FT_ULong classTable, FT_ULong stateArray, FT_ULong entryTable, FT_ULong *classTable_length_p, FT_ULong *stateArray_length_p, FT_ULong *entryTable_length_p, GXV_Validator gxvalid)
Definition: gxvmorx2.c:85
static void gxv_morx_subtable_type2_entry_validate(FT_UShort state, FT_UShort flags, GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmorx2.c:224
struct GXV_morx_subtable_type2_StateOptRec_ GXV_morx_subtable_type2_StateOptRec
if(dx< 0)
Definition: linetemp.h:194
static UINT UINT last
Definition: font.c:45
LOCAL int table_size
Definition: write.c:65
FT_Long num_glyphs
Definition: freetype.h:1076
GXV_XStateTable_ValidatorRec xstatetable
Definition: gxvcommn.h:255