30#define FT_COMPONENT otvgdef
41#define AttachListFunc otv_O_x_Ox
42#define LigCaretListFunc otv_O_x_Ox
47 otv_O_x_Ox( FT_Bytes table,
48 OTV_Validator otvalid )
53 OTV_Validate_Func func;
59 Coverage = table + FT_NEXT_USHORT( p );
60 GlyphCount = FT_NEXT_USHORT( p );
62 OTV_TRACE((
" (GlyphCount = %u)\n", GlyphCount ));
64 otv_Coverage_validate( Coverage, otvalid, (FT_Int)GlyphCount );
65 if ( GlyphCount != otv_Coverage_get_count( Coverage ) )
68 OTV_LIMIT_CHECK( GlyphCount * 2 );
70 otvalid->nesting_level++;
71 func = otvalid->func[otvalid->nesting_level];
74 for ( ; GlyphCount > 0; GlyphCount-- )
75 func( table + FT_NEXT_USHORT( p ), otvalid );
77 otvalid->nesting_level--;
91#define CaretValueFunc otv_CaretValue_validate
94 otv_CaretValue_validate( FT_Bytes table,
95 OTV_Validator otvalid )
98 FT_UInt CaretValueFormat;
103 OTV_LIMIT_CHECK( 4 );
105 CaretValueFormat = FT_NEXT_USHORT( p );
107 OTV_TRACE((
" (format = %u)\n", CaretValueFormat ));
109 switch ( CaretValueFormat )
122 OTV_LIMIT_CHECK( 2 );
125 otv_Device_validate( table + FT_NEXT_USHORT( p ), otvalid );
145 otv_MarkGlyphSets_validate( FT_Bytes table,
146 OTV_Validator otvalid )
149 FT_UInt MarkGlyphSetCount;
152 OTV_NAME_ENTER(
"MarkGlyphSets" );
156 OTV_LIMIT_CHECK( 2 );
157 MarkGlyphSetCount = FT_NEXT_USHORT( p );
159 OTV_TRACE((
" (MarkGlyphSetCount = %u)\n", MarkGlyphSetCount ));
161 OTV_LIMIT_CHECK( MarkGlyphSetCount * 4 );
163 for ( ; MarkGlyphSetCount > 0; MarkGlyphSetCount-- )
164 otv_Coverage_validate( table + FT_NEXT_ULONG( p ), otvalid, -1 );
181 otv_GDEF_validate( FT_Bytes table,
185 FT_Validator ftvalid )
187 OTV_ValidatorRec otvalidrec;
188 OTV_Validator otvalid = &otvalidrec;
192 FT_Bool need_MarkAttachClassDef = 1;
194 OTV_OPTIONAL_TABLE( GlyphClassDef );
195 OTV_OPTIONAL_TABLE( AttachListOffset );
196 OTV_OPTIONAL_TABLE( LigCaretListOffset );
197 OTV_OPTIONAL_TABLE( MarkAttachClassDef );
198 OTV_OPTIONAL_TABLE( MarkGlyphSetsDef );
200 OTV_OPTIONAL_TABLE32( itemVarStore );
203 otvalid->root = ftvalid;
205 FT_TRACE3((
"validating GDEF table\n" ));
208 OTV_LIMIT_CHECK( 4 );
210 if ( FT_NEXT_USHORT( p ) != 1 )
213 version = FT_NEXT_USHORT( p );
224 need_MarkAttachClassDef = FT_BOOL(
225 otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
226 otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
228 if ( need_MarkAttachClassDef )
230 OTV_LIMIT_CHECK( 8 );
234 OTV_LIMIT_CHECK( 6 );
239 OTV_LIMIT_CHECK( 10 );
244 OTV_LIMIT_CHECK( 14 );
252 otvalid->glyph_count = glyph_count;
254 OTV_OPTIONAL_OFFSET( GlyphClassDef );
255 OTV_SIZE_CHECK( GlyphClassDef );
257 otv_ClassDef_validate( table + GlyphClassDef, otvalid );
259 OTV_OPTIONAL_OFFSET( AttachListOffset );
260 OTV_SIZE_CHECK( AttachListOffset );
261 if ( AttachListOffset )
263 OTV_NEST2( AttachList, AttachPoint );
264 OTV_RUN( table + AttachListOffset, otvalid );
267 OTV_OPTIONAL_OFFSET( LigCaretListOffset );
268 OTV_SIZE_CHECK( LigCaretListOffset );
269 if ( LigCaretListOffset )
271 OTV_NEST3( LigCaretList, LigGlyph, CaretValue );
272 OTV_RUN( table + LigCaretListOffset, otvalid );
275 if ( need_MarkAttachClassDef )
277 OTV_OPTIONAL_OFFSET( MarkAttachClassDef );
278 OTV_SIZE_CHECK( MarkAttachClassDef );
279 if ( MarkAttachClassDef )
280 otv_ClassDef_validate( table + MarkAttachClassDef, otvalid );
285 OTV_OPTIONAL_OFFSET( MarkGlyphSetsDef );
286 OTV_SIZE_CHECK( MarkGlyphSetsDef );
287 if ( MarkGlyphSetsDef )
288 otv_MarkGlyphSets_validate( table + MarkGlyphSetsDef, otvalid );
293 OTV_OPTIONAL_OFFSET32( itemVarStore );
294 OTV_SIZE_CHECK32( itemVarStore );
296 OTV_TRACE((
" [omitting itemVarStore validation]\n" ));