sdk-world v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Loading...
Searching...
No Matches
gxvcommn.h
Go to the documentation of this file.
1/****************************************************************************
2 *
3 * gxvcommn.h
4 *
5 * TrueTypeGX/AAT common tables validation (specification).
6 *
7 * Copyright (C) 2004-2025 by
8 * suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
9 * David Turner, Robert Wilhelm, and Werner Lemberg.
10 *
11 * This file is part of the FreeType project, and may only be used,
12 * modified, and distributed under the terms of the FreeType project
13 * license, LICENSE.TXT. By continuing to use, modify, or distribute
14 * this file you indicate that you have read the license and
15 * understand and accept it fully.
16 *
17 */
18
19/****************************************************************************
20 *
21 * gxvalid is derived from both gxlayout module and otvalid module.
22 * Development of gxlayout is supported by the Information-technology
23 * Promotion Agency(IPA), Japan.
24 *
25 */
26
27
28 /*
29 * keywords in variable naming
30 * ---------------------------
31 * table: Of type FT_Bytes, pointing to the start of this table/subtable.
32 * limit: Of type FT_Bytes, pointing to the end of this table/subtable,
33 * including padding for alignment.
34 * offset: Of type FT_UInt, the number of octets from the start to target.
35 * length: Of type FT_UInt, the number of octets from the start to the
36 * end in this table/subtable, including padding for alignment.
37 *
38 * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
39 */
40
41
46#ifndef GXVCOMMN_H_
47#define GXVCOMMN_H_
48
49
50#include "gxvalid.h"
52#include <freetype/ftsnames.h>
53
54
55FT_BEGIN_HEADER
56
57
58 /* some variables are not evaluated or only used in trace */
59
60#ifdef FT_DEBUG_LEVEL_TRACE
61#define GXV_LOAD_TRACE_VARS
62#else
63#undef GXV_LOAD_TRACE_VARS
64#endif
65
66#undef GXV_LOAD_UNUSED_VARS /* debug purpose */
67
68#define IS_PARANOID_VALIDATION \
69 ( gxvalid->root->level >= FT_VALIDATE_PARANOID )
70#define GXV_SET_ERR_IF_PARANOID( err ) \
71 do { if ( IS_PARANOID_VALIDATION ) ( err ); } while ( 0 )
72
73
74 /*************************************************************************/
75 /*************************************************************************/
76 /***** *****/
77 /***** VALIDATION *****/
78 /***** *****/
79 /*************************************************************************/
80 /*************************************************************************/
81
82 typedef struct GXV_ValidatorRec_* GXV_Validator;
83
84
85#define DUMMY_LIMIT 0
86
87 typedef void
88 (*GXV_Validate_Func)( FT_Bytes table,
89 FT_Bytes limit,
90 GXV_Validator gxvalid );
91
92
93 /* ====================== LookupTable Validator ======================== */
94
96 {
97 FT_UShort u;
98 FT_Short s;
99
100 } GXV_LookupValueDesc;
101
102 typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
103
104 typedef enum GXV_LookupValue_SignSpec_
105 {
106 GXV_LOOKUPVALUE_UNSIGNED = 0,
107 GXV_LOOKUPVALUE_SIGNED
108
109 } GXV_LookupValue_SignSpec;
110
111
112 typedef void
113 (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph,
114 GXV_LookupValueCPtr value_p,
115 GXV_Validator gxvalid );
116
117 typedef GXV_LookupValueDesc
118 (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex,
119 GXV_LookupValueCPtr base_value_p,
120 FT_Bytes lookuptbl_limit,
121 GXV_Validator gxvalid );
122
123
124 /* ====================== StateTable Validator ========================= */
125
126 typedef enum GXV_GlyphOffset_Format_
127 {
128 GXV_GLYPHOFFSET_NONE = -1,
129 GXV_GLYPHOFFSET_UCHAR = 2,
130 GXV_GLYPHOFFSET_CHAR,
131 GXV_GLYPHOFFSET_USHORT = 4,
132 GXV_GLYPHOFFSET_SHORT,
133 GXV_GLYPHOFFSET_ULONG = 8,
134 GXV_GLYPHOFFSET_LONG
135
136 } GXV_GlyphOffset_Format;
137
138
139#define GXV_GLYPHOFFSET_FMT( table ) \
140 ( gxvalid->table.entry_glyphoffset_fmt )
141
142#define GXV_GLYPHOFFSET_SIZE( table ) \
143 ( gxvalid->table.entry_glyphoffset_fmt / 2 )
144
145
146 /* ----------------------- 16bit StateTable ---------------------------- */
147
149 {
150 FT_Byte uc;
151 FT_UShort u; /* same as GXV_LookupValueDesc */
152 FT_ULong ul;
153 FT_Char c;
154 FT_Short s; /* same as GXV_LookupValueDesc */
155 FT_Long l;
156
157 } GXV_StateTable_GlyphOffsetDesc;
158
159 typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
160
161 typedef void
162 (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size,
163 FT_UShort classTable,
164 FT_UShort stateArray,
165 FT_UShort entryTable,
166 FT_UShort* classTable_length_p,
167 FT_UShort* stateArray_length_p,
168 FT_UShort* entryTable_length_p,
169 GXV_Validator gxvalid );
170
171 typedef void
172 (*GXV_StateTable_Entry_Validate_Func)(
173 FT_Byte state,
174 FT_UShort flags,
175 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
176 FT_Bytes statetable_table,
177 FT_Bytes statetable_limit,
178 GXV_Validator gxvalid );
179
180 typedef void
181 (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table,
182 FT_Bytes limit,
183 GXV_Validator gxvalid );
184
186 {
187 GXV_GlyphOffset_Format entry_glyphoffset_fmt;
188 void* optdata;
189
190 GXV_StateTable_Subtable_Setup_Func subtable_setup_func;
191 GXV_StateTable_Entry_Validate_Func entry_validate_func;
192 GXV_StateTable_OptData_Load_Func optdata_load_func;
193
194 } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
195
196
197 /* ---------------------- 32bit XStateTable ---------------------------- */
198
199 typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc;
200
201 typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
202
203 typedef void
204 (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size,
205 FT_ULong classTable,
206 FT_ULong stateArray,
207 FT_ULong entryTable,
208 FT_ULong* classTable_length_p,
209 FT_ULong* stateArray_length_p,
210 FT_ULong* entryTable_length_p,
211 GXV_Validator gxvalid );
212
213 typedef void
214 (*GXV_XStateTable_Entry_Validate_Func)(
215 FT_UShort state,
216 FT_UShort flags,
217 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
218 FT_Bytes xstatetable_table,
219 FT_Bytes xstatetable_limit,
220 GXV_Validator gxvalid );
221
222
223 typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func;
224
225
227 {
228 int entry_glyphoffset_fmt;
229 void* optdata;
230
231 GXV_XStateTable_Subtable_Setup_Func subtable_setup_func;
232 GXV_XStateTable_Entry_Validate_Func entry_validate_func;
233 GXV_XStateTable_OptData_Load_Func optdata_load_func;
234
235 FT_ULong nClasses;
236 FT_UShort maxClassID;
237
238 } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
239
240
241 /* ===================================================================== */
242
243 typedef struct GXV_ValidatorRec_
244 {
245 FT_Validator root;
246
247 FT_Face face;
248 void* table_data;
249
250 FT_ULong subtable_length;
251
252 GXV_LookupValue_SignSpec lookupval_sign;
253 GXV_Lookup_Value_Validate_Func lookupval_func;
254 GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans;
255 FT_Bytes lookuptbl_head;
256
257 FT_UShort min_gid;
258 FT_UShort max_gid;
259
260 GXV_StateTable_ValidatorRec statetable;
261 GXV_XStateTable_ValidatorRec xstatetable;
262
263#ifdef FT_DEBUG_LEVEL_TRACE
264 FT_UInt debug_indent;
265 const FT_String* debug_function_name[3];
266#endif
267
268 } GXV_ValidatorRec;
269
270
271#define GXV_TABLE_DATA( tag, field ) \
272 ( ( (GXV_ ## tag ## _Data)gxvalid->table_data )->field )
273
274#undef FT_INVALID_
275#define FT_INVALID_( _error ) \
276 ft_validator_error( gxvalid->root, FT_THROW( _error ) )
277
278#define GXV_LIMIT_CHECK( _count ) \
279 FT_BEGIN_STMNT \
280 if ( p + _count > ( limit? limit : gxvalid->root->limit ) ) \
281 FT_INVALID_TOO_SHORT; \
282 FT_END_STMNT
283
284
285#ifdef FT_DEBUG_LEVEL_TRACE
286
287#define GXV_INIT gxvalid->debug_indent = 0
288
289#define GXV_NAME_ENTER( name ) \
290 FT_BEGIN_STMNT \
291 gxvalid->debug_indent += 2; \
292 FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \
293 FT_TRACE4(( "%s table\n", name )); \
294 FT_END_STMNT
295
296#define GXV_EXIT gxvalid->debug_indent -= 2
297
298#define GXV_TRACE( s ) \
299 FT_BEGIN_STMNT \
300 FT_TRACE4(( "%*.s", gxvalid->debug_indent, "" )); \
301 FT_TRACE4( s ); \
302 FT_END_STMNT
303
304#else /* !FT_DEBUG_LEVEL_TRACE */
305
306#define GXV_INIT do { } while ( 0 )
307#define GXV_NAME_ENTER( name ) do { } while ( 0 )
308#define GXV_EXIT do { } while ( 0 )
309
310#define GXV_TRACE( s ) do { } while ( 0 )
311
312#endif /* !FT_DEBUG_LEVEL_TRACE */
313
314
315 /*************************************************************************/
316 /*************************************************************************/
317 /***** *****/
318 /***** 32bit alignment checking *****/
319 /***** *****/
320 /*************************************************************************/
321 /*************************************************************************/
322
323#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
324 FT_BEGIN_STMNT \
325 { \
326 if ( (a) & 3 ) \
327 FT_INVALID_OFFSET; \
328 } \
329 FT_END_STMNT
330
331
332 /*************************************************************************/
333 /*************************************************************************/
334 /***** *****/
335 /***** Dumping Binary Data *****/
336 /***** *****/
337 /*************************************************************************/
338 /*************************************************************************/
339
340#define GXV_TRACE_HEXDUMP( p, len ) \
341 FT_BEGIN_STMNT \
342 { \
343 FT_Bytes b; \
344 \
345 \
346 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
347 FT_TRACE1(("\\x%02x", *b)); \
348 } \
349 FT_END_STMNT
350
351#define GXV_TRACE_HEXDUMP_C( p, len ) \
352 FT_BEGIN_STMNT \
353 { \
354 FT_Bytes b; \
355 \
356 \
357 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
358 if ( 0x40 < *b && *b < 0x7E ) \
359 FT_TRACE1(("%c", *b)); \
360 else \
361 FT_TRACE1(("\\x%02x", *b)); \
362 } \
363 FT_END_STMNT
364
365#define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \
366 GXV_TRACE_HEXDUMP( n.string, n.string_len )
367
368
369 /*************************************************************************/
370 /*************************************************************************/
371 /***** *****/
372 /***** LOOKUP TABLE *****/
373 /***** *****/
374 /*************************************************************************/
375 /*************************************************************************/
376
377 FT_LOCAL( void )
378 gxv_BinSrchHeader_validate( FT_Bytes p,
379 FT_Bytes limit,
380 FT_UShort* unitSize_p,
381 FT_UShort* nUnits_p,
382 GXV_Validator gxvalid );
383
384 FT_LOCAL( void )
385 gxv_LookupTable_validate( FT_Bytes table,
386 FT_Bytes limit,
387 GXV_Validator gxvalid );
388
389
390 /*************************************************************************/
391 /*************************************************************************/
392 /***** *****/
393 /***** Glyph ID *****/
394 /***** *****/
395 /*************************************************************************/
396 /*************************************************************************/
397
398 FT_LOCAL( FT_Int )
399 gxv_glyphid_validate( FT_UShort gid,
400 GXV_Validator gxvalid );
401
402
403 /*************************************************************************/
404 /*************************************************************************/
405 /***** *****/
406 /***** CONTROL POINT *****/
407 /***** *****/
408 /*************************************************************************/
409 /*************************************************************************/
410
411 FT_LOCAL( void )
412 gxv_ctlPoint_validate( FT_UShort gid,
413 FT_UShort ctl_point,
414 GXV_Validator gxvalid );
415
416
417 /*************************************************************************/
418 /*************************************************************************/
419 /***** *****/
420 /***** SFNT NAME *****/
421 /***** *****/
422 /*************************************************************************/
423 /*************************************************************************/
424
425 FT_LOCAL( void )
426 gxv_sfntName_validate( FT_UShort name_index,
427 FT_UShort min_index,
428 FT_UShort max_index,
429 GXV_Validator gxvalid );
430
431
432 /*************************************************************************/
433 /*************************************************************************/
434 /***** *****/
435 /***** STATE TABLE *****/
436 /***** *****/
437 /*************************************************************************/
438 /*************************************************************************/
439
440 FT_LOCAL( void )
441 gxv_StateTable_subtable_setup( FT_UShort table_size,
442 FT_UShort classTable,
443 FT_UShort stateArray,
444 FT_UShort entryTable,
445 FT_UShort* classTable_length_p,
446 FT_UShort* stateArray_length_p,
447 FT_UShort* entryTable_length_p,
448 GXV_Validator gxvalid );
449
450 FT_LOCAL( void )
451 gxv_XStateTable_subtable_setup( FT_ULong table_size,
452 FT_ULong classTable,
453 FT_ULong stateArray,
454 FT_ULong entryTable,
455 FT_ULong* classTable_length_p,
456 FT_ULong* stateArray_length_p,
457 FT_ULong* entryTable_length_p,
458 GXV_Validator gxvalid );
459
460 FT_LOCAL( void )
461 gxv_StateTable_validate( FT_Bytes table,
462 FT_Bytes limit,
463 GXV_Validator gxvalid );
464
465 FT_LOCAL( void )
466 gxv_XStateTable_validate( FT_Bytes table,
467 FT_Bytes limit,
468 GXV_Validator gxvalid );
469
470
471 /*************************************************************************/
472 /*************************************************************************/
473 /***** *****/
474 /***** UTILITY MACROS AND FUNCTIONS *****/
475 /***** *****/
476 /*************************************************************************/
477 /*************************************************************************/
478
479 FT_LOCAL( void )
480 gxv_array_getlimits_byte( FT_Bytes table,
481 FT_Bytes limit,
482 FT_Byte* min,
483 FT_Byte* max,
484 GXV_Validator gxvalid );
485
486 FT_LOCAL( void )
487 gxv_array_getlimits_ushort( FT_Bytes table,
488 FT_Bytes limit,
489 FT_UShort* min,
490 FT_UShort* max,
491 GXV_Validator gxvalid );
492
493 FT_LOCAL( void )
494 gxv_set_length_by_ushort_offset( FT_UShort* offset,
495 FT_UShort** length,
496 FT_UShort* buff,
497 FT_UInt nmemb,
498 FT_UShort limit,
499 GXV_Validator gxvalid );
500
501 FT_LOCAL( void )
502 gxv_set_length_by_ulong_offset( FT_ULong* offset,
503 FT_ULong** length,
504 FT_ULong* buff,
505 FT_UInt nmemb,
506 FT_ULong limit,
507 GXV_Validator gxvalid);
508
509
510#define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \
511 FT_BEGIN_STMNT \
512 if ( (_offset) > gxvalid->subtable_length ) \
513 FT_INVALID_OFFSET; \
514 FT_END_STMNT
515
516#define GXV_SUBTABLE_LIMIT_CHECK( _count ) \
517 FT_BEGIN_STMNT \
518 if ( ( p + (_count) - gxvalid->subtable_start ) > \
519 gxvalid->subtable_length ) \
520 FT_INVALID_TOO_SHORT; \
521 FT_END_STMNT
522
523#define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 )
524#define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE
525
526#define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 )
527#define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE
528
529
530 /*************************************************************************/
531 /*************************************************************************/
532 /***** *****/
533 /***** Table overlapping *****/
534 /***** *****/
535 /*************************************************************************/
536 /*************************************************************************/
537
538 typedef struct GXV_odtect_DataRec_
539 {
540 FT_Bytes start;
541 FT_ULong length;
542 FT_String* name;
543
544 } GXV_odtect_DataRec, *GXV_odtect_Data;
545
546 typedef struct GXV_odtect_RangeRec_
547 {
548 FT_UInt nRanges;
549 GXV_odtect_Data range;
550
551 } GXV_odtect_RangeRec, *GXV_odtect_Range;
552
553
554 FT_LOCAL( void )
555 gxv_odtect_add_range( FT_Bytes start,
556 FT_ULong length,
557 const FT_String* name,
558 GXV_odtect_Range odtect );
559
560 FT_LOCAL( void )
561 gxv_odtect_validate( GXV_odtect_Range odtect,
562 GXV_Validator gxvalid );
563
564
565#define GXV_ODTECT( n, odtect ) \
566 GXV_odtect_DataRec odtect ## _range[n]; \
567 GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \
568 GXV_odtect_Range odtect = NULL
569
570#define GXV_ODTECT_INIT( odtect ) \
571 FT_BEGIN_STMNT \
572 odtect ## _rec.nRanges = 0; \
573 odtect ## _rec.range = odtect ## _range; \
574 odtect = & odtect ## _rec; \
575 FT_END_STMNT
576
577
578 /* */
579
580FT_END_HEADER
581
582#endif /* GXVCOMMN_H_ */
583
584
585/* END */