33#define FT_COMPONENT otvmath
46 otv_MathConstants_validate( FT_Bytes table,
47 OTV_Validator otvalid )
53 OTV_OPTIONAL_TABLE( DeviceTableOffset );
56 OTV_NAME_ENTER(
"MathConstants" );
59 OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) );
60 table_size = 2 * ( 56 + 51 );
63 for ( i = 0; i < 51; i++ )
66 OTV_OPTIONAL_OFFSET( DeviceTableOffset );
67 OTV_SIZE_CHECK( DeviceTableOffset );
68 if ( DeviceTableOffset )
69 otv_Device_validate( table + DeviceTableOffset, otvalid );
86 otv_MathItalicsCorrectionInfo_validate( FT_Bytes table,
87 OTV_Validator otvalid,
91 FT_UInt i, cnt, table_size;
93 OTV_OPTIONAL_TABLE( Coverage );
94 OTV_OPTIONAL_TABLE( DeviceTableOffset );
96 FT_UNUSED( isItalic );
99 OTV_NAME_ENTER( isItalic ?
"MathItalicsCorrectionInfo"
100 :
"MathTopAccentAttachment" );
102 OTV_LIMIT_CHECK( 4 );
104 OTV_OPTIONAL_OFFSET( Coverage );
105 cnt = FT_NEXT_USHORT( p );
107 OTV_LIMIT_CHECK( 4 * cnt );
108 table_size = 4 + 4 * cnt;
110 OTV_SIZE_CHECK( Coverage );
111 otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt );
113 for ( i = 0; i < cnt; i++ )
116 OTV_OPTIONAL_OFFSET( DeviceTableOffset );
117 OTV_SIZE_CHECK( DeviceTableOffset );
118 if ( DeviceTableOffset )
119 otv_Device_validate( table + DeviceTableOffset, otvalid );
135 otv_MathKern_validate( FT_Bytes table,
136 OTV_Validator otvalid )
139 FT_UInt i, cnt, table_size;
141 OTV_OPTIONAL_TABLE( DeviceTableOffset );
146 OTV_LIMIT_CHECK( 2 );
148 cnt = FT_NEXT_USHORT( p );
150 OTV_LIMIT_CHECK( 4 * cnt + 2 );
151 table_size = 4 + 4 * cnt;
154 for ( i = 0; i < cnt; i++ )
157 OTV_OPTIONAL_OFFSET( DeviceTableOffset );
158 OTV_SIZE_CHECK( DeviceTableOffset );
159 if ( DeviceTableOffset )
160 otv_Device_validate( table + DeviceTableOffset, otvalid );
164 for ( i = 0; i < cnt + 1; i++ )
167 OTV_OPTIONAL_OFFSET( DeviceTableOffset );
168 OTV_SIZE_CHECK( DeviceTableOffset );
169 if ( DeviceTableOffset )
170 otv_Device_validate( table + DeviceTableOffset, otvalid );
178 otv_MathKernInfo_validate( FT_Bytes table,
179 OTV_Validator otvalid )
182 FT_UInt i, j, cnt, table_size;
184 OTV_OPTIONAL_TABLE( Coverage );
185 OTV_OPTIONAL_TABLE( MKRecordOffset );
188 OTV_NAME_ENTER(
"MathKernInfo" );
190 OTV_LIMIT_CHECK( 4 );
192 OTV_OPTIONAL_OFFSET( Coverage );
193 cnt = FT_NEXT_USHORT( p );
195 OTV_LIMIT_CHECK( 8 * cnt );
196 table_size = 4 + 8 * cnt;
198 OTV_SIZE_CHECK( Coverage );
199 otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt );
201 for ( i = 0; i < cnt; i++ )
203 for ( j = 0; j < 4; j++ )
205 OTV_OPTIONAL_OFFSET( MKRecordOffset );
206 OTV_SIZE_CHECK( MKRecordOffset );
207 if ( MKRecordOffset )
208 otv_MathKern_validate( table + MKRecordOffset, otvalid );
225 otv_MathGlyphInfo_validate( FT_Bytes table,
226 OTV_Validator otvalid )
229 FT_UInt MathItalicsCorrectionInfo, MathTopAccentAttachment;
230 FT_UInt ExtendedShapeCoverage, MathKernInfo;
233 OTV_NAME_ENTER(
"MathGlyphInfo" );
235 OTV_LIMIT_CHECK( 8 );
237 MathItalicsCorrectionInfo = FT_NEXT_USHORT( p );
238 MathTopAccentAttachment = FT_NEXT_USHORT( p );
239 ExtendedShapeCoverage = FT_NEXT_USHORT( p );
240 MathKernInfo = FT_NEXT_USHORT( p );
242 if ( MathItalicsCorrectionInfo )
243 otv_MathItalicsCorrectionInfo_validate(
244 table + MathItalicsCorrectionInfo, otvalid, TRUE );
247 if ( MathTopAccentAttachment )
248 otv_MathItalicsCorrectionInfo_validate(
249 table + MathTopAccentAttachment, otvalid, FALSE );
251 if ( ExtendedShapeCoverage )
253 OTV_NAME_ENTER(
"ExtendedShapeCoverage" );
254 otv_Coverage_validate( table + ExtendedShapeCoverage, otvalid, -1 );
259 otv_MathKernInfo_validate( table + MathKernInfo, otvalid );
274 otv_GlyphAssembly_validate( FT_Bytes table,
275 OTV_Validator otvalid )
278 FT_UInt pcnt, table_size;
281 OTV_OPTIONAL_TABLE( DeviceTableOffset );
286 OTV_LIMIT_CHECK( 6 );
289 OTV_OPTIONAL_OFFSET( DeviceTableOffset );
290 pcnt = FT_NEXT_USHORT( p );
292 OTV_LIMIT_CHECK( 8 * pcnt );
293 table_size = 6 + 8 * pcnt;
295 OTV_SIZE_CHECK( DeviceTableOffset );
296 if ( DeviceTableOffset )
297 otv_Device_validate( table + DeviceTableOffset, otvalid );
299 for ( i = 0; i < pcnt; i++ )
304 gid = FT_NEXT_USHORT( p );
305 if ( gid >= otvalid->glyph_count )
315 otv_MathGlyphConstruction_validate( FT_Bytes table,
316 OTV_Validator otvalid )
319 FT_UInt vcnt, table_size;
322 OTV_OPTIONAL_TABLE( GlyphAssembly );
327 OTV_LIMIT_CHECK( 4 );
329 OTV_OPTIONAL_OFFSET( GlyphAssembly );
330 vcnt = FT_NEXT_USHORT( p );
332 OTV_LIMIT_CHECK( 4 * vcnt );
333 table_size = 4 + 4 * vcnt;
335 for ( i = 0; i < vcnt; i++ )
340 gid = FT_NEXT_USHORT( p );
341 if ( gid >= otvalid->glyph_count )
346 OTV_SIZE_CHECK( GlyphAssembly );
348 otv_GlyphAssembly_validate( table+GlyphAssembly, otvalid );
355 otv_MathVariants_validate( FT_Bytes table,
356 OTV_Validator otvalid )
359 FT_UInt vcnt, hcnt, i, table_size;
361 OTV_OPTIONAL_TABLE( VCoverage );
362 OTV_OPTIONAL_TABLE( HCoverage );
363 OTV_OPTIONAL_TABLE( Offset );
366 OTV_NAME_ENTER(
"MathVariants" );
368 OTV_LIMIT_CHECK( 10 );
371 OTV_OPTIONAL_OFFSET( VCoverage );
372 OTV_OPTIONAL_OFFSET( HCoverage );
373 vcnt = FT_NEXT_USHORT( p );
374 hcnt = FT_NEXT_USHORT( p );
376 OTV_LIMIT_CHECK( 2 * vcnt + 2 * hcnt );
377 table_size = 10 + 2 * vcnt + 2 * hcnt;
379 OTV_SIZE_CHECK( VCoverage );
381 otv_Coverage_validate( table + VCoverage, otvalid, (FT_Int)vcnt );
383 OTV_SIZE_CHECK( HCoverage );
385 otv_Coverage_validate( table + HCoverage, otvalid, (FT_Int)hcnt );
387 for ( i = 0; i < vcnt; i++ )
389 OTV_OPTIONAL_OFFSET( Offset );
390 OTV_SIZE_CHECK( Offset );
391 otv_MathGlyphConstruction_validate( table + Offset, otvalid );
394 for ( i = 0; i < hcnt; i++ )
396 OTV_OPTIONAL_OFFSET( Offset );
397 OTV_SIZE_CHECK( Offset );
398 otv_MathGlyphConstruction_validate( table + Offset, otvalid );
416 otv_MATH_validate( FT_Bytes table,
418 FT_Validator ftvalid )
420 OTV_ValidatorRec otvalidrec;
421 OTV_Validator otvalid = &otvalidrec;
423 FT_UInt MathConstants, MathGlyphInfo, MathVariants;
426 otvalid->root = ftvalid;
428 FT_TRACE3((
"validating MATH table\n" ));
431 OTV_LIMIT_CHECK( 10 );
433 if ( FT_NEXT_ULONG( p ) != 0x10000UL )
436 MathConstants = FT_NEXT_USHORT( p );
437 MathGlyphInfo = FT_NEXT_USHORT( p );
438 MathVariants = FT_NEXT_USHORT( p );
440 otvalid->glyph_count = glyph_count;
442 otv_MathConstants_validate( table + MathConstants,
444 otv_MathGlyphInfo_validate( table + MathGlyphInfo,
446 otv_MathVariants_validate ( table + MathVariants,