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,
b'\\ No newline at end of file'