10 char *indent_spaces[] =
11 { "", " ", " ", " ", " ", " ", " ",
15 #define IPRINT printf("\n%s", indent_spaces[indent]), printf
18 dump_tag (OTF_Tag tag)
22 putchar ((tag >> 16) & 0xFF);
23 putchar ((tag >> 8) & 0xFF);
25 printf ("\" #x%04X)", tag);
31 dump_offset_table (int indent, OTF_OffsetTable *table)
33 IPRINT ("(OffsetTable");
35 IPRINT ("(sfnt-version %d.%d)",
36 table->sfnt_version.high, table->sfnt_version.low);
37 IPRINT ("(numTables %d)", table->numTables);
38 IPRINT ("(searchRange %d)", table->searchRange);
39 IPRINT ("(enterSelector %d)", table->enterSelector);
40 IPRINT ("(rangeShift %d))", table->rangeShift);
44 dump_table_directory (int indent, OTF_TableDirectory *table, int idx)
46 IPRINT ("(Table %d ", idx);
47 dump_tag (table->tag);
49 IPRINT ("(checkSum %08X) (offset #x%08X) (length: #x%08X))",
50 table->checkSum, table->offset, table->length);
57 dump_head_table (int indent, OTF_head *head)
61 IPRINT ("(TableVersionNumber %d.%d)",
62 head->TableVersionNumber.high, head->TableVersionNumber.low);
63 IPRINT ("(fontRevision %d.%d)",
64 head->fontRevision.high, head->fontRevision.low);
65 IPRINT ("(checkSumAdjustment #x%04X)", head->checkSumAdjustment);
66 IPRINT ("(magicNumber #x%04X)", head->magicNumber);
67 IPRINT ("(flags #x%04X)", head->flags);
68 IPRINT ("(unitsPerEm %d)", head->unitsPerEm);
76 dump_glyph_ids (int indent, char *title, OTF_GlyphID *ids, unsigned count)
78 IPRINT ("(%s (count %d)", title, count);
81 printf (" #x%04X", *ids);
88 dump_coverage (int indent, char *title, OTF_Coverage *coverage)
92 IPRINT ("(%sCoverage (CoverageFormat %d)",
93 (title ? title : ""), coverage->CoverageFormat);
95 if (coverage->CoverageFormat == 1)
97 dump_glyph_ids (indent, "GlyphArray", coverage->table.GlyphArray,
102 IPRINT ("(RangeCount %d)", coverage->Count);
104 for (i = 0; i < coverage->Count; i++)
106 IPRINT ("(Range (%d) (Start #x%04X) (End #x%04X)", i,
107 coverage->table.RangeRecord[i].Start,
108 coverage->table.RangeRecord[i].End);
110 IPRINT ("(StartCoverageIndex %d))",
111 coverage->table.RangeRecord[i].StartCoverageIndex);
119 dump_coverage_list (int indent, char *title,
120 OTF_Coverage *coverage, unsigned num)
124 IPRINT ("(%s %d)", title, num);
125 for (i = 0; i < num; i++)
126 dump_coverage (indent, NULL, coverage + i);
131 dump_language_system (int indent, int index, OTF_Tag tag, OTF_Offset offset,
132 OTF_LangSys *langsys)
136 IPRINT ("(LangSys ");
138 printf ("(%d) ", index);
142 printf ("DefaultLangSys");
143 printf (" (Offset #x%04X)", offset);
145 IPRINT ("(LookupOrder #x%04X)", langsys->LookupOrder);
146 IPRINT ("(ReqFeatureIndex %d)", langsys->ReqFeatureIndex);
147 IPRINT ("(FeatureCount %d)", langsys->FeatureCount);
148 if (langsys->FeatureCount)
150 IPRINT ("(FeatureIndex");
151 for (i = 0; i < langsys->FeatureCount; i++)
152 printf (" %d", langsys->FeatureIndex[i]);
159 dump_script_list (int indent, OTF_ScriptList *list)
163 IPRINT ("(ScriptList (count %d)", list->ScriptCount);
165 for (i = 0; i < list->ScriptCount; i++)
167 OTF_Script *script = list->Script + i;
169 IPRINT ("(Script (%d) ", i);
170 dump_tag (list->Script[i].ScriptTag);
171 printf (" (Offset #x%04X)", list->Script[i].offset);
173 IPRINT ("(DefaultLangSysOffset #x%04X)",
174 script->DefaultLangSysOffset);
175 if (script->DefaultLangSysOffset)
176 dump_language_system (indent, -1, 0,
177 script->DefaultLangSysOffset,
178 &script->DefaultLangSys);
179 IPRINT ("(LangSysCount %d)", script->LangSysCount);
180 for (j = 0; j < script->LangSysCount; j++)
181 dump_language_system (indent, j,
182 script->LangSysRecord[j].LangSysTag,
183 script->LangSysRecord[j].LangSys,
184 script->LangSys + j);
192 dump_feature_list (int indent, OTF_FeatureList *list)
196 IPRINT ("(FeatureList (count %d)", list->FeatureCount);
198 for (i = 0; i < list->FeatureCount; i++)
200 OTF_Feature *feature = list->Feature + i;
202 IPRINT ("(Feature (%d) ", i);
203 dump_tag (list->Feature[i].FeatureTag);
204 printf (" (Offset #x%04X)", list->Feature[i].offset);
205 printf (" (LookupCount %d)", feature->LookupCount);
206 if (feature->LookupCount)
209 IPRINT ("(LookupListIndex");
210 for (j = 0; j < feature->LookupCount; j++)
211 printf (" %d", feature->LookupListIndex[j]);
221 dump_class_def (int indent, char *title, OTF_ClassDef *class)
223 IPRINT ("(%s (offset #x%04X) (ClassFormat %d)",
224 (title ? title : "ClassDef"),
225 class->offset, class->ClassFormat);
229 if (class->ClassFormat == 1)
231 IPRINT ("(StartGlyph #x%04X)", class->f.f1.StartGlyph);
232 dump_glyph_ids (indent, "ClassValueArray",
233 (OTF_GlyphID *) class->f.f1.ClassValueArray,
234 class->f.f1.GlyphCount);
236 else if (class->ClassFormat == 2)
240 IPRINT ("(ClassRangeCount %d)", class->f.f2.ClassRangeCount);
241 IPRINT ("(ClassRangeRecord");
243 for (i = 0; i < class->f.f2.ClassRangeCount; i++)
244 IPRINT ("((Start #x%04X) (End #x%04X) (class %d))",
245 class->f.f2.ClassRangeRecord[i].Start,
246 class->f.f2.ClassRangeRecord[i].End,
247 class->f.f2.ClassRangeRecord[i].Class);
251 printf (" UnknownClassFormat");
257 dump_device_table (int indent, char *title, OTF_DeviceTable *table)
263 IPRINT ("(%s (offset #x%04X)", title, table->offset);
265 IPRINT ("(StartSize %d) (EndSize %d) (DeltaFormat %d)",
266 table->StartSize, table->EndSize, table->DeltaFormat);
267 IPRINT ("(DeltaValue");
268 for (i = 0; i < table->EndSize - table->StartSize + 1; i++)
269 printf (" %d", table->DeltaValue[i]);
276 dump_value_record (int indent, char *title, OTF_ValueRecord *rec)
278 IPRINT ("(%s %d %d %d %d", title,
279 rec->XPlacement, rec->YPlacement, rec->XAdvance, rec->YAdvance);
281 if (rec->XPlaDevice.offset)
282 dump_device_table (indent, "XPlaDevice", &rec->XPlaDevice);
283 if (rec->YPlaDevice.offset)
284 dump_device_table (indent, "YPlaDevice", &rec->YPlaDevice);
285 if (rec->XAdvDevice.offset)
286 dump_device_table (indent, "XAdvDevice", &rec->XAdvDevice);
287 if (rec->YAdvDevice.offset)
288 dump_device_table (indent, "YAdvDevice", &rec->YAdvDevice);
294 dump_sequence_list (int indent, OTF_Sequence *sequence, unsigned num)
297 IPRINT ("(SequenceCount %d)", num);
299 for (i = 0; i < num; i++)
301 IPRINT ("(Sequence (%d) (offset #x%04X)",
302 i, sequence[i].offset);
303 dump_glyph_ids (indent + 1, "Substitute", sequence[i].Substitute,
304 sequence[i].GlyphCount);
310 dump_alternate_set_list (int indent, OTF_AlternateSet *altset, unsigned num)
314 IPRINT ("(AlternateSetCount %d)", num);
315 for (i = 0; i < num; i++)
317 IPRINT ("(AlternateSet (%d) (offset #x%04X)",
318 i, altset[i].offset);
319 dump_glyph_ids (indent + 1, "Alternate", altset[i].Alternate,
320 altset[i].GlyphCount);
327 dump_ligature_set_list (int indent, OTF_LigatureSet *ligset, unsigned num)
331 IPRINT ("(LigSetCount %d)", num);
332 for (i = 0; i < num; i++)
334 IPRINT ("(LigatureSet (%d) (offset #x%04X) (count %d)",
335 i, ligset[i].offset, ligset[i].LigatureCount);
337 for (j = 0; j < ligset[i].LigatureCount; j++)
339 IPRINT ("(Ligature (%d) (offset #x%04X)",
340 j, ligset[i].Ligature[j].offset);
342 IPRINT ("(LigGlyph #x%04X)",
343 ligset[i].Ligature[j].LigGlyph);
344 dump_glyph_ids (indent, "Component", ligset[i].Ligature[j].Component,
345 ligset[i].Ligature[j].CompCount - 1);
355 dump_class1_record_list (int indent,
356 unsigned Class1Count, unsigned Class2Count,
357 OTF_Class1Record *rec)
361 for (i = 0; i < Class1Count; i++)
363 IPRINT ("(Class1Record (%d)", i);
365 for (j = 0; j < Class2Count; j++)
367 IPRINT ("(Class2Record (%d)", j);
369 dump_value_record (indent, "Value1", &rec[i].Class2Record[j].Value1);
370 dump_value_record (indent, "Value2", &rec[i].Class2Record[j].Value2);
380 dump_anchor (int indent, OTF_Anchor *anchor)
382 IPRINT ("(Anchor (offset #x%04X) (AnchorFormat %d)",
383 anchor->offset, anchor->AnchorFormat);
385 IPRINT ("(XCoordinate %d) (YCoordinate %d)",
386 anchor->XCoordinate, anchor->YCoordinate);
387 if (anchor->AnchorFormat == 1)
389 else if (anchor->AnchorFormat == 2)
390 IPRINT ("(AnchorPoint %d)", anchor->f.f1.AnchorPoint);
393 dump_device_table (indent, "XDeviceTable", &anchor->f.f2.XDeviceTable);
394 dump_device_table (indent, "YDeviceTable", &anchor->f.f2.YDeviceTable);
400 dump_mark_array (int indent, OTF_MarkArray *array)
404 IPRINT ("(MarkArray (MarkCount %d)", array->MarkCount);
406 for (i = 0; i < array->MarkCount; i++)
408 IPRINT ("(MarkRecord (%d) (Class %d)", i, array->MarkRecord[i].Class);
409 dump_anchor (indent + 1, &array->MarkRecord[i].MarkAnchor);
416 dump_anchor_array (int indent, unsigned ClassCount, OTF_AnchorArray *array)
420 IPRINT ("(AnchorArray (Count %d)", array->Count);
422 for (i = 0; i < array->Count; i++)
424 IPRINT ("(AnchorRecord (%d) ", i);
425 for (j = 0; j < ClassCount; j++)
426 dump_anchor (indent + 1, array->AnchorRecord[i].Anchor + j);
434 dump_lookup_record_list (int indent, OTF_LookupRecord *rec, unsigned num)
438 IPRINT ("(LookupCount %d)", num);
439 for (i = 0; i < num; i++)
441 IPRINT ("(LookupRecord (%d)", i);
443 IPRINT ("(SequenceIndex %d)", rec[i].SequenceIndex);
444 IPRINT ("(LookupListIndex %d))", rec[i].LookupListIndex);
450 static void dump_lookup_subtable_gsub (int indent, int index, unsigned type,
451 OTF_LookupSubTableGSUB *subtable);
452 static void dump_lookup_subtable_gpos (int indent, int index, unsigned type,
453 OTF_LookupSubTableGPOS *subtable);
457 dump_lookup_list (int indent, OTF_LookupList *list, int gsub)
461 IPRINT ("(LookupList (count %d)", list->LookupCount);
463 for (i = 0; i < list->LookupCount; i++)
465 OTF_Lookup *lookup = list->Lookup + i;
467 IPRINT ("(Lookup (%d) (Offset #x%04X)",
469 printf (" (Type %d) (Flag #x%04X) (SubTableCount %d)",
470 lookup->LookupType, lookup->LookupFlag, lookup->SubTableCount);
472 for (j = 0; j < lookup->SubTableCount; j++)
473 dump_lookup_subtable_gsub (indent + 1, j,
475 lookup->SubTable.gsub + j);
477 for (j = 0; j < lookup->SubTableCount; j++)
478 dump_lookup_subtable_gpos (indent + 1, j,
480 lookup->SubTable.gpos + j);
488 dump_rule_list (int indent, OTF_Rule *rule, int count)
492 IPRINT ("(RuleCount %d)", count);
493 for (i = 0; i < count; i++)
495 IPRINT ("(Rule (%d)", i);
497 IPRINT ("(GlyphCount %d)", rule[i].GlyphCount);
498 IPRINT ("(LookupCount %d)", rule[i].LookupCount);
499 dump_glyph_ids (indent, "Input", rule[i].Input, rule[i].GlyphCount - 1);
500 dump_lookup_record_list (indent, rule[i].LookupRecord,
501 rule[i].LookupCount);
508 dump_rule_set_list (int indent, OTF_RuleSet *set, int count)
512 IPRINT ("(RuleSetCount %d)", count);
513 for (i = 0; i < count; i++)
515 IPRINT ("(RuleSet (%d)", i);
516 dump_rule_list (indent + 1, set[i].Rule, set[i].RuleCount);
522 dump_class_rule_list (int indent, OTF_ClassRule *rule, int count)
526 IPRINT ("(ClassRuleCnt %d)", count);
527 for (i = 0; i < count; i++)
529 IPRINT ("(ClassRule (%d)", i);
531 IPRINT ("(GlyphCount %d)", rule[i].GlyphCount);
532 IPRINT ("(LookupCount %d)", rule[i].LookupCount);
534 for (j = 0; j < rule[i].GlyphCount - 1; j++)
535 printf (" %d", rule[i].Class[j]);
537 dump_lookup_record_list (indent, rule[i].LookupRecord,
538 rule[i].LookupCount);
545 dump_class_set_list (int indent, OTF_ClassSet *set, int count)
549 IPRINT ("(ClassSetCount %d)", count);
550 for (i = 0; i < count; i++)
553 IPRINT ("(ClassSet (%d)", i);
554 dump_class_rule_list (indent + 1, set[i].ClassRule,
555 set[i].ClassRuleCnt);
561 dump_chain_rule_list (int indent, OTF_ChainRule *rule, int count)
565 IPRINT ("(ChainRuleCount %d)", count);
566 for (i = 0; i < count; i++)
568 IPRINT ("(ChainRule (%d)", i);
569 dump_glyph_ids (indent + 1, "Backtrack",
570 rule[i].Backtrack, rule[i].BacktrackGlyphCount);
571 dump_glyph_ids (indent + 1, "Input",
572 rule[i].Input, rule[i].InputGlyphCount - 1);
573 dump_glyph_ids (indent + 1, "LookAhead",
574 rule[i].LookAhead, rule[i].LookaheadGlyphCount);
575 dump_lookup_record_list (indent + 1, rule[i].LookupRecord,
576 rule[i].LookupCount);
582 dump_chain_rule_set_list (int indent, OTF_ChainRuleSet *set, int count)
586 IPRINT ("(ChainRuleSetCount %d)", count);
587 for (i = 0; i < count; i++)
589 IPRINT ("(ChainRuleSet (%d)", i);
590 dump_chain_rule_list (indent + 1,
591 set[i].ChainRule, set[i].ChainRuleCount);
597 dump_chain_class_rule_list (int indent, OTF_ChainClassRule *rule, int count)
601 IPRINT ("(ChainClassRuleCount %d)", count);
602 for (i = 0; i < count; i++)
604 IPRINT ("(ChainClassRule (%d)", i);
605 dump_glyph_ids (indent + 1, "Backtrack",
606 rule[i].Backtrack, rule[i].BacktrackGlyphCount);
607 dump_glyph_ids (indent + 1, "Input",
608 rule[i].Input, rule[i].InputGlyphCount - 1);
609 dump_glyph_ids (indent + 1, "LookAhead",
610 rule[i].LookAhead, rule[i].LookaheadGlyphCount);
611 dump_lookup_record_list (indent + 1, rule[i].LookupRecord,
612 rule[i].LookupCount);
618 dump_chain_class_set_list (int indent, OTF_ChainClassSet *set, int count)
622 IPRINT ("(ChainClassSetCount %d)", count);
623 for (i = 0; i < count; i++)
625 IPRINT ("(ChainClassSet (%d)", i);
626 dump_chain_class_rule_list (indent + 1,
627 set[i].ChainClassRule,
628 set[i].ChainClassRuleCnt);
640 dump_lookup_subtable_gsub (int indent, int index, unsigned type,
641 OTF_LookupSubTableGSUB *subtable)
643 IPRINT ("(SubTable (%d) (Format %d)", index, subtable->Format);
648 if (subtable->Format == 1)
650 dump_coverage (indent, NULL, &subtable->Coverage);
651 IPRINT ("(DeltaGlyhpID #x%04X)",
652 subtable->u.single1.DeltaGlyphID);
654 else if (subtable->Format == 2)
656 dump_coverage (indent, NULL, &subtable->Coverage);
657 dump_glyph_ids (indent, "Substitute", subtable->u.single2.Substitute,
658 subtable->u.single2.GlyphCount);
665 if (subtable->Format == 1)
667 dump_coverage (indent, NULL, &subtable->Coverage);
668 dump_sequence_list (indent,
669 subtable->u.multiple1.Sequence,
670 subtable->u.multiple1.SequenceCount);
677 if (subtable->Format == 1)
679 dump_coverage (indent, NULL, &subtable->Coverage);
680 dump_alternate_set_list (indent, subtable->u.alternate1.AlternateSet,
681 subtable->u.alternate1.AlternateSetCount);
688 if (subtable->Format == 1)
690 dump_coverage (indent, NULL, &subtable->Coverage);
691 dump_ligature_set_list (indent,
692 subtable->u.ligature1.LigatureSet,
693 subtable->u.ligature1.LigSetCount);
700 if (subtable->Format == 1)
702 dump_coverage (indent, NULL, &subtable->Coverage);
703 dump_rule_set_list (indent, subtable->u.context1.RuleSet,
704 subtable->u.context1.RuleSetCount);
706 else if (subtable->Format == 2)
708 dump_coverage (indent, NULL, &subtable->Coverage);
709 dump_class_def (indent, NULL, &subtable->u.context2.ClassDef);
710 dump_class_set_list (indent, subtable->u.context2.ClassSet,
711 subtable->u.context2.ClassSetCnt);
713 else if (subtable->Format == 3)
715 dump_coverage_list (indent, "Coverage",
716 subtable->u.context3.Coverage,
717 subtable->u.context3.GlyphCount);
718 dump_lookup_record_list (indent,
719 subtable->u.context3.LookupRecord,
720 subtable->u.context3.LookupCount);
727 if (subtable->Format == 1)
729 dump_coverage (indent, NULL, &subtable->Coverage);
730 dump_chain_rule_set_list
732 subtable->u.chain_context1.ChainRuleSet,
733 subtable->u.chain_context1.ChainRuleSetCount);
735 else if (subtable->Format == 2)
737 dump_coverage (indent, NULL, &subtable->Coverage);
738 dump_class_def (indent, "BacktrackClassDef",
739 &subtable->u.chain_context2.BacktrackClassDef);
740 dump_class_def (indent, "InputClassDef",
741 &subtable->u.chain_context2.InputClassDef);
742 dump_class_def (indent, "LookaheadClassDef",
743 &subtable->u.chain_context2.LookaheadClassDef);
744 dump_chain_class_set_list
746 subtable->u.chain_context2.ChainClassSet,
747 subtable->u.chain_context2.ChainClassSetCnt);
749 else if (subtable->Format == 3)
752 (indent, "BackTrackGlyphCount",
753 subtable->u.chain_context3.Backtrack,
754 subtable->u.chain_context3.BacktrackGlyphCount);
756 (indent, "InputGlyphCount",
757 subtable->u.chain_context3.Input,
758 subtable->u.chain_context3.InputGlyphCount);
760 (indent, "LookaheadGlyphCount",
761 subtable->u.chain_context3.LookAhead,
762 subtable->u.chain_context3.LookaheadGlyphCount);
763 dump_lookup_record_list
765 subtable->u.chain_context3.LookupRecord,
766 subtable->u.chain_context3.LookupCount);
773 IPRINT ("(ExtensionLookupType %d)",
774 subtable->u.extension1.ExtensionLookupType);
775 IPRINT ("(ExtensionOffset %d)",
776 subtable->u.extension1.ExtensionOffset);
777 dump_lookup_subtable_gsub (indent, index,
778 subtable->u.extension1.ExtensionLookupType,
780 + subtable->u.extension1.ExtensionOffset));
784 printf (" not-yet-substcount");
794 dump_gsub_table (int indent, OTF_GSUB *gsub)
800 IPRINT ("(Version %d.%d)", gsub->Version.high, gsub->Version.low);
801 IPRINT ("(ScriptList #x%04X)", gsub->ScriptList.offset);
802 IPRINT ("(FeatureList #x%04X)", gsub->FeatureList.offset);
803 IPRINT ("(LookupList #x%04X))", gsub->LookupList.offset);
805 dump_script_list (indent, &gsub->ScriptList);
806 dump_feature_list (indent, &gsub->FeatureList);
807 dump_lookup_list (indent, &gsub->LookupList, 1);
815 dump_lookup_subtable_gpos (int indent, int index, unsigned type,
816 OTF_LookupSubTableGPOS *subtable)
818 IPRINT ("(SubTable (%d) (Format %d)", index, subtable->Format);
823 if (subtable->Format == 1)
825 dump_coverage (indent, NULL, &subtable->Coverage);
826 IPRINT ("(ValueFormat #x%04X)",
827 subtable->u.single1.ValueFormat);
828 dump_value_record (indent, "Value", &subtable->u.single1.Value);
830 else if (subtable->Format == 2)
834 dump_coverage (indent, NULL, &subtable->Coverage);
835 IPRINT ("(ValueFormat #x%04X)",
836 subtable->u.single2.ValueFormat);
837 IPRINT ("(ValueCount %d)",
838 subtable->u.single2.ValueCount);
839 for (i = 0; i < subtable->u.single2.ValueCount; i++)
840 dump_value_record (indent, "Value", &subtable->u.single2.Value[i]);
847 if (subtable->Format == 1)
849 printf (" not-yet-supported");
851 else if (subtable->Format == 2)
853 dump_coverage (indent, NULL, &subtable->Coverage);
854 IPRINT ("(ValueFormat1 #x%04X)",
855 subtable->u.pair2.ValueFormat1);
856 IPRINT ("(ValueFormat2 #x%04X)",
857 subtable->u.pair2.ValueFormat2);
858 dump_class_def (indent, "ClassDef1",
859 &subtable->u.pair2.ClassDef1);
860 dump_class_def (indent, "ClassDef2",
861 &subtable->u.pair2.ClassDef2);
862 IPRINT ("(Class1Count %d)",
863 subtable->u.pair2.Class1Count);
864 IPRINT ("(Class2Count %d)",
865 subtable->u.pair2.Class2Count);
866 dump_class1_record_list (indent,
867 subtable->u.pair2.Class1Count,
868 subtable->u.pair2.Class2Count,
869 subtable->u.pair2.Class1Record);
876 if (subtable->Format == 1)
878 printf (" not-yet-supported");
885 if (subtable->Format == 1)
887 dump_coverage (indent, "Mark", &subtable->Coverage);
888 dump_coverage (indent, "Base",
889 &subtable->u.mark_base1.BaseCoverage);
890 IPRINT ("(ClassCount %d)",
891 subtable->u.mark_base1.ClassCount);
892 dump_mark_array (indent, &subtable->u.mark_base1.MarkArray);
893 dump_anchor_array (indent, subtable->u.mark_base1.ClassCount,
894 &subtable->u.mark_base1.BaseArray);
899 if (subtable->Format == 1)
901 printf (" not-yet-supported");
908 if (subtable->Format == 1)
910 dump_coverage (indent, "Mark1", &subtable->Coverage);
911 dump_coverage (indent, "Mark2",
912 &subtable->u.mark_mark1.Mark2Coverage);
913 IPRINT ("(ClassCount %d)",
914 subtable->u.mark_mark1.ClassCount);
915 dump_mark_array (indent, &subtable->u.mark_mark1.Mark1Array);
916 dump_anchor_array (indent, subtable->u.mark_mark1.ClassCount,
917 &subtable->u.mark_mark1.Mark2Array);
924 if (subtable->Format == 1)
926 dump_coverage (indent, NULL, &subtable->Coverage);
927 dump_rule_set_list (indent, subtable->u.context1.RuleSet,
928 subtable->u.context1.RuleSetCount);
930 else if (subtable->Format == 2)
932 dump_coverage (indent, NULL, &subtable->Coverage);
933 dump_class_def (indent, NULL, &subtable->u.context2.ClassDef);
934 dump_class_set_list (indent, subtable->u.context2.ClassSet,
935 subtable->u.context2.ClassSetCnt);
937 else if (subtable->Format == 3)
939 dump_coverage_list (indent, "Coverage",
940 subtable->u.context3.Coverage,
941 subtable->u.context3.GlyphCount);
942 dump_lookup_record_list (indent,
943 subtable->u.context3.LookupRecord,
944 subtable->u.context3.LookupCount);
951 if (subtable->Format == 1)
953 dump_coverage (indent, NULL, &subtable->Coverage);
954 dump_chain_rule_set_list
956 subtable->u.chain_context1.ChainRuleSet,
957 subtable->u.chain_context1.ChainRuleSetCount);
959 else if (subtable->Format == 2)
961 dump_coverage (indent, NULL, &subtable->Coverage);
962 dump_class_def (indent, "BacktrackClassDef",
963 &subtable->u.chain_context2.BacktrackClassDef);
964 dump_class_def (indent, "InputClassDef",
965 &subtable->u.chain_context2.InputClassDef);
966 dump_class_def (indent, "LookaheadClassDef",
967 &subtable->u.chain_context2.LookaheadClassDef);
968 dump_chain_class_set_list
970 subtable->u.chain_context2.ChainClassSet,
971 subtable->u.chain_context2.ChainClassSetCnt);
973 else if (subtable->Format == 3)
976 (indent, "BackTrackGlyphCount",
977 subtable->u.chain_context3.Backtrack,
978 subtable->u.chain_context3.BacktrackGlyphCount);
980 (indent, "InputGlyphCount",
981 subtable->u.chain_context3.Input,
982 subtable->u.chain_context3.InputGlyphCount);
984 (indent, "LookaheaGlyphCount",
985 subtable->u.chain_context3.LookAhead,
986 subtable->u.chain_context3.LookaheadGlyphCount);
987 dump_lookup_record_list
989 subtable->u.chain_context3.LookupRecord,
990 subtable->u.chain_context3.LookupCount);
1001 dump_gpos_table (int indent, OTF_GPOS *gpos)
1009 IPRINT ("(Version %d.%d)", gpos->Version.high, gpos->Version.low);
1010 IPRINT ("(ScriptList #x%04X)", gpos->ScriptList.offset);
1011 IPRINT ("(FeatureList #x%04X)", gpos->FeatureList.offset);
1012 IPRINT ("(LookupList #x%04X))", gpos->LookupList.offset);
1014 dump_script_list (indent, &gpos->ScriptList);
1015 dump_feature_list (indent, &gpos->FeatureList);
1016 dump_lookup_list (indent, &gpos->LookupList, 0);
1022 dump_base_table (OTF_BASE *base)
1027 dump_jstf_table (OTF_JSTF *jstf)
1035 dump_gdef_header (int indent, OTF_GDEFHeader *header)
1039 IPRINT ("(Version %d.%d)",
1040 header->Version.high, header->Version.low);
1041 IPRINT ("(GlyphClassDef #x%04X)", header->GlyphClassDef);
1042 IPRINT ("(AttachList #x%04X)", header->AttachList);
1043 IPRINT ("(LigCaretList #x%04X)", header->LigCaretList);
1044 IPRINT ("(MarkAttachClassDef #x%04X))",
1045 header->MarkAttachClassDef);
1049 dump_attach_list (int indent, OTF_AttachList *list)
1054 dump_lig_caret_list (int indent, OTF_LigCaretList *list)
1058 IPRINT ("(LigCaretList");
1060 dump_coverage (indent, NULL, &list->Coverage);
1061 IPRINT ("(LigGlyphCount %d)", list->LigGlyphCount);
1062 for (i = 0; i < list->LigGlyphCount; i++)
1064 IPRINT ("(LigGlyph (%d) (offset #x%04X)",
1065 i, list->LigGlyph[i].offset);
1067 IPRINT ("(CaretCount %d)", list->LigGlyph[i].CaretCount);
1068 for (j = 0; j < list->LigGlyph[i].CaretCount; j++)
1070 unsigned format = list->LigGlyph[i].CaretValue[j].CaretValueFormat;
1072 IPRINT ("(Caret (%d) (CaretValueFormat %d)", j, format);
1075 printf ("(Coordinate %d)",
1076 list->LigGlyph[i].CaretValue[j].f.f1.Coordinate);
1078 else if (format == 2)
1080 printf ("(CaretValuePoint %d)",
1081 list->LigGlyph[i].CaretValue[j].f.f2.CaretValuePoint);
1083 else if (format == 3)
1085 printf ("(Coodinate %d)",
1086 list->LigGlyph[i].CaretValue[j].f.f3.Coordinate);
1089 (indent, "DeviceTable",
1090 &list->LigGlyph[i].CaretValue[j].f.f3.DeviceTable);
1102 dump_gdef_table (int indent, OTF_GDEF *gdef)
1108 dump_gdef_header (indent, &gdef->header);
1109 if (gdef->header.GlyphClassDef)
1110 dump_class_def (indent, "GlyphClassDef", &gdef->glyph_class_def);
1111 if (gdef->header.AttachList)
1112 dump_attach_list (indent, &gdef->attach_list);
1113 if (gdef->header.LigCaretList)
1114 dump_lig_caret_list (indent, &gdef->lig_caret_list);
1115 if (gdef->header.MarkAttachClassDef)
1116 dump_class_def (indent, "MarkAttachClassDef",
1117 &gdef->mark_attach_class_def);
1124 dump_cmap_table (int indent, OTF_cmap *cmap)
1130 IPRINT ("(version %d)", cmap->version);
1131 IPRINT ("(numTables %d)", cmap->numTables);
1132 for (i = 0; i < cmap->numTables; i++)
1134 IPRINT ("(EncodingRecord (%d) (platformID %d) (encodingID %d)",
1136 cmap->EncodingRecord[i].platformID,
1137 cmap->EncodingRecord[i].encodingID);
1139 IPRINT ("(Subtable (offset #x%04X) (format %d) (length #x%04X) (language %d)",
1140 cmap->EncodingRecord[i].offset,
1141 cmap->EncodingRecord[i].subtable.format,
1142 cmap->EncodingRecord[i].subtable.length,
1143 cmap->EncodingRecord[i].subtable.language);
1145 switch (cmap->EncodingRecord[i].subtable.format)
1150 unsigned char *array
1151 = cmap->EncodingRecord[i].subtable.f.f0->glyphIdArray;
1153 IPRINT ("(glyphIdArray");
1154 for (j = 0; j < 16; j++)
1157 for (k = 0; k < 16; k++)
1158 printf (" %3d", array[j * 16 + k]);
1166 OTF_EncodingSubtable4 *sub4
1167 = cmap->EncodingRecord[i].subtable.f.f4;
1170 IPRINT ("(segCountX2 %d) (searchRange %d)",
1171 sub4->segCountX2, sub4->searchRange);
1172 IPRINT ("(entrySelector %d) (rangeShift %d)",
1173 sub4->entrySelector, sub4->rangeShift);
1174 for (j = 0; j < sub4->segCountX2 / 2; j++)
1176 IPRINT ("(Segment (%d)", j);
1178 IPRINT ("(startCount #x%04X) (endCount #x%04X)",
1179 sub4->segments[j].startCount,
1180 sub4->segments[j].endCount);
1181 IPRINT ("(idDelta %d) (idRangeOffset #x%04X))",
1182 sub4->segments[j].idDelta,
1183 sub4->segments[j].idRangeOffset);
1186 IPRINT ("(glyphIdArray");
1187 for (j = 0; j < sub4->GlyphCount; j++)
1191 printf (" %3d", sub4->glyphIdArray[j]);
1199 OTF_EncodingSubtable6 *sub6
1200 = cmap->EncodingRecord[i].subtable.f.f6;
1203 IPRINT ("(firstCode %d) (entryCount %d)",
1204 sub6->firstCode, sub6->entryCount);
1205 IPRINT ("(glyphIdArray");
1206 for (j = 0; j < sub6->entryCount; j++)
1210 printf (" %3d", sub6->glyphIdArray[j]);
1226 dump_name_table (int indent, OTF_name *name)
1232 IPRINT ("(format %d)", name->format);
1233 IPRINT ("(count %d)", name->count);
1234 IPRINT ("(stringOffset %d)", name->stringOffset);
1235 for (i = 0; i < name->count; i++)
1237 OTF_NameRecord *rec = name->nameRecord + i;
1239 IPRINT ("(nameRecord (%d)", i);
1241 IPRINT ("(platformID %d) (encodingID %d) (languageID %d) (nameID %d)",
1242 rec->platformID, rec->encodingID, rec->languageID, rec->nameID);
1243 IPRINT ("(length %d) (offset #x%04X))", rec->length, rec->offset);
1246 for (i = 0; i <= OTF_max_nameID; i++)
1248 IPRINT ("(nameID %d \"%s\")", i, name->name[i]);
1262 dump_offset_table (1, &otf->offset_table);
1263 for (i = 0; i < otf->offset_table.numTables; i++)
1264 dump_table_directory (1, otf->table_dirs + i, i);
1267 dump_head_table (1, otf->head);
1269 dump_name_table (1, otf->name);
1271 dump_cmap_table (1, otf->cmap);
1273 dump_gdef_table (1, otf->gdef);
1275 dump_gsub_table (1, otf->gsub);
1277 dump_gpos_table (1, otf->gpos);
1280 dump_base_table (1, otf->base);
1282 dump_jstf_table (1, otf->jstf);
1289 main (int argc, char **argv)
1295 fprintf (stderr, "Usage, dtfdump OTF-FILE");
1299 otf = OTF_open (argv[1]);
1302 OTF_perror ("otfdump");
1305 OTF_get_table (otf, "head");
1306 OTF_get_table (otf, "name");
1307 OTF_get_table (otf, "cmap");
1308 OTF_get_table (otf, "GDEF");
1309 OTF_get_table (otf, "GSUB");
1310 OTF_get_table (otf, "GPOS");
1312 OTF_get_table (otf, "BASE");
1313 OTF_get_table (otf, "JSTF");