1 /***************************************************************************/
5 /* TrueTypeGX/AAT common tables validation (specification). */
7 /* Copyright 2004-2017 by */
8 /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
9 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
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. */
17 /***************************************************************************/
19 /***************************************************************************/
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. */
25 /***************************************************************************/
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.
38 * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
48 #include FT_INTERNAL_DEBUG_H
49 #include FT_SFNT_NAMES_H
55 /* some variables are not evaluated or only used in trace */
57 #ifdef FT_DEBUG_LEVEL_TRACE
58 #define GXV_LOAD_TRACE_VARS
60 #undef GXV_LOAD_TRACE_VARS
63 #undef GXV_LOAD_UNUSED_VARS /* debug purpose */
65 #define IS_PARANOID_VALIDATION ( gxvalid->root->level >= FT_VALIDATE_PARANOID )
66 #define GXV_SET_ERR_IF_PARANOID( err ) { if ( IS_PARANOID_VALIDATION ) ( err ); }
68 /*************************************************************************/
69 /*************************************************************************/
71 /***** VALIDATION *****/
73 /*************************************************************************/
74 /*************************************************************************/
76 typedef struct GXV_ValidatorRec_* GXV_Validator;
82 (*GXV_Validate_Func)( FT_Bytes table,
84 GXV_Validator gxvalid );
87 /* ====================== LookupTable Validator ======================== */
89 typedef union GXV_LookupValueDesc_
94 } GXV_LookupValueDesc;
96 typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
98 typedef enum GXV_LookupValue_SignSpec_
100 GXV_LOOKUPVALUE_UNSIGNED = 0,
101 GXV_LOOKUPVALUE_SIGNED
103 } GXV_LookupValue_SignSpec;
107 (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph,
108 GXV_LookupValueCPtr value_p,
109 GXV_Validator gxvalid );
111 typedef GXV_LookupValueDesc
112 (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex,
113 GXV_LookupValueCPtr base_value_p,
114 FT_Bytes lookuptbl_limit,
115 GXV_Validator gxvalid );
118 /* ====================== StateTable Validator ========================= */
120 typedef enum GXV_GlyphOffset_Format_
122 GXV_GLYPHOFFSET_NONE = -1,
123 GXV_GLYPHOFFSET_UCHAR = 2,
124 GXV_GLYPHOFFSET_CHAR,
125 GXV_GLYPHOFFSET_USHORT = 4,
126 GXV_GLYPHOFFSET_SHORT,
127 GXV_GLYPHOFFSET_ULONG = 8,
130 } GXV_GlyphOffset_Format;
133 #define GXV_GLYPHOFFSET_FMT( table ) \
134 ( gxvalid->table.entry_glyphoffset_fmt )
136 #define GXV_GLYPHOFFSET_SIZE( table ) \
137 ( gxvalid->table.entry_glyphoffset_fmt / 2 )
140 /* ----------------------- 16bit StateTable ---------------------------- */
142 typedef union GXV_StateTable_GlyphOffsetDesc_
145 FT_UShort u; /* same as GXV_LookupValueDesc */
148 FT_Short s; /* same as GXV_LookupValueDesc */
151 } GXV_StateTable_GlyphOffsetDesc;
153 typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
156 (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size,
157 FT_UShort classTable,
158 FT_UShort stateArray,
159 FT_UShort entryTable,
160 FT_UShort* classTable_length_p,
161 FT_UShort* stateArray_length_p,
162 FT_UShort* entryTable_length_p,
163 GXV_Validator gxvalid );
166 (*GXV_StateTable_Entry_Validate_Func)(
169 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
170 FT_Bytes statetable_table,
171 FT_Bytes statetable_limit,
172 GXV_Validator gxvalid );
175 (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table,
177 GXV_Validator gxvalid );
179 typedef struct GXV_StateTable_ValidatorRec_
181 GXV_GlyphOffset_Format entry_glyphoffset_fmt;
184 GXV_StateTable_Subtable_Setup_Func subtable_setup_func;
185 GXV_StateTable_Entry_Validate_Func entry_validate_func;
186 GXV_StateTable_OptData_Load_Func optdata_load_func;
188 } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
191 /* ---------------------- 32bit XStateTable ---------------------------- */
193 typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc;
195 typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
198 (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size,
202 FT_ULong* classTable_length_p,
203 FT_ULong* stateArray_length_p,
204 FT_ULong* entryTable_length_p,
205 GXV_Validator gxvalid );
208 (*GXV_XStateTable_Entry_Validate_Func)(
211 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
212 FT_Bytes xstatetable_table,
213 FT_Bytes xstatetable_limit,
214 GXV_Validator gxvalid );
217 typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func;
220 typedef struct GXV_XStateTable_ValidatorRec_
222 int entry_glyphoffset_fmt;
225 GXV_XStateTable_Subtable_Setup_Func subtable_setup_func;
226 GXV_XStateTable_Entry_Validate_Func entry_validate_func;
227 GXV_XStateTable_OptData_Load_Func optdata_load_func;
230 FT_UShort maxClassID;
232 } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
235 /* ===================================================================== */
237 typedef struct GXV_ValidatorRec_
244 FT_ULong subtable_length;
246 GXV_LookupValue_SignSpec lookupval_sign;
247 GXV_Lookup_Value_Validate_Func lookupval_func;
248 GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans;
249 FT_Bytes lookuptbl_head;
254 GXV_StateTable_ValidatorRec statetable;
255 GXV_XStateTable_ValidatorRec xstatetable;
257 #ifdef FT_DEBUG_LEVEL_TRACE
258 FT_UInt debug_indent;
259 const FT_String* debug_function_name[3];
265 #define GXV_TABLE_DATA( tag, field ) \
266 ( ( (GXV_ ## tag ## _Data)gxvalid->table_data )->field )
269 #define FT_INVALID_( _error ) \
270 ft_validator_error( gxvalid->root, FT_THROW( _error ) )
272 #define GXV_LIMIT_CHECK( _count ) \
274 if ( p + _count > ( limit? limit : gxvalid->root->limit ) ) \
275 FT_INVALID_TOO_SHORT; \
279 #ifdef FT_DEBUG_LEVEL_TRACE
281 #define GXV_INIT gxvalid->debug_indent = 0
283 #define GXV_NAME_ENTER( name ) \
285 gxvalid->debug_indent += 2; \
286 FT_TRACE4(( "%*.s", gxvalid->debug_indent, 0 )); \
287 FT_TRACE4(( "%s table\n", name )); \
290 #define GXV_EXIT gxvalid->debug_indent -= 2
292 #define GXV_TRACE( s ) \
294 FT_TRACE4(( "%*.s", gxvalid->debug_indent, 0 )); \
298 #else /* !FT_DEBUG_LEVEL_TRACE */
300 #define GXV_INIT do { } while ( 0 )
301 #define GXV_NAME_ENTER( name ) do { } while ( 0 )
302 #define GXV_EXIT do { } while ( 0 )
304 #define GXV_TRACE( s ) do { } while ( 0 )
306 #endif /* !FT_DEBUG_LEVEL_TRACE */
309 /*************************************************************************/
310 /*************************************************************************/
312 /***** 32bit alignment checking *****/
314 /*************************************************************************/
315 /*************************************************************************/
317 #define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
326 /*************************************************************************/
327 /*************************************************************************/
329 /***** Dumping Binary Data *****/
331 /*************************************************************************/
332 /*************************************************************************/
334 #define GXV_TRACE_HEXDUMP( p, len ) \
340 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
341 FT_TRACE1(("\\x%02x", *b)); \
345 #define GXV_TRACE_HEXDUMP_C( p, len ) \
351 for ( b = p; b < (FT_Bytes)p + len; b++ ) \
352 if ( 0x40 < *b && *b < 0x7E ) \
353 FT_TRACE1(("%c", *b)); \
355 FT_TRACE1(("\\x%02x", *b)); \
359 #define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \
360 GXV_TRACE_HEXDUMP( n.string, n.string_len )
363 /*************************************************************************/
364 /*************************************************************************/
366 /***** LOOKUP TABLE *****/
368 /*************************************************************************/
369 /*************************************************************************/
372 gxv_BinSrchHeader_validate( FT_Bytes p,
374 FT_UShort* unitSize_p,
376 GXV_Validator gxvalid );
379 gxv_LookupTable_validate( FT_Bytes table,
381 GXV_Validator gxvalid );
384 /*************************************************************************/
385 /*************************************************************************/
387 /***** Glyph ID *****/
389 /*************************************************************************/
390 /*************************************************************************/
393 gxv_glyphid_validate( FT_UShort gid,
394 GXV_Validator gxvalid );
397 /*************************************************************************/
398 /*************************************************************************/
400 /***** CONTROL POINT *****/
402 /*************************************************************************/
403 /*************************************************************************/
406 gxv_ctlPoint_validate( FT_UShort gid,
408 GXV_Validator gxvalid );
411 /*************************************************************************/
412 /*************************************************************************/
414 /***** SFNT NAME *****/
416 /*************************************************************************/
417 /*************************************************************************/
420 gxv_sfntName_validate( FT_UShort name_index,
423 GXV_Validator gxvalid );
426 /*************************************************************************/
427 /*************************************************************************/
429 /***** STATE TABLE *****/
431 /*************************************************************************/
432 /*************************************************************************/
435 gxv_StateTable_subtable_setup( FT_UShort table_size,
436 FT_UShort classTable,
437 FT_UShort stateArray,
438 FT_UShort entryTable,
439 FT_UShort* classTable_length_p,
440 FT_UShort* stateArray_length_p,
441 FT_UShort* entryTable_length_p,
442 GXV_Validator gxvalid );
445 gxv_XStateTable_subtable_setup( FT_ULong table_size,
449 FT_ULong* classTable_length_p,
450 FT_ULong* stateArray_length_p,
451 FT_ULong* entryTable_length_p,
452 GXV_Validator gxvalid );
455 gxv_StateTable_validate( FT_Bytes table,
457 GXV_Validator gxvalid );
460 gxv_XStateTable_validate( FT_Bytes table,
462 GXV_Validator gxvalid );
465 /*************************************************************************/
466 /*************************************************************************/
468 /***** UTILITY MACROS AND FUNCTIONS *****/
470 /*************************************************************************/
471 /*************************************************************************/
474 gxv_array_getlimits_byte( FT_Bytes table,
478 GXV_Validator gxvalid );
481 gxv_array_getlimits_ushort( FT_Bytes table,
485 GXV_Validator gxvalid );
488 gxv_set_length_by_ushort_offset( FT_UShort* offset,
493 GXV_Validator gxvalid );
496 gxv_set_length_by_ulong_offset( FT_ULong* offset,
501 GXV_Validator gxvalid);
504 #define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \
506 if ( (_offset) > gxvalid->subtable_length ) \
510 #define GXV_SUBTABLE_LIMIT_CHECK( _count ) \
512 if ( ( p + (_count) - gxvalid->subtable_start ) > \
513 gxvalid->subtable_length ) \
514 FT_INVALID_TOO_SHORT; \
517 #define GXV_USHORT_TO_SHORT( _us ) \
518 ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
520 #define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 )
521 #define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE
523 #define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 )
524 #define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE
527 /*************************************************************************/
528 /*************************************************************************/
530 /***** Table overlapping *****/
532 /*************************************************************************/
533 /*************************************************************************/
535 typedef struct GXV_odtect_DataRec_
541 } GXV_odtect_DataRec, *GXV_odtect_Data;
543 typedef struct GXV_odtect_RangeRec_
546 GXV_odtect_Data range;
548 } GXV_odtect_RangeRec, *GXV_odtect_Range;
552 gxv_odtect_add_range( FT_Bytes start,
554 const FT_String* name,
555 GXV_odtect_Range odtect );
558 gxv_odtect_validate( GXV_odtect_Range odtect,
559 GXV_Validator gxvalid );
562 #define GXV_ODTECT( n, odtect ) \
563 GXV_odtect_DataRec odtect ## _range[n]; \
564 GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \
565 GXV_odtect_Range odtect = NULL
567 #define GXV_ODTECT_INIT( odtect ) \
569 odtect ## _rec.nRanges = 0; \
570 odtect ## _rec.range = odtect ## _range; \
571 odtect = & odtect ## _rec; \
579 #endif /* GXVCOMMN_H_ */