29#define FT_COMPONENT otvcommon
41 otv_Coverage_validate( FT_Bytes table,
42 OTV_Validator otvalid,
43 FT_Int expected_count )
46 FT_UInt CoverageFormat;
50 OTV_NAME_ENTER(
"Coverage" );
53 CoverageFormat = FT_NEXT_USHORT( p );
55 OTV_TRACE((
" (format %u)\n", CoverageFormat ));
57 switch ( CoverageFormat )
65 GlyphCount = FT_NEXT_USHORT( p );
67 OTV_TRACE((
" (GlyphCount = %u)\n", GlyphCount ));
69 OTV_LIMIT_CHECK( GlyphCount * 2 );
71 for ( i = 0; i < GlyphCount; i++ )
76 gid = FT_NEXT_USHORT( p );
77 if ( gid >= otvalid->glyph_count )
87 FT_UInt n, RangeCount;
88 FT_UInt Start, End, StartCoverageIndex, last = 0;
91 RangeCount = FT_NEXT_USHORT( p );
93 OTV_TRACE((
" (RangeCount = %u)\n", RangeCount ));
95 OTV_LIMIT_CHECK( RangeCount * 6 );
98 for ( n = 0; n < RangeCount; n++ )
100 Start = FT_NEXT_USHORT( p );
101 End = FT_NEXT_USHORT( p );
102 StartCoverageIndex = FT_NEXT_USHORT( p );
104 if ( Start > End || StartCoverageIndex != total )
107 if ( End >= otvalid->glyph_count )
110 if ( n > 0 && Start <= last )
113 total += End - Start + 1;
126 if ( expected_count != -1 && (FT_UInt)expected_count != total )
133 FT_LOCAL_DEF( FT_UInt )
134 otv_Coverage_get_first( FT_Bytes table )
141 return FT_NEXT_USHORT( p );
145 FT_LOCAL_DEF( FT_UInt )
146 otv_Coverage_get_last( FT_Bytes table )
149 FT_UInt CoverageFormat = FT_NEXT_USHORT( p );
150 FT_UInt count = FT_NEXT_USHORT( p );
157 switch ( CoverageFormat )
160 p += ( count - 1 ) * 2;
161 result = FT_NEXT_USHORT( p );
165 p += ( count - 1 ) * 6 + 2;
166 result = FT_NEXT_USHORT( p );
177 FT_LOCAL_DEF( FT_UInt )
178 otv_Coverage_get_count( FT_Bytes table )
181 FT_UInt CoverageFormat = FT_NEXT_USHORT( p );
182 FT_UInt count = FT_NEXT_USHORT( p );
186 switch ( CoverageFormat )
196 for ( ; count > 0; count-- )
198 Start = FT_NEXT_USHORT( p );
199 End = FT_NEXT_USHORT( p );
202 result += End - Start + 1;
224 otv_ClassDef_validate( FT_Bytes table,
225 OTV_Validator otvalid )
231 OTV_NAME_ENTER(
"ClassDef" );
233 OTV_LIMIT_CHECK( 4 );
234 ClassFormat = FT_NEXT_USHORT( p );
236 OTV_TRACE((
" (format %u)\n", ClassFormat ));
238 switch ( ClassFormat )
246 OTV_LIMIT_CHECK( 4 );
248 StartGlyph = FT_NEXT_USHORT( p );
249 GlyphCount = FT_NEXT_USHORT( p );
251 OTV_TRACE((
" (GlyphCount = %u)\n", GlyphCount ));
253 OTV_LIMIT_CHECK( GlyphCount * 2 );
255 if ( StartGlyph + GlyphCount - 1 >= otvalid->glyph_count )
262 FT_UInt n, ClassRangeCount;
263 FT_UInt Start, End, last = 0;
266 ClassRangeCount = FT_NEXT_USHORT( p );
268 OTV_TRACE((
" (ClassRangeCount = %u)\n", ClassRangeCount ));
270 OTV_LIMIT_CHECK( ClassRangeCount * 6 );
273 for ( n = 0; n < ClassRangeCount; n++ )
275 Start = FT_NEXT_USHORT( p );
276 End = FT_NEXT_USHORT( p );
279 if ( Start > End || ( n > 0 && Start <= last ) )
282 if ( End >= otvalid->glyph_count )
310 otv_Device_validate( FT_Bytes table,
311 OTV_Validator otvalid )
314 FT_UInt StartSize, EndSize, DeltaFormat, count;
317 OTV_NAME_ENTER(
"Device" );
319 OTV_LIMIT_CHECK( 6 );
320 StartSize = FT_NEXT_USHORT( p );
321 EndSize = FT_NEXT_USHORT( p );
322 DeltaFormat = FT_NEXT_USHORT( p );
324 if ( DeltaFormat == 0x8000U )
330 if ( DeltaFormat < 1 || DeltaFormat > 3 )
333 if ( EndSize < StartSize )
336 count = EndSize - StartSize + 1;
337 OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 );
356 otv_Lookup_validate( FT_Bytes table,
357 OTV_Validator otvalid )
360 FT_UInt LookupType, LookupFlag, SubTableCount;
361 OTV_Validate_Func validate;
364 OTV_NAME_ENTER(
"Lookup" );
366 OTV_LIMIT_CHECK( 6 );
367 LookupType = FT_NEXT_USHORT( p );
368 LookupFlag = FT_NEXT_USHORT( p );
369 SubTableCount = FT_NEXT_USHORT( p );
371 OTV_TRACE((
" (type %u)\n", LookupType ));
373 if ( LookupType == 0 || LookupType > otvalid->type_count )
376 validate = otvalid->type_funcs[LookupType - 1];
378 OTV_TRACE((
" (SubTableCount = %u)\n", SubTableCount ));
380 OTV_LIMIT_CHECK( SubTableCount * 2 );
383 for ( ; SubTableCount > 0; SubTableCount-- )
384 validate( table + FT_NEXT_USHORT( p ), otvalid );
386 if ( LookupFlag & 0x10 )
387 OTV_LIMIT_CHECK( 2 );
396 otv_LookupList_validate( FT_Bytes table,
397 OTV_Validator otvalid )
403 OTV_NAME_ENTER(
"LookupList" );
405 OTV_LIMIT_CHECK( 2 );
406 LookupCount = FT_NEXT_USHORT( p );
408 OTV_TRACE((
" (LookupCount = %u)\n", LookupCount ));
410 OTV_LIMIT_CHECK( LookupCount * 2 );
412 otvalid->lookup_count = LookupCount;
415 for ( ; LookupCount > 0; LookupCount-- )
416 otv_Lookup_validate( table + FT_NEXT_USHORT( p ), otvalid );
423 otv_LookupList_get_count( FT_Bytes table )
425 return FT_NEXT_USHORT( table );
440 otv_Feature_validate( FT_Bytes table,
441 OTV_Validator otvalid )
447 OTV_NAME_ENTER(
"Feature" );
449 OTV_LIMIT_CHECK( 4 );
451 LookupCount = FT_NEXT_USHORT( p );
453 OTV_TRACE((
" (LookupCount = %u)\n", LookupCount ));
455 OTV_LIMIT_CHECK( LookupCount * 2 );
458 for ( ; LookupCount > 0; LookupCount-- )
459 if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count )
467 otv_Feature_get_count( FT_Bytes table )
469 return FT_NEXT_USHORT( table );
476 otv_FeatureList_validate( FT_Bytes table,
478 OTV_Validator otvalid )
481 FT_UInt FeatureCount;
484 OTV_NAME_ENTER(
"FeatureList" );
486 OTV_LIMIT_CHECK( 2 );
487 FeatureCount = FT_NEXT_USHORT( p );
489 OTV_TRACE((
" (FeatureCount = %u)\n", FeatureCount ));
491 OTV_LIMIT_CHECK( FeatureCount * 2 );
493 otvalid->lookup_count = otv_LookupList_get_count( lookups );
496 for ( ; FeatureCount > 0; FeatureCount-- )
501 otv_Feature_validate( table + FT_NEXT_USHORT( p ), otvalid );
520 otv_LangSys_validate( FT_Bytes table,
521 OTV_Validator otvalid )
524 FT_UInt ReqFeatureIndex;
525 FT_UInt FeatureCount;
528 OTV_NAME_ENTER(
"LangSys" );
530 OTV_LIMIT_CHECK( 6 );
532 ReqFeatureIndex = FT_NEXT_USHORT( p );
533 FeatureCount = FT_NEXT_USHORT( p );
535 OTV_TRACE((
" (ReqFeatureIndex = %u)\n", ReqFeatureIndex ));
536 OTV_TRACE((
" (FeatureCount = %u)\n", FeatureCount ));
538 if ( ReqFeatureIndex != 0xFFFFU && ReqFeatureIndex >= otvalid->extra1 )
541 OTV_LIMIT_CHECK( FeatureCount * 2 );
544 for ( ; FeatureCount > 0; FeatureCount-- )
545 if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 )
561 otv_Script_validate( FT_Bytes table,
562 OTV_Validator otvalid )
564 FT_UInt DefaultLangSys, LangSysCount;
568 OTV_NAME_ENTER(
"Script" );
570 OTV_LIMIT_CHECK( 4 );
571 DefaultLangSys = FT_NEXT_USHORT( p );
572 LangSysCount = FT_NEXT_USHORT( p );
574 OTV_TRACE((
" (LangSysCount = %u)\n", LangSysCount ));
576 if ( DefaultLangSys != 0 )
577 otv_LangSys_validate( table + DefaultLangSys, otvalid );
579 OTV_LIMIT_CHECK( LangSysCount * 6 );
582 for ( ; LangSysCount > 0; LangSysCount-- )
587 otv_LangSys_validate( table + FT_NEXT_USHORT( p ), otvalid );
597 otv_ScriptList_validate( FT_Bytes table,
599 OTV_Validator otvalid )
605 OTV_NAME_ENTER(
"ScriptList" );
607 OTV_LIMIT_CHECK( 2 );
608 ScriptCount = FT_NEXT_USHORT( p );
610 OTV_TRACE((
" (ScriptCount = %u)\n", ScriptCount ));
612 OTV_LIMIT_CHECK( ScriptCount * 6 );
614 otvalid->extra1 = otv_Feature_get_count( features );
617 for ( ; ScriptCount > 0; ScriptCount-- )
621 otv_Script_validate( table + FT_NEXT_USHORT( p ), otvalid );
655 otv_x_Ox( FT_Bytes table,
656 OTV_Validator otvalid )
660 OTV_Validate_Func func;
665 OTV_LIMIT_CHECK( 2 );
666 Count = FT_NEXT_USHORT( p );
668 OTV_TRACE((
" (Count = %u)\n", Count ));
670 OTV_LIMIT_CHECK( Count * 2 );
672 otvalid->nesting_level++;
673 func = otvalid->func[otvalid->nesting_level];
675 for ( ; Count > 0; Count-- )
676 func( table + FT_NEXT_USHORT( p ), otvalid );
678 otvalid->nesting_level--;
685 otv_u_C_x_Ox( FT_Bytes table,
686 OTV_Validator otvalid )
689 FT_UInt Count, Coverage;
690 OTV_Validate_Func func;
697 OTV_LIMIT_CHECK( 4 );
698 Coverage = FT_NEXT_USHORT( p );
699 Count = FT_NEXT_USHORT( p );
701 OTV_TRACE((
" (Count = %u)\n", Count ));
703 otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)Count );
705 OTV_LIMIT_CHECK( Count * 2 );
707 otvalid->nesting_level++;
708 func = otvalid->func[otvalid->nesting_level];
710 for ( ; Count > 0; Count-- )
711 func( table + FT_NEXT_USHORT( p ), otvalid );
713 otvalid->nesting_level--;
722 otv_x_ux( FT_Bytes table,
723 OTV_Validator otvalid )
731 OTV_LIMIT_CHECK( 2 );
732 Count = FT_NEXT_USHORT( p );
734 OTV_TRACE((
" (Count = %u)\n", Count ));
736 OTV_LIMIT_CHECK( Count * 2 );
738 if ( otvalid->extra1 )
740 for ( ; Count > 0; Count-- )
741 if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 )
755 otv_x_y_ux_sy( FT_Bytes table,
756 OTV_Validator otvalid )
759 FT_UInt Count1, Count2;
764 OTV_LIMIT_CHECK( 4 );
765 Count1 = FT_NEXT_USHORT( p );
766 Count2 = FT_NEXT_USHORT( p );
768 OTV_TRACE((
" (Count1 = %u)\n", Count1 ));
769 OTV_TRACE((
" (Count2 = %u)\n", Count2 ));
774 OTV_LIMIT_CHECK( ( Count1 - 1 ) * 2 + Count2 * 4 );
775 p += ( Count1 - 1 ) * 2;
777 for ( ; Count2 > 0; Count2-- )
779 if ( FT_NEXT_USHORT( p ) >= Count1 )
782 if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 )
796 otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table,
797 OTV_Validator otvalid )
800 FT_UInt BacktrackCount, InputCount, LookaheadCount;
806 OTV_LIMIT_CHECK( 2 );
807 BacktrackCount = FT_NEXT_USHORT( p );
809 OTV_TRACE((
" (BacktrackCount = %u)\n", BacktrackCount ));
811 OTV_LIMIT_CHECK( BacktrackCount * 2 + 2 );
812 p += BacktrackCount * 2;
814 InputCount = FT_NEXT_USHORT( p );
815 if ( InputCount == 0 )
818 OTV_TRACE((
" (InputCount = %u)\n", InputCount ));
820 OTV_LIMIT_CHECK( InputCount * 2 );
821 p += ( InputCount - 1 ) * 2;
823 LookaheadCount = FT_NEXT_USHORT( p );
825 OTV_TRACE((
" (LookaheadCount = %u)\n", LookaheadCount ));
827 OTV_LIMIT_CHECK( LookaheadCount * 2 + 2 );
828 p += LookaheadCount * 2;
830 Count = FT_NEXT_USHORT( p );
832 OTV_TRACE((
" (Count = %u)\n", Count ));
834 OTV_LIMIT_CHECK( Count * 4 );
836 for ( ; Count > 0; Count-- )
838 if ( FT_NEXT_USHORT( p ) >= InputCount )
841 if ( FT_NEXT_USHORT( p ) >= otvalid->extra1 )
852 otv_u_O_O_x_Onx( FT_Bytes table,
853 OTV_Validator otvalid )
856 FT_UInt Coverage, ClassDef, ClassSetCount;
857 OTV_Validate_Func func;
864 OTV_LIMIT_CHECK( 6 );
865 Coverage = FT_NEXT_USHORT( p );
866 ClassDef = FT_NEXT_USHORT( p );
867 ClassSetCount = FT_NEXT_USHORT( p );
869 OTV_TRACE((
" (ClassSetCount = %u)\n", ClassSetCount ));
871 otv_Coverage_validate( table + Coverage, otvalid, -1 );
872 otv_ClassDef_validate( table + ClassDef, otvalid );
874 OTV_LIMIT_CHECK( ClassSetCount * 2 );
876 otvalid->nesting_level++;
877 func = otvalid->func[otvalid->nesting_level];
878 otvalid->extra1 = otvalid->lookup_count;
880 for ( ; ClassSetCount > 0; ClassSetCount-- )
882 FT_UInt offset = FT_NEXT_USHORT( p );
886 func( table + offset, otvalid );
889 otvalid->nesting_level--;
898 otv_u_x_y_Ox_sy( FT_Bytes table,
899 OTV_Validator otvalid )
902 FT_UInt GlyphCount, Count, count1;
909 OTV_LIMIT_CHECK( 4 );
910 GlyphCount = FT_NEXT_USHORT( p );
911 Count = FT_NEXT_USHORT( p );
913 OTV_TRACE((
" (GlyphCount = %u)\n", GlyphCount ));
914 OTV_TRACE((
" (Count = %u)\n", Count ));
916 OTV_LIMIT_CHECK( GlyphCount * 2 + Count * 4 );
918 for ( count1 = GlyphCount; count1 > 0; count1-- )
919 otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 );
921 for ( ; Count > 0; Count-- )
923 if ( FT_NEXT_USHORT( p ) >= GlyphCount )
926 if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count )
937 otv_u_O_O_O_O_x_Onx( FT_Bytes table,
938 OTV_Validator otvalid )
942 FT_UInt BacktrackClassDef, InputClassDef, LookaheadClassDef;
943 FT_UInt ChainClassSetCount;
944 OTV_Validate_Func func;
951 OTV_LIMIT_CHECK( 10 );
952 Coverage = FT_NEXT_USHORT( p );
953 BacktrackClassDef = FT_NEXT_USHORT( p );
954 InputClassDef = FT_NEXT_USHORT( p );
955 LookaheadClassDef = FT_NEXT_USHORT( p );
956 ChainClassSetCount = FT_NEXT_USHORT( p );
958 OTV_TRACE((
" (ChainClassSetCount = %u)\n", ChainClassSetCount ));
960 otv_Coverage_validate( table + Coverage, otvalid, -1 );
962 otv_ClassDef_validate( table + BacktrackClassDef, otvalid );
963 otv_ClassDef_validate( table + InputClassDef, otvalid );
964 otv_ClassDef_validate( table + LookaheadClassDef, otvalid );
966 OTV_LIMIT_CHECK( ChainClassSetCount * 2 );
968 otvalid->nesting_level++;
969 func = otvalid->func[otvalid->nesting_level];
970 otvalid->extra1 = otvalid->lookup_count;
972 for ( ; ChainClassSetCount > 0; ChainClassSetCount-- )
974 FT_UInt offset = FT_NEXT_USHORT( p );
978 func( table + offset, otvalid );
981 otvalid->nesting_level--;
990 otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table,
991 OTV_Validator otvalid )
994 FT_UInt BacktrackGlyphCount, InputGlyphCount, LookaheadGlyphCount;
995 FT_UInt count1, count2;
1002 OTV_LIMIT_CHECK( 2 );
1003 BacktrackGlyphCount = FT_NEXT_USHORT( p );
1005 OTV_TRACE((
" (BacktrackGlyphCount = %u)\n", BacktrackGlyphCount ));
1007 OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 );
1009 for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- )
1010 otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 );
1012 InputGlyphCount = FT_NEXT_USHORT( p );
1014 OTV_TRACE((
" (InputGlyphCount = %u)\n", InputGlyphCount ));
1016 OTV_LIMIT_CHECK( InputGlyphCount * 2 + 2 );
1018 for ( count1 = InputGlyphCount; count1 > 0; count1-- )
1019 otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 );
1021 LookaheadGlyphCount = FT_NEXT_USHORT( p );
1023 OTV_TRACE((
" (LookaheadGlyphCount = %u)\n", LookaheadGlyphCount ));
1025 OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 );
1027 for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- )
1028 otv_Coverage_validate( table + FT_NEXT_USHORT( p ), otvalid, -1 );
1030 count2 = FT_NEXT_USHORT( p );
1032 OTV_TRACE((
" (Count = %u)\n", count2 ));
1034 OTV_LIMIT_CHECK( count2 * 4 );
1036 for ( ; count2 > 0; count2-- )
1038 if ( FT_NEXT_USHORT( p ) >= InputGlyphCount )
1041 if ( FT_NEXT_USHORT( p ) >= otvalid->lookup_count )
1049 FT_LOCAL_DEF( FT_UInt )
1050 otv_GSUBGPOS_get_Lookup_count( FT_Bytes table )
1052 FT_Bytes p = table + 8;
1055 return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) );
1059 FT_LOCAL_DEF( FT_UInt )
1060 otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table )
1071 table += FT_NEXT_USHORT( p );
1075 count = FT_NEXT_USHORT( p );
1077 for ( ; count > 0; count-- )
1083 lookup = table + FT_NEXT_USHORT( p );
1089 if ( FT_NEXT_USHORT( p ) & 0xFF00U )