4 /* forward declaration */
5 static OTL_ValidateFunc otl_gpos_validate_funcs[];
8 /************************************************************************/
9 /************************************************************************/
11 /***** VALUE RECORDS *****/
13 /************************************************************************/
14 /************************************************************************/
17 otl_value_length( OTL_UInt format )
21 count = (( format & 0xAA ) >> 1) + ( format & 0x55 );
22 count = (( count & 0xCC ) >> 2) + ( count & 0x33 );
23 count = (( count & 0xF0 ) >> 4) + ( count & 0x0F );
30 otl_value_validate( OTL_Bytes table,
36 OTL_UInt count, device;
38 if ( format >= 0x100U )
41 for ( count = 4; count > 0; count-- )
52 for ( count = 4; count > 0; count-- )
57 device = OTL_NEXT_USHORT( p );
59 otl_device_table_validate( pos_table + device, valid );
66 /************************************************************************/
67 /************************************************************************/
71 /************************************************************************/
72 /************************************************************************/
75 otl_anchor_validate( OTL_Bytes table,
82 format = OTL_NEXT_USHORT( p );
91 OTL_CHECK( 2 ); /* anchor point */
96 OTL_UInt x_device, y_device;
99 x_device = OTL_NEXT_USHORT( p );
100 y_device = OTL_NEXT_USHORT( p );
103 otl_device_table_validate( table + x_device, valid );
106 otl_device_table_validate( table + y_device, valid );
116 /************************************************************************/
117 /************************************************************************/
119 /***** MARK ARRAY *****/
121 /************************************************************************/
122 /************************************************************************/
125 otl_mark_array_validate( OTL_Bytes table,
126 OTL_Validator valid )
133 count = OTL_NEXT_USHORT( p );
134 OTL_CHECK( count * 4 );
135 for ( ; count > 0; count-- )
137 p += 2; /* ignore class index */
138 otl_anchor_validate( table + OTL_NEXT_USHORT( p ), valid );
143 /************************************************************************/
144 /************************************************************************/
146 /***** GPOS LOOKUP TYPE 1 *****/
148 /************************************************************************/
149 /************************************************************************/
152 otl_gpos_lookup1_validate( OTL_Bytes table,
153 OTL_Validator valid )
159 format = OTL_NEXT_USHORT( p );
164 FT_UInt coverage, value_format;
167 coverage = OTL_NEXT_USHORT( p );
168 value_format = OTL_NEXT_USHORT( p );
170 otl_coverage_validate( table + coverage, valid );
171 otl_value_validate( p, table, value_format, valid );
177 FT_UInt coverage, value_format, count, len;
180 coverage = OTL_NEXT_USHORT( p );
181 value_format = OTL_NEXT_USHORT( p );
182 count = OTL_NEXT_USHORT( p );
183 len = otl_value_length( value_format );
185 otl_coverage_validate( table + coverage, valid );
187 OTL_CHECK( count * len );
188 for ( ; count > 0; count-- )
190 otl_value_validate( p, table, value_format, valid );
202 /************************************************************************/
203 /************************************************************************/
205 /***** GPOS LOOKUP TYPE 2 *****/
207 /************************************************************************/
208 /************************************************************************/
210 static otl_gpos_pairset_validate( OTL_Bytes table,
214 OTL_Validator valid )
217 OTL_UInt len1, len2, count;
220 count = OTL_NEXT_USHORT( p );
221 len1 = otl_value_length( format1 );
222 len2 = otl_value_length( format2 );
224 OTL_CHECK( count * (len1+len2+2) );
225 for ( ; count > 0; count-- )
227 p += 2; /* ignore glyph id */
228 otl_value_validate( p, pos_table, format1, valid );
231 otl_value_validate( p, pos_table, format2, valid );
237 otl_gpos_lookup2_validate( OTL_Bytes table,
238 OTL_Validator valid )
244 format = OTL_NEXT_USHORT( p );
249 OTL_UInt coverage, value1, value2, count;
252 coverage = OTL_NEXT_USHORT( p );
253 value1 = OTL_NEXT_USHORT( p );
254 value2 = OTL_NEXT_USHORT( p );
255 count = OTL_NEXT_USHORT( p );
257 otl_coverage_validate( table + coverage, valid );
259 OTL_CHECK( count*2 );
260 for ( ; count > 0; count-- )
262 otl_gpos_pairset_validate( table + OTL_NEXT_USHORT( p ),
263 table, value1, value2, valid );
270 OTL_UInt coverage, value1, value2, class1, class2, count1, count2;
274 coverage = OTL_NEXT_USHORT( p );
275 value1 = OTL_NEXT_USHORT( p );
276 value2 = OTL_NEXT_USHORT( p );
277 class1 = OTL_NEXT_USHORT( p );
278 class2 = OTL_NEXT_USHORT( p );
279 count1 = OTL_NEXT_USHORT( p );
280 count2 = OTL_NEXT_USHORT( p );
282 len1 = otl_value_length( value1 );
283 len2 = otl_value_length( value2 );
285 otl_coverage_validate( table + coverage, valid );
287 OTL_CHECK( count1*count2*(len1+len2) );
288 for ( ; count1 > 0; count1-- )
290 for ( ; count2 > 0; count2-- )
292 otl_value_validate( p, table, value1, valid );
295 otl_value_validate( p, table, value2, valid );
308 /************************************************************************/
309 /************************************************************************/
311 /***** GPOS LOOKUP TYPE 3 *****/
313 /************************************************************************/
314 /************************************************************************/
317 otl_gpos_lookup3_validate( OTL_Bytes table,
324 format = OTL_NEXT_USHORT( p );
329 OTL_UInt coverage, count, anchor1, anchor2;
332 coverage = OTL_NEXT_USHORT( p );
333 count = OTL_NEXT_USHORT( p );
335 otl_coverage_validate( table + coverage, valid );
337 OTL_CHECK( count*4 );
338 for ( ; count > 0; count-- )
340 anchor1 = OTL_NEXT_USHORT( p );
341 anchor2 = OTL_NEXT_USHORT( p );
344 otl_anchor_validate( table + anchor1, valid );
347 otl_anchor_validate( table + anchor2, valid );
358 /************************************************************************/
359 /************************************************************************/
361 /***** GPOS LOOKUP TYPE 4 *****/
363 /************************************************************************/
364 /************************************************************************/
367 otl_base_array_validate( OTL_Bytes table,
368 OTL_UInt class_count,
369 OTL_Validator valid )
372 OTL_UInt count, count2;
375 count = OTL_NEXT_USHORT( p );
377 OTL_CHECK( count*class_count*2 );
378 for ( ; count > 0; count-- )
379 for ( count2 = class_count; count2 > 0; count2-- )
380 otl_anchor_validate( table + OTL_NEXT_USHORT( p ) );
385 otl_gpos_lookup4_validate( OTL_Bytes table,
392 format = OTL_NEXT_USHORT( p );
397 OTL_UInt mark_coverage, base_coverage, class_count;
398 OTL_UInt mark_array, base_array;
401 mark_coverage = OTL_NEXT_USHORT( p );
402 base_coverage = OTL_NEXT_USHORT( p );
403 class_count = OTL_NEXT_USHORT( p );
404 mark_array = OTL_NEXT_USHORT( p );
405 base_array = OTL_NEXT_USHORT( p );
407 otl_coverage_validate( table + mark_coverage, valid );
408 otl_coverage_validate( table + base_coverage, valid );
410 otl_mark_array_validate( table + mark_array, valid );
411 otl_base_array_validate( table, class_count, valid );
420 /************************************************************************/
421 /************************************************************************/
423 /***** GPOS LOOKUP TYPE 5 *****/
425 /************************************************************************/
426 /************************************************************************/
429 otl_liga_attach_validate( OTL_Bytes table,
430 OTL_UInt class_count,
431 OTL_Validator valid )
434 OTL_UInt count, count2;
437 count = OTL_NEXT_USHORT( p );
439 OTL_CHECK( count*class_count*2 );
440 for ( ; count > 0; count-- )
441 for ( count2 = class_count; class_count > 0; class_count-- )
442 otl_anchor_validate( table + OTL_NEXT_USHORT( p ), valid );
447 otl_liga_array_validate( OTL_Bytes table,
448 OTL_UInt class_count,
449 OTL_Validator valid )
452 OTL_UInt count, count2;
455 count = OTL_NEXT_USHORT( p );
457 OTL_CHECK( count*2 );
458 for ( ; count > 0; count-- )
459 otl_liga_attach_validate( table + OTL_NEXT_USHORT( p ), valid );
464 otl_gpos_lookup5_validate( OTL_Bytes table,
471 format = OTL_NEXT_USHORT( p );
476 OTL_UInt mark_coverage, lig_coverage, class_count;
477 OTL_UInt mar_array, lig_array;
480 mark_coverage = OTL_NEXT_USHORT( p );
481 liga_coverage = OTL_NEXT_USHORT( p );
482 class_count = OTL_NEXT_USHORT( p );
483 mark_array = OTL_NEXT_USHORT( p );
484 liga_array = OTL_NEXT_USHORT( p );
486 otl_coverage_validate( table + mark_coverage, valid );
487 otl_coverage_validate( table + liga_coverage, valid );
489 otl_mark_array_validate( table + mark_array, valid );
490 otl_liga_array_validate( table + liga_array, class_count, valid );
499 /************************************************************************/
500 /************************************************************************/
502 /***** GPOS LOOKUP TYPE 6 *****/
504 /************************************************************************/
505 /************************************************************************/
509 otl_mark2_array_validate( OTL_Bytes table,
510 OTL_UInt class_count,
511 OTL_Validator valid )
514 OTL_UInt count, count2;
517 count = OTL_NEXT_USHORT( p );
519 OTL_CHECK( count*class_count*2 );
520 for ( ; count > 0; count-- )
521 for ( count2 = class_count; class_count > 0; class_count-- )
522 otl_anchor_validate( table + OTL_NEXT_USHORT( p ), valid );
527 otl_gpos_lookup6_validate( OTL_Bytes table,
534 format = OTL_NEXT_USHORT( p );
539 OTL_UInt coverage1, coverage2, class_count, array1, array2;
542 coverage1 = OTL_NEXT_USHORT( p );
543 coverage2 = OTL_NEXT_USHORT( p );
544 class_count = OTL_NEXT_USHORT( p );
545 array1 = OTL_NEXT_USHORT( p );
546 array2 = OTL_NEXT_USHORT( p );
548 otl_coverage_validate( table + coverage1, valid );
549 otl_coverage_validate( table + coverage2, valid );
551 otl_mark_array_validate( table + array1, valid );
552 otl_mark2_array_validate( table + array2, valid );
562 /************************************************************************/
563 /************************************************************************/
565 /***** GPOS LOOKUP TYPE 7 *****/
567 /************************************************************************/
568 /************************************************************************/
571 otl_pos_rule_validate( OTL_Bytes table,
572 OTL_Validator valid )
575 OTL_UInt glyph_count, pos_count;
578 glyph_count = OTL_NEXT_USHORT( p );
579 pos_count = OTL_NEXT_USHORT( p );
581 if ( glyph_count == 0 )
584 OTL_CHECK( (glyph_count-1)*2 + pos_count*4 );
586 /* XXX: check glyph indices and pos lookups */
591 otl_pos_rule_set_validate( OTL_Bytes table,
592 OTL_Validator valid )
598 count = OTL_NEXT_USHORT( p );
600 OTL_CHECK( count*2 );
601 for ( ; count > 0; count-- )
602 otl_pos_rule_validate( table + OTL_NEXT_USHORT(p), valid );
608 otl_pos_class_rule_validate( OTL_Bytes table,
609 OTL_Validator valid )
612 OTL_UInt glyph_count, pos_count;
615 glyph_count = OTL_NEXT_USHORT( p );
616 pos_count = OTL_NEXT_USHORT( p );
618 if ( glyph_count == 0 )
621 OTL_CHECK( (glyph_count-1)*2 + pos_count*4 );
623 /* XXX: check glyph indices and pos lookups */
628 otl_pos_class_set_validate( OTL_Bytes table,
629 OTL_Validator valid )
635 count = OTL_NEXT_USHORT( p );
637 OTL_CHECK( count*2 );
638 for ( ; count > 0; count-- )
639 otl_pos_rule_validate( table + OTL_NEXT_USHORT(p), valid );
644 otl_gpos_lookup7_validate( OTL_Bytes table,
645 OTL_Validator valid )
651 format = OTL_NEXT_USHORT( p );
656 OTL_UInt coverage, count;
659 coverage = OTL_NEXT_USHORT( p );
660 count = OTL_NEXT_USHORT( p );
662 otl_coverage_validate( table + coverage, valid );
664 OTL_CHECK( count*2 );
665 for ( ; count > 0; count-- )
666 otl_pos_rule_set_validate( table + OTL_NEXT_USHORT( p ), valid );
672 OTL_UInt coverage, class_def, count;
675 coverage = OTL_NEXT_USHORT( p );
676 class_def = OTL_NEXT_USHORT( p );
677 count = OTL_NEXT_USHORT( p );
679 otl_coverage_validate ( table + coverage, valid );
680 otl_class_definition_validate( table + class_def, valid );
682 OTL_CHECK( count*2 );
683 for ( ; count > 0; count-- )
690 OTL_UInt glyph_count, pos_count;
693 glyph_count = OTL_NEXT_USHORT( p );
694 pos_count = OTL_NEXT_USHORT( p );
696 OTL_CHECK( glyph_count*2 + pos_count*4 );
697 for ( ; glyph_count > 0; glyph_count )
698 otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );
700 /* XXX: check pos lookups */
710 /************************************************************************/
711 /************************************************************************/
713 /***** GPOS LOOKUP TYPE 8 *****/
715 /************************************************************************/
716 /************************************************************************/
719 otl_chain_pos_rule_validate( OTL_Bytes table,
720 OTL_Validator valid )
723 OTL_UInt back_count, input_count, ahead_count, pos_count;
726 back_count = OTL_NEXT_USHORT( p );
728 OTL_CHECK( back_count*2 + 2 );
731 input_count = OTL_NEXT_USHORT( p );
732 if ( input_count == 0 )
735 OTL_CHECK( input_count*2 );
736 p += (input_count-1)*2;
738 ahead_count = OTL_NEXT_USHORT( p );
739 OTL_CHECK( ahead_count*2 + 2 );
742 pos_count = OTL_NEXT_USHORT( p );
743 OTL_CHECK( pos_count*4 );
748 otl_chain_pos_rule_set_validate( OTL_Bytes table,
749 OTL_Validator valid )
755 count = OTL_NEXT_USHORT( p );
757 OTL_CHECK( 2*count );
758 for ( ; count > 0; count-- )
759 otl_chain_pos_rule_validate( table + OTL_NEXT_USHORT( p ), valid );
765 otl_chain_pos_class_rule_validate( OTL_Bytes table,
766 OTL_Validator valid )
769 OTL_UInt back_count, input_count, ahead_count, pos_count;
772 back_count = OTL_NEXT_USHORT( p );
774 OTL_CHECK( back_count*2 + 2 );
777 input_count = OTL_NEXT_USHORT( p );
778 if ( input_count == 0 )
781 OTL_CHECK( input_count*2 );
782 p += (input_count-1)*2;
784 ahead_count = OTL_NEXT_USHORT( p );
785 OTL_CHECK( ahead_count*2 + 2 );
788 pos_count = OTL_NEXT_USHORT( p );
789 OTL_CHECK( pos_count*4 );
794 otl_chain_pos_class_set_validate( OTL_Bytes table,
795 OTL_Validator valid )
801 count = OTL_NEXT_USHORT( p );
803 OTL_CHECK( 2*count );
804 for ( ; count > 0; count-- )
805 otl_chain_pos_class_rule_validate( table + OTL_NEXT_USHORT( p ), valid );
810 otl_gpos_lookup8_validate( OTL_Bytes table,
811 OTL_Validator valid )
817 format = OTL_NEXT_USHORT( p );
822 OTL_UInt coverage, count;
825 coverage = OTL_NEXT_USHORT( p );
826 count = OTL_NEXT_USHORT( p );
828 otl_coverage_validate( table + coverage, valid );
830 OTL_CHECK( count*2 );
831 for ( ; count > 0; count-- )
832 otl_chain_pos_rule_set_validate( table + OTL_NEXT_USHORT( p ),
839 OTL_UInt coverage, back_class, input_class, ahead_class, count;
842 coverage = OTL_NEXT_USHORT( p );
843 back_class = OTL_NEXT_USHORT( p );
844 input_class = OTL_NEXT_USHORT( p );
845 ahead_class = OTL_NEXT_USHORT( p );
846 count = OTL_NEXT_USHORT( p );
848 otl_coverage_validate( table + coverage, valid );
850 otl_class_definition_validate( table + back_class, valid );
851 otl_class_definition_validate( table + input_class, valid );
852 otl_class_definition_validate( table + ahead_class, valid );
854 OTL_CHECK( count*2 );
855 for ( ; count > 0; count-- )
856 otl_chain_pos_class_set_validate( table + OTL_NEXT_USHORT( p ),
863 OTL_UInt back_count, input_count, ahead_count, pos_count, count;
866 back_count = OTL_NEXT_USHORT( p );
868 OTL_CHECK( 2*back_count+2 );
869 for ( count = back_count; count > 0; count-- )
870 otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );
872 input_count = OTL_NEXT_USHORT( p );
874 OTL_CHECK( 2*input_count+2 );
875 for ( count = input_count; count > 0; count-- )
876 otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );
878 ahead_count = OTL_NEXT_USHORT( p );
880 OTL_CHECK( 2*ahead_count+2 );
881 for ( count = ahead_count; count > 0; count-- )
882 otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );
884 pos_count = OTL_NEXT_USHORT( p );
885 OTL_CHECK( pos_count*4 );
894 /************************************************************************/
895 /************************************************************************/
897 /***** GPOS LOOKUP TYPE 9 *****/
899 /************************************************************************/
900 /************************************************************************/
903 otl_gpos_lookup9_validate( OTL_Bytes table,
910 format = OTL_NEXT_USHORT( p );
915 OTL_UInt lookup_type, lookup_offset;
916 OTL_ValidateFunc validate;
919 lookup_type = OTL_NEXT_USHORT( p );
920 lookup_offset = OTL_NEXT_ULONG( p );
922 if ( lookup_type == 0 || lookup_type >= 9 )
925 validate = otl_gpos_validate_funcs[ lookup_type-1 ];
926 validate( table + lookup_offset, valid );
935 static OTL_ValidateFunc otl_gpos_validate_funcs[ 9 ] =
937 otl_gpos_lookup1_validate,
938 otl_gpos_lookup2_validate,
939 otl_gpos_lookup3_validate,
940 otl_gpos_lookup4_validate,
941 otl_gpos_lookup5_validate,
942 otl_gpos_lookup6_validate,
943 otl_gpos_lookup7_validate,
944 otl_gpos_lookup8_validate,
945 otl_gpos_lookup9_validate,
949 /************************************************************************/
950 /************************************************************************/
952 /***** GPOS TABLE *****/
954 /************************************************************************/
955 /************************************************************************/
959 otl_gpos_validate( OTL_Bytes table,
960 OTL_Validator valid )
963 OTL_UInt scripts, features, lookups;
967 if ( OTL_NEXT_USHORT( p ) != 0x10000UL )
970 scripts = OTL_NEXT_USHORT( p );
971 features = OTL_NEXT_USHORT( p );
972 lookups = OTL_NEXT_USHORT( p );
974 otl_script_list_validate ( table + scripts, valid );
975 otl_feature_list_validate( table + features, valid );
977 otl_lookup_list_validate( table + lookups, 9, otl_gpos_validate_funcs,