1 /***************************************************************************/
5 /* OpenType common tables validation (body). */
7 /* Copyright 2004, 2005, 2006 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
10 /* This file is part of the FreeType project, and may only be used, */
11 /* modified, and distributed under the terms of the FreeType project */
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13 /* this file you indicate that you have read the license and */
14 /* understand and accept it fully. */
16 /***************************************************************************/
22 /*************************************************************************/
24 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
25 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
26 /* messages during execution. */
29 #define FT_COMPONENT trace_otvcommon
32 /*************************************************************************/
33 /*************************************************************************/
35 /***** COVERAGE TABLE *****/
37 /*************************************************************************/
38 /*************************************************************************/
41 otv_Coverage_validate( FT_Bytes table
,
45 FT_UInt CoverageFormat
;
48 OTV_NAME_ENTER( "Coverage" );
51 CoverageFormat
= FT_NEXT_USHORT( p
);
53 OTV_TRACE(( " (format %d)\n", CoverageFormat
));
55 switch ( CoverageFormat
)
57 case 1: /* CoverageFormat1 */
62 GlyphCount
= FT_NEXT_USHORT( p
);
64 OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount
));
66 OTV_LIMIT_CHECK( GlyphCount
* 2 ); /* GlyphArray */
70 case 2: /* CoverageFormat2 */
72 FT_UInt n
, RangeCount
;
73 FT_UInt Start
, End
, StartCoverageIndex
, total
= 0, last
= 0;
76 RangeCount
= FT_NEXT_USHORT( p
);
78 OTV_TRACE(( " (RangeCount = %d)\n", RangeCount
));
80 OTV_LIMIT_CHECK( RangeCount
* 6 );
83 for ( n
= 0; n
< RangeCount
; n
++ )
85 Start
= FT_NEXT_USHORT( p
);
86 End
= FT_NEXT_USHORT( p
);
87 StartCoverageIndex
= FT_NEXT_USHORT( p
);
89 if ( Start
> End
|| StartCoverageIndex
!= total
)
92 if ( n
> 0 && Start
<= last
)
95 total
+= End
- Start
+ 1;
105 /* no need to check glyph indices used as input to coverage tables */
106 /* since even invalid glyph indices return a meaningful result */
112 FT_LOCAL_DEF( FT_UInt
)
113 otv_Coverage_get_first( FT_Bytes table
)
118 p
+= 4; /* skip CoverageFormat and Glyph/RangeCount */
120 return FT_NEXT_USHORT( p
);
124 FT_LOCAL_DEF( FT_UInt
)
125 otv_Coverage_get_last( FT_Bytes table
)
128 FT_UInt CoverageFormat
= FT_NEXT_USHORT( p
);
129 FT_UInt count
= FT_NEXT_USHORT( p
); /* Glyph/RangeCount */
133 switch ( CoverageFormat
)
136 p
+= ( count
- 1 ) * 2;
137 result
= FT_NEXT_USHORT( p
);
141 p
+= ( count
- 1 ) * 6 + 2;
142 result
= FT_NEXT_USHORT( p
);
153 FT_LOCAL_DEF( FT_UInt
)
154 otv_Coverage_get_count( FT_Bytes table
)
157 FT_UInt CoverageFormat
= FT_NEXT_USHORT( p
);
158 FT_UInt count
= FT_NEXT_USHORT( p
); /* Glyph/RangeCount */
162 switch ( CoverageFormat
)
172 for ( ; count
> 0; count
-- )
174 Start
= FT_NEXT_USHORT( p
);
175 End
= FT_NEXT_USHORT( p
);
176 p
+= 2; /* skip StartCoverageIndex */
178 result
+= End
- Start
+ 1;
191 /*************************************************************************/
192 /*************************************************************************/
194 /***** CLASS DEFINITION TABLE *****/
196 /*************************************************************************/
197 /*************************************************************************/
200 otv_ClassDef_validate( FT_Bytes table
,
201 OTV_Validator valid
)
207 OTV_NAME_ENTER( "ClassDef" );
209 OTV_LIMIT_CHECK( 4 );
210 ClassFormat
= FT_NEXT_USHORT( p
);
212 OTV_TRACE(( " (format %d)\n", ClassFormat
));
214 switch ( ClassFormat
)
216 case 1: /* ClassDefFormat1 */
221 p
+= 2; /* skip StartGlyph */
223 OTV_LIMIT_CHECK( 2 );
225 GlyphCount
= FT_NEXT_USHORT( p
);
227 OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount
));
229 OTV_LIMIT_CHECK( GlyphCount
* 2 ); /* ClassValueArray */
233 case 2: /* ClassDefFormat2 */
235 FT_UInt n
, ClassRangeCount
;
236 FT_UInt Start
, End
, last
= 0;
239 ClassRangeCount
= FT_NEXT_USHORT( p
);
241 OTV_TRACE(( " (ClassRangeCount = %d)\n", ClassRangeCount
));
243 OTV_LIMIT_CHECK( ClassRangeCount
* 6 );
245 /* ClassRangeRecord */
246 for ( n
= 0; n
< ClassRangeCount
; n
++ )
248 Start
= FT_NEXT_USHORT( p
);
249 End
= FT_NEXT_USHORT( p
);
250 p
+= 2; /* skip Class */
252 if ( Start
> End
|| ( n
> 0 && Start
<= last
) )
264 /* no need to check glyph indices used as input to class definition */
265 /* tables since even invalid glyph indices return a meaningful result */
271 /*************************************************************************/
272 /*************************************************************************/
274 /***** DEVICE TABLE *****/
276 /*************************************************************************/
277 /*************************************************************************/
280 otv_Device_validate( FT_Bytes table
,
281 OTV_Validator valid
)
284 FT_UInt StartSize
, EndSize
, DeltaFormat
, count
;
287 OTV_NAME_ENTER( "Device" );
289 OTV_LIMIT_CHECK( 8 );
290 StartSize
= FT_NEXT_USHORT( p
);
291 EndSize
= FT_NEXT_USHORT( p
);
292 DeltaFormat
= FT_NEXT_USHORT( p
);
294 if ( DeltaFormat
< 1 || DeltaFormat
> 3 || EndSize
< StartSize
)
297 count
= EndSize
- StartSize
+ 1;
298 OTV_LIMIT_CHECK( ( 1 << DeltaFormat
) * count
/ 8 ); /* DeltaValue */
304 /*************************************************************************/
305 /*************************************************************************/
307 /***** LOOKUPS *****/
309 /*************************************************************************/
310 /*************************************************************************/
312 /* uses valid->type_count */
313 /* uses valid->type_funcs */
316 otv_Lookup_validate( FT_Bytes table
,
317 OTV_Validator valid
)
320 FT_UInt LookupType
, SubTableCount
;
321 OTV_Validate_Func validate
;
324 OTV_NAME_ENTER( "Lookup" );
326 OTV_LIMIT_CHECK( 6 );
327 LookupType
= FT_NEXT_USHORT( p
);
328 p
+= 2; /* skip LookupFlag */
329 SubTableCount
= FT_NEXT_USHORT( p
);
331 OTV_TRACE(( " (type %d)\n", LookupType
));
333 if ( LookupType
== 0 || LookupType
>= valid
->type_count
)
336 validate
= valid
->type_funcs
[LookupType
- 1];
338 OTV_TRACE(( " (SubTableCount = %d)\n", SubTableCount
));
340 OTV_LIMIT_CHECK( SubTableCount
* 2 );
343 for ( ; SubTableCount
> 0; SubTableCount
-- )
344 validate( table
+ FT_NEXT_USHORT( p
), valid
);
350 /* uses valid->lookup_count */
353 otv_LookupList_validate( FT_Bytes table
,
354 OTV_Validator valid
)
360 OTV_NAME_ENTER( "LookupList" );
362 OTV_LIMIT_CHECK( 2 );
363 LookupCount
= FT_NEXT_USHORT( p
);
365 OTV_TRACE(( " (LookupCount = %d)\n", LookupCount
));
367 OTV_LIMIT_CHECK( LookupCount
* 2 );
369 valid
->lookup_count
= LookupCount
;
372 for ( ; LookupCount
> 0; LookupCount
-- )
373 otv_Lookup_validate( table
+ FT_NEXT_USHORT( p
), valid
);
380 otv_LookupList_get_count( FT_Bytes table
)
382 return FT_NEXT_USHORT( table
);
386 /*************************************************************************/
387 /*************************************************************************/
389 /***** FEATURES *****/
391 /*************************************************************************/
392 /*************************************************************************/
394 /* uses valid->lookup_count */
397 otv_Feature_validate( FT_Bytes table
,
398 OTV_Validator valid
)
404 OTV_NAME_ENTER( "Feature" );
406 OTV_LIMIT_CHECK( 4 );
407 p
+= 2; /* skip FeatureParams (unused) */
408 LookupCount
= FT_NEXT_USHORT( p
);
410 OTV_TRACE(( " (LookupCount = %d)\n", LookupCount
));
412 OTV_LIMIT_CHECK( LookupCount
* 2 );
414 /* LookupListIndex */
415 for ( ; LookupCount
> 0; LookupCount
-- )
416 if ( FT_NEXT_USHORT( p
) >= valid
->lookup_count
)
424 otv_Feature_get_count( FT_Bytes table
)
426 return FT_NEXT_USHORT( table
);
430 /* sets valid->lookup_count */
433 otv_FeatureList_validate( FT_Bytes table
,
435 OTV_Validator valid
)
438 FT_UInt FeatureCount
;
441 OTV_NAME_ENTER( "FeatureList" );
443 OTV_LIMIT_CHECK( 2 );
444 FeatureCount
= FT_NEXT_USHORT( p
);
446 OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount
));
448 OTV_LIMIT_CHECK( FeatureCount
* 2 );
450 valid
->lookup_count
= otv_LookupList_get_count( lookups
);
453 for ( ; FeatureCount
> 0; FeatureCount
-- )
455 p
+= 4; /* skip FeatureTag */
458 otv_Feature_validate( table
+ FT_NEXT_USHORT( p
), valid
);
465 /*************************************************************************/
466 /*************************************************************************/
468 /***** LANGUAGE SYSTEM *****/
470 /*************************************************************************/
471 /*************************************************************************/
474 /* uses valid->extra1 (number of features) */
477 otv_LangSys_validate( FT_Bytes table
,
478 OTV_Validator valid
)
481 FT_UInt ReqFeatureIndex
;
482 FT_UInt FeatureCount
;
485 OTV_NAME_ENTER( "LangSys" );
487 OTV_LIMIT_CHECK( 6 );
488 p
+= 2; /* skip LookupOrder (unused) */
489 ReqFeatureIndex
= FT_NEXT_USHORT( p
);
490 FeatureCount
= FT_NEXT_USHORT( p
);
492 OTV_TRACE(( " (ReqFeatureIndex = %d)\n", ReqFeatureIndex
));
493 OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount
));
495 if ( ReqFeatureIndex
!= 0xFFFFU
&& ReqFeatureIndex
>= valid
->extra1
)
498 OTV_LIMIT_CHECK( FeatureCount
* 2 );
501 for ( ; FeatureCount
> 0; FeatureCount
-- )
502 if ( FT_NEXT_USHORT( p
) >= valid
->extra1
)
509 /*************************************************************************/
510 /*************************************************************************/
512 /***** SCRIPTS *****/
514 /*************************************************************************/
515 /*************************************************************************/
518 otv_Script_validate( FT_Bytes table
,
519 OTV_Validator valid
)
521 FT_UInt DefaultLangSys
, LangSysCount
;
525 OTV_NAME_ENTER( "Script" );
527 OTV_LIMIT_CHECK( 4 );
528 DefaultLangSys
= FT_NEXT_USHORT( p
);
529 LangSysCount
= FT_NEXT_USHORT( p
);
531 OTV_TRACE(( " (LangSysCount = %d)\n", LangSysCount
));
533 if ( DefaultLangSys
!= 0 )
534 otv_LangSys_validate( table
+ DefaultLangSys
, valid
);
536 OTV_LIMIT_CHECK( LangSysCount
* 6 );
539 for ( ; LangSysCount
> 0; LangSysCount
-- )
541 p
+= 4; /* skip LangSysTag */
544 otv_LangSys_validate( table
+ FT_NEXT_USHORT( p
), valid
);
551 /* sets valid->extra1 (number of features) */
554 otv_ScriptList_validate( FT_Bytes table
,
556 OTV_Validator valid
)
562 OTV_NAME_ENTER( "ScriptList" );
564 OTV_LIMIT_CHECK( 2 );
565 ScriptCount
= FT_NEXT_USHORT( p
);
567 OTV_TRACE(( " (ScriptCount = %d)\n", ScriptCount
));
569 OTV_LIMIT_CHECK( ScriptCount
* 6 );
571 valid
->extra1
= otv_Feature_get_count( features
);
574 for ( ; ScriptCount
> 0; ScriptCount
-- )
576 p
+= 4; /* skip ScriptTag */
578 otv_Script_validate( table
+ FT_NEXT_USHORT( p
), valid
); /* Script */
585 /*************************************************************************/
586 /*************************************************************************/
588 /***** UTILITY FUNCTIONS *****/
590 /*************************************************************************/
591 /*************************************************************************/
599 sxy: struct [x], using external y count
608 Onx: Offset (NULL) [x]
612 otv_x_Ox( FT_Bytes table
,
613 OTV_Validator valid
)
617 OTV_Validate_Func func
;
622 OTV_LIMIT_CHECK( 2 );
623 Count
= FT_NEXT_USHORT( p
);
625 OTV_TRACE(( " (Count = %d)\n", Count
));
627 OTV_LIMIT_CHECK( Count
* 2 );
629 valid
->nesting_level
++;
630 func
= valid
->func
[valid
->nesting_level
];
632 for ( ; Count
> 0; Count
-- )
633 func( table
+ FT_NEXT_USHORT( p
), valid
);
635 valid
->nesting_level
--;
642 otv_u_C_x_Ox( FT_Bytes table
,
643 OTV_Validator valid
)
646 FT_UInt Count
, Coverage
;
647 OTV_Validate_Func func
;
652 p
+= 2; /* skip Format */
654 OTV_LIMIT_CHECK( 4 );
655 Coverage
= FT_NEXT_USHORT( p
);
656 Count
= FT_NEXT_USHORT( p
);
658 OTV_TRACE(( " (Count = %d)\n", Count
));
660 otv_Coverage_validate( table
+ Coverage
, valid
);
662 OTV_LIMIT_CHECK( Count
* 2 );
664 valid
->nesting_level
++;
665 func
= valid
->func
[valid
->nesting_level
];
667 for ( ; Count
> 0; Count
-- )
668 func( table
+ FT_NEXT_USHORT( p
), valid
);
670 valid
->nesting_level
--;
676 /* uses valid->extra1 (if > 0: array value limit) */
679 otv_x_ux( FT_Bytes table
,
680 OTV_Validator valid
)
688 OTV_LIMIT_CHECK( 2 );
689 Count
= FT_NEXT_USHORT( p
);
691 OTV_TRACE(( " (Count = %d)\n", Count
));
693 OTV_LIMIT_CHECK( Count
* 2 );
697 for ( ; Count
> 0; Count
-- )
698 if ( FT_NEXT_USHORT( p
) >= valid
->extra1
)
706 /* `ux' in the function's name is not really correct since only x-1 */
707 /* elements are tested */
709 /* uses valid->extra1 (array value limit) */
712 otv_x_y_ux_sy( FT_Bytes table
,
713 OTV_Validator valid
)
716 FT_UInt Count1
, Count2
;
721 OTV_LIMIT_CHECK( 4 );
722 Count1
= FT_NEXT_USHORT( p
);
723 Count2
= FT_NEXT_USHORT( p
);
725 OTV_TRACE(( " (Count1 = %d)\n", Count1
));
726 OTV_TRACE(( " (Count2 = %d)\n", Count2
));
731 OTV_LIMIT_CHECK( ( Count1
- 1 ) * 2 + Count2
* 4 );
733 for ( ; Count2
> 0; Count2
-- )
735 if ( FT_NEXT_USHORT( p
) >= Count1
)
738 if ( FT_NEXT_USHORT( p
) >= valid
->extra1
)
746 /* `uy' in the function's name is not really correct since only y-1 */
747 /* elements are tested */
749 /* uses valid->extra1 (array value limit) */
752 otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table
,
753 OTV_Validator valid
)
756 FT_UInt BacktrackCount
, InputCount
, LookaheadCount
;
762 OTV_LIMIT_CHECK( 2 );
763 BacktrackCount
= FT_NEXT_USHORT( p
);
765 OTV_TRACE(( " (BacktrackCount = %d)\n", BacktrackCount
));
767 OTV_LIMIT_CHECK( BacktrackCount
* 2 + 2 );
768 p
+= BacktrackCount
* 2;
770 InputCount
= FT_NEXT_USHORT( p
);
771 if ( InputCount
== 0 )
774 OTV_TRACE(( " (InputCount = %d)\n", InputCount
));
776 OTV_LIMIT_CHECK( InputCount
* 2 );
777 p
+= ( InputCount
- 1 ) * 2;
779 LookaheadCount
= FT_NEXT_USHORT( p
);
781 OTV_TRACE(( " (LookaheadCount = %d)\n", LookaheadCount
));
783 OTV_LIMIT_CHECK( LookaheadCount
* 2 + 2 );
784 p
+= LookaheadCount
* 2;
786 Count
= FT_NEXT_USHORT( p
);
788 OTV_TRACE(( " (Count = %d)\n", Count
));
790 OTV_LIMIT_CHECK( Count
* 4 );
792 for ( ; Count
> 0; Count
-- )
794 if ( FT_NEXT_USHORT( p
) >= InputCount
)
797 if ( FT_NEXT_USHORT( p
) >= valid
->extra1
)
805 /* sets valid->extra1 (valid->lookup_count) */
808 otv_u_O_O_x_Onx( FT_Bytes table
,
809 OTV_Validator valid
)
812 FT_UInt Coverage
, ClassDef
, ClassSetCount
;
813 OTV_Validate_Func func
;
818 p
+= 2; /* skip Format */
820 OTV_LIMIT_CHECK( 6 );
821 Coverage
= FT_NEXT_USHORT( p
);
822 ClassDef
= FT_NEXT_USHORT( p
);
823 ClassSetCount
= FT_NEXT_USHORT( p
);
825 OTV_TRACE(( " (ClassSetCount = %d)\n", ClassSetCount
));
827 otv_Coverage_validate( table
+ Coverage
, valid
);
828 otv_ClassDef_validate( table
+ ClassDef
, valid
);
830 OTV_LIMIT_CHECK( ClassSetCount
* 2 );
832 valid
->nesting_level
++;
833 func
= valid
->func
[valid
->nesting_level
];
834 valid
->extra1
= valid
->lookup_count
;
836 for ( ; ClassSetCount
> 0; ClassSetCount
-- )
838 FT_UInt offset
= FT_NEXT_USHORT( p
);
842 func( table
+ offset
, valid
);
845 valid
->nesting_level
--;
851 /* uses valid->lookup_count */
854 otv_u_x_y_Ox_sy( FT_Bytes table
,
855 OTV_Validator valid
)
858 FT_UInt GlyphCount
, Count
, count1
;
863 p
+= 2; /* skip Format */
865 OTV_LIMIT_CHECK( 4 );
866 GlyphCount
= FT_NEXT_USHORT( p
);
867 Count
= FT_NEXT_USHORT( p
);
869 OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount
));
870 OTV_TRACE(( " (Count = %d)\n", Count
));
872 OTV_LIMIT_CHECK( GlyphCount
* 2 + Count
* 4 );
874 for ( count1
= GlyphCount
; count1
> 0; count1
-- )
875 otv_Coverage_validate( table
+ FT_NEXT_USHORT( p
), valid
);
877 for ( ; Count
> 0; Count
-- )
879 if ( FT_NEXT_USHORT( p
) >= GlyphCount
)
882 if ( FT_NEXT_USHORT( p
) >= valid
->lookup_count
)
890 /* sets valid->extra1 (valid->lookup_count) */
893 otv_u_O_O_O_O_x_Onx( FT_Bytes table
,
894 OTV_Validator valid
)
898 FT_UInt BacktrackClassDef
, InputClassDef
, LookaheadClassDef
;
899 FT_UInt ChainClassSetCount
;
900 OTV_Validate_Func func
;
905 p
+= 2; /* skip Format */
907 OTV_LIMIT_CHECK( 10 );
908 Coverage
= FT_NEXT_USHORT( p
);
909 BacktrackClassDef
= FT_NEXT_USHORT( p
);
910 InputClassDef
= FT_NEXT_USHORT( p
);
911 LookaheadClassDef
= FT_NEXT_USHORT( p
);
912 ChainClassSetCount
= FT_NEXT_USHORT( p
);
914 OTV_TRACE(( " (ChainClassSetCount = %d)\n", ChainClassSetCount
));
916 otv_Coverage_validate( table
+ Coverage
, valid
);
918 otv_ClassDef_validate( table
+ BacktrackClassDef
, valid
);
919 otv_ClassDef_validate( table
+ InputClassDef
, valid
);
920 otv_ClassDef_validate( table
+ LookaheadClassDef
, valid
);
922 OTV_LIMIT_CHECK( ChainClassSetCount
* 2 );
924 valid
->nesting_level
++;
925 func
= valid
->func
[valid
->nesting_level
];
926 valid
->extra1
= valid
->lookup_count
;
928 for ( ; ChainClassSetCount
> 0; ChainClassSetCount
-- )
930 FT_UInt offset
= FT_NEXT_USHORT( p
);
934 func( table
+ offset
, valid
);
937 valid
->nesting_level
--;
943 /* uses valid->lookup_count */
946 otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table
,
947 OTV_Validator valid
)
950 FT_UInt BacktrackGlyphCount
, InputGlyphCount
, LookaheadGlyphCount
;
951 FT_UInt count1
, count2
;
956 p
+= 2; /* skip Format */
958 OTV_LIMIT_CHECK( 2 );
959 BacktrackGlyphCount
= FT_NEXT_USHORT( p
);
961 OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount
));
963 OTV_LIMIT_CHECK( BacktrackGlyphCount
* 2 + 2 );
965 for ( ; BacktrackGlyphCount
> 0; BacktrackGlyphCount
-- )
966 otv_Coverage_validate( table
+ FT_NEXT_USHORT( p
), valid
);
968 InputGlyphCount
= FT_NEXT_USHORT( p
);
970 OTV_TRACE(( " (InputGlyphCount = %d)\n", InputGlyphCount
));
972 OTV_LIMIT_CHECK( InputGlyphCount
* 2 + 2 );
974 for ( count1
= InputGlyphCount
; count1
> 0; count1
-- )
975 otv_Coverage_validate( table
+ FT_NEXT_USHORT( p
), valid
);
977 LookaheadGlyphCount
= FT_NEXT_USHORT( p
);
979 OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount
));
981 OTV_LIMIT_CHECK( LookaheadGlyphCount
* 2 + 2 );
983 for ( ; LookaheadGlyphCount
> 0; LookaheadGlyphCount
-- )
984 otv_Coverage_validate( table
+ FT_NEXT_USHORT( p
), valid
);
986 count2
= FT_NEXT_USHORT( p
);
988 OTV_TRACE(( " (Count = %d)\n", count2
));
990 OTV_LIMIT_CHECK( count2
* 4 );
992 for ( ; count2
> 0; count2
-- )
994 if ( FT_NEXT_USHORT( p
) >= InputGlyphCount
)
997 if ( FT_NEXT_USHORT( p
) >= valid
->lookup_count
)
1005 FT_LOCAL_DEF( FT_UInt
)
1006 otv_GSUBGPOS_get_Lookup_count( FT_Bytes table
)
1008 FT_Bytes p
= table
+ 8;
1011 return otv_LookupList_get_count( table
+ FT_NEXT_USHORT( p
) );
1015 FT_LOCAL_DEF( FT_UInt
)
1016 otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table
)
1027 table
+= FT_NEXT_USHORT( p
);
1031 count
= FT_NEXT_USHORT( p
);
1033 for ( ; count
> 0; count
-- )
1039 lookup
= table
+ FT_NEXT_USHORT( p
);
1045 if ( FT_NEXT_USHORT( p
) & 0xFF00U
)