44 typedef void (*OTV_Validate_Func)( FT_Bytes table,
45 OTV_Validator otvalid );
51 OTV_Validate_Func* type_funcs;
56 FT_UInt nesting_level;
58 OTV_Validate_Func func[3];
64#ifdef FT_DEBUG_LEVEL_TRACE
66 const FT_String* debug_function_name[3];
73#define FT_INVALID_( _error ) \
74 ft_validator_error( otvalid->root, FT_THROW( _error ) )
76#define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \
79#define OTV_OPTIONAL_TABLE32( _table ) FT_ULong _table; \
82#define OTV_OPTIONAL_OFFSET( _offset ) \
85 _offset = FT_NEXT_USHORT( p ); \
88#define OTV_OPTIONAL_OFFSET32( _offset ) \
91 _offset = FT_NEXT_ULONG( p ); \
94#define OTV_LIMIT_CHECK( _count ) \
96 if ( p + (_count) > otvalid->root->limit ) \
97 FT_INVALID_TOO_SHORT; \
100#define OTV_SIZE_CHECK( _size ) \
102 if ( _size > 0 && _size < table_size ) \
104 if ( otvalid->root->level == FT_VALIDATE_PARANOID ) \
109 FT_Byte* pp = (FT_Byte*)_size ## _p; \
112 FT_TRACE3(( "\n" )); \
113 FT_TRACE3(( "Invalid offset to optional table `%s'" \
116 FT_TRACE3(( "\n" )); \
118 _size = pp[0] = pp[1] = 0; \
123#define OTV_SIZE_CHECK32( _size ) \
125 if ( _size > 0 && _size < table_size ) \
127 if ( otvalid->root->level == FT_VALIDATE_PARANOID ) \
132 FT_Byte* pp = (FT_Byte*)_size ## _p; \
135 FT_TRACE3(( "\n" )); \
136 FT_TRACE3(( "Invalid offset to optional table `%s'" \
139 FT_TRACE3(( "\n" )); \
141 _size = pp[0] = pp[1] = pp[2] = pp[3] = 0; \
147#define OTV_NAME_(x) #x
148#define OTV_NAME(x) OTV_NAME_(x)
150#define OTV_FUNC_(x) x##Func
151#define OTV_FUNC(x) OTV_FUNC_(x)
153#ifdef FT_DEBUG_LEVEL_TRACE
155#define OTV_NEST1( x ) \
157 otvalid->nesting_level = 0; \
158 otvalid->func[0] = OTV_FUNC( x ); \
159 otvalid->debug_function_name[0] = OTV_NAME( x ); \
162#define OTV_NEST2( x, y ) \
164 otvalid->nesting_level = 0; \
165 otvalid->func[0] = OTV_FUNC( x ); \
166 otvalid->func[1] = OTV_FUNC( y ); \
167 otvalid->debug_function_name[0] = OTV_NAME( x ); \
168 otvalid->debug_function_name[1] = OTV_NAME( y ); \
171#define OTV_NEST3( x, y, z ) \
173 otvalid->nesting_level = 0; \
174 otvalid->func[0] = OTV_FUNC( x ); \
175 otvalid->func[1] = OTV_FUNC( y ); \
176 otvalid->func[2] = OTV_FUNC( z ); \
177 otvalid->debug_function_name[0] = OTV_NAME( x ); \
178 otvalid->debug_function_name[1] = OTV_NAME( y ); \
179 otvalid->debug_function_name[2] = OTV_NAME( z ); \
182#define OTV_INIT otvalid->debug_indent = 0
186 otvalid->debug_indent += 2; \
187 FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \
188 FT_TRACE4(( "%s table\n", \
189 otvalid->debug_function_name[otvalid->nesting_level] )); \
192#define OTV_NAME_ENTER( name ) \
194 otvalid->debug_indent += 2; \
195 FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \
196 FT_TRACE4(( "%s table\n", name )); \
199#define OTV_EXIT otvalid->debug_indent -= 2
201#define OTV_TRACE( s ) \
203 FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \
209#define OTV_NEST1( x ) \
211 otvalid->nesting_level = 0; \
212 otvalid->func[0] = OTV_FUNC( x ); \
215#define OTV_NEST2( x, y ) \
217 otvalid->nesting_level = 0; \
218 otvalid->func[0] = OTV_FUNC( x ); \
219 otvalid->func[1] = OTV_FUNC( y ); \
222#define OTV_NEST3( x, y, z ) \
224 otvalid->nesting_level = 0; \
225 otvalid->func[0] = OTV_FUNC( x ); \
226 otvalid->func[1] = OTV_FUNC( y ); \
227 otvalid->func[2] = OTV_FUNC( z ); \
230#define OTV_INIT do { } while ( 0 )
231#define OTV_ENTER do { } while ( 0 )
232#define OTV_NAME_ENTER( name ) do { } while ( 0 )
233#define OTV_EXIT do { } while ( 0 )
235#define OTV_TRACE( s ) do { } while ( 0 )
240#define OTV_RUN otvalid->func[0]
252 otv_Coverage_validate( FT_Bytes table,
253 OTV_Validator otvalid,
254 FT_Int expected_count );
258 otv_Coverage_get_first( FT_Bytes table );
262 otv_Coverage_get_last( FT_Bytes table );
266 otv_Coverage_get_count( FT_Bytes table );
278 otv_ClassDef_validate( FT_Bytes table,
279 OTV_Validator otvalid );
291 otv_Device_validate( FT_Bytes table,
292 OTV_Validator otvalid );
304 otv_Lookup_validate( FT_Bytes table,
305 OTV_Validator otvalid );
308 otv_LookupList_validate( FT_Bytes table,
309 OTV_Validator otvalid );
321 otv_Feature_validate( FT_Bytes table,
322 OTV_Validator otvalid );
326 otv_FeatureList_validate( FT_Bytes table,
328 OTV_Validator otvalid );
340 otv_LangSys_validate( FT_Bytes table,
341 OTV_Validator otvalid );
353 otv_Script_validate( FT_Bytes table,
354 OTV_Validator otvalid );
358 otv_ScriptList_validate( FT_Bytes table,
360 OTV_Validator otvalid );
371#define ChainPosClassSetFunc otv_x_Ox
372#define ChainPosRuleSetFunc otv_x_Ox
373#define ChainSubClassSetFunc otv_x_Ox
374#define ChainSubRuleSetFunc otv_x_Ox
375#define JstfLangSysFunc otv_x_Ox
376#define JstfMaxFunc otv_x_Ox
377#define LigGlyphFunc otv_x_Ox
378#define LigatureArrayFunc otv_x_Ox
379#define LigatureSetFunc otv_x_Ox
380#define PosClassSetFunc otv_x_Ox
381#define PosRuleSetFunc otv_x_Ox
382#define SubClassSetFunc otv_x_Ox
383#define SubRuleSetFunc otv_x_Ox
386 otv_x_Ox ( FT_Bytes table,
387 OTV_Validator otvalid );
389#define AlternateSubstFormat1Func otv_u_C_x_Ox
390#define ChainContextPosFormat1Func otv_u_C_x_Ox
391#define ChainContextSubstFormat1Func otv_u_C_x_Ox
392#define ContextPosFormat1Func otv_u_C_x_Ox
393#define ContextSubstFormat1Func otv_u_C_x_Ox
394#define LigatureSubstFormat1Func otv_u_C_x_Ox
395#define MultipleSubstFormat1Func otv_u_C_x_Ox
398 otv_u_C_x_Ox( FT_Bytes table,
399 OTV_Validator otvalid );
401#define AlternateSetFunc otv_x_ux
402#define AttachPointFunc otv_x_ux
403#define ExtenderGlyphFunc otv_x_ux
404#define JstfGPOSModListFunc otv_x_ux
405#define JstfGSUBModListFunc otv_x_ux
406#define SequenceFunc otv_x_ux
409 otv_x_ux( FT_Bytes table,
410 OTV_Validator otvalid );
412#define PosClassRuleFunc otv_x_y_ux_sy
413#define PosRuleFunc otv_x_y_ux_sy
414#define SubClassRuleFunc otv_x_y_ux_sy
415#define SubRuleFunc otv_x_y_ux_sy
418 otv_x_y_ux_sy( FT_Bytes table,
419 OTV_Validator otvalid );
421#define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
422#define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp
423#define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
424#define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp
427 otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table,
428 OTV_Validator otvalid );
430#define ContextPosFormat2Func otv_u_O_O_x_Onx
431#define ContextSubstFormat2Func otv_u_O_O_x_Onx
434 otv_u_O_O_x_Onx( FT_Bytes table,
435 OTV_Validator otvalid );
437#define ContextPosFormat3Func otv_u_x_y_Ox_sy
438#define ContextSubstFormat3Func otv_u_x_y_Ox_sy
441 otv_u_x_y_Ox_sy( FT_Bytes table,
442 OTV_Validator otvalid );
444#define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx
445#define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx
448 otv_u_O_O_O_O_x_Onx( FT_Bytes table,
449 OTV_Validator otvalid );
451#define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
452#define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
455 otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table,
456 OTV_Validator otvalid );
460 otv_GSUBGPOS_get_Lookup_count( FT_Bytes table );
463 otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table );