Blame example/otfdump.c

Packit daac2c
/* otfdump.c -- Dump OpenType Layout Tables.
Packit daac2c
Packit daac2c
Copyright (C) 2003, 2004, 2008, 2009, 2010
Packit daac2c
  National Institute of Advanced Industrial Science and Technology (AIST)
Packit daac2c
  Registration Number H15PRO167
Packit daac2c
Packit daac2c
This file is part of libotf.
Packit daac2c
Packit daac2c
Libotf is free software; you can redistribute it and/or modify it
Packit daac2c
under the terms of the GNU Lesser General Public License as published
Packit daac2c
by the Free Software Foundation; either version 2.1 of the License, or
Packit daac2c
(at your option) any later version.
Packit daac2c
Packit daac2c
Libotf is distributed in the hope that it will be useful, but WITHOUT
Packit daac2c
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit daac2c
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit daac2c
License for more details.
Packit daac2c
Packit daac2c
You should have received a copy of the GNU Lesser General Public
Packit daac2c
License along with this library, in a file named COPYING; if not,
Packit daac2c
write to the Free Software Foundation, Inc., 59 Temple Place, Suite
Packit daac2c
330, Boston, MA 02111-1307, USA.  */
Packit daac2c
Packit daac2c
#include <stdio.h>
Packit daac2c
#include <stdlib.h>
Packit daac2c
#include <string.h>
Packit daac2c
#include <unistd.h>
Packit daac2c
#include <sys/types.h>
Packit daac2c
#include <sys/stat.h>
Packit daac2c
#include <fcntl.h>
Packit daac2c
#include <libgen.h>
Packit daac2c
Packit daac2c
#include <otf.h>
Packit daac2c
Packit daac2c
/* Indented print.  */
Packit daac2c
#define IPRINT printf("\n%*s", indent * 2, ""), printf
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_tag (OTF_Tag tag)
Packit daac2c
{
Packit daac2c
  printf ("(tag \"");
Packit daac2c
  putchar (tag >> 24);
Packit daac2c
  putchar ((tag >> 16) & 0xFF);
Packit daac2c
  putchar ((tag >> 8) & 0xFF);
Packit daac2c
  putchar (tag & 0xFF);
Packit daac2c
  printf ("\" #x%04X)", tag);
Packit daac2c
}
Packit daac2c
Packit daac2c
/* HEAD */
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_offset_table (int indent, OTF_OffsetTable *table)
Packit daac2c
{
Packit daac2c
  IPRINT ("(OffsetTable");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(sfnt-version %d.%d)", 
Packit daac2c
	  table->sfnt_version.high, table->sfnt_version.low);
Packit daac2c
  IPRINT ("(numTables %d)", table->numTables);
Packit daac2c
  IPRINT ("(searchRange %d)", table->searchRange);
Packit daac2c
  IPRINT ("(enterSelector %d)", table->enterSelector);
Packit daac2c
  IPRINT ("(rangeShift %d))", table->rangeShift);  
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_table_directory (int indent, OTF_TableDirectory *table, int idx)
Packit daac2c
{
Packit daac2c
  IPRINT ("(Table %d ", idx);
Packit daac2c
  dump_tag (table->tag);
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(checkSum %08X) (offset #x%08X) (length: #x%08X))",
Packit daac2c
	  table->checkSum, table->offset, table->length);
Packit daac2c
}
Packit daac2c
Packit daac2c

Packit daac2c
Packit daac2c
/* head */
Packit daac2c
static void
Packit daac2c
dump_head_table (int indent, OTF_head *head)
Packit daac2c
{
Packit daac2c
  IPRINT ("(head");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(TableVersionNumber %d.%d)",
Packit daac2c
	  head->TableVersionNumber.high, head->TableVersionNumber.low);
Packit daac2c
  IPRINT ("(fontRevision %d.%d)",
Packit daac2c
	  head->fontRevision.high, head->fontRevision.low);
Packit daac2c
  IPRINT ("(checkSumAdjustment #x%04X)", head->checkSumAdjustment);
Packit daac2c
  IPRINT ("(magicNumber #x%04X)", head->magicNumber);
Packit daac2c
  IPRINT ("(flags #x%04X)", head->flags);
Packit daac2c
  IPRINT ("(unitsPerEm %d)", head->unitsPerEm);
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c

Packit daac2c
/* COMMON */
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_glyph_ids (int indent, char *title, OTF_GlyphID *ids, unsigned count)
Packit daac2c
{
Packit daac2c
  IPRINT ("(%s (count %d)", title, count);
Packit daac2c
  while (count-- > 0)
Packit daac2c
    {
Packit daac2c
      printf (" #x%04X", *ids);
Packit daac2c
      ids++;
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static int *
Packit daac2c
dump_coverage (int indent, char *title, OTF_Coverage *coverage)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
  int *char_list;
Packit daac2c
Packit daac2c
  IPRINT ("(%sCoverage (CoverageFormat %d)",
Packit daac2c
	  (title ? title : ""), coverage->CoverageFormat);
Packit daac2c
  indent++;
Packit daac2c
  if (coverage->CoverageFormat == 1)
Packit daac2c
    {
Packit daac2c
      dump_glyph_ids (indent, "GlyphArray", coverage->table.GlyphArray,
Packit daac2c
		      coverage->Count);
Packit daac2c
      char_list = malloc (sizeof (int) * (coverage->Count + 1));
Packit daac2c
      for (i = 0; i < coverage->Count; i++)
Packit daac2c
	char_list[i] = coverage->table.GlyphArray[i];
Packit daac2c
      char_list[i] = -1;
Packit daac2c
    }
Packit daac2c
  else
Packit daac2c
    {
Packit daac2c
      int n, c;
Packit daac2c
Packit daac2c
      IPRINT ("(RangeCount %d)", coverage->Count);
Packit daac2c
      indent++;
Packit daac2c
      for (i = n = 0; i < coverage->Count; i++)
Packit daac2c
	{
Packit daac2c
	  IPRINT ("(Range (%d) (Start #x%04X) (End #x%04X)", i,
Packit daac2c
		  coverage->table.RangeRecord[i].Start,
Packit daac2c
		  coverage->table.RangeRecord[i].End);
Packit daac2c
	  indent++;
Packit daac2c
	  IPRINT ("(StartCoverageIndex %d))",
Packit daac2c
		  coverage->table.RangeRecord[i].StartCoverageIndex);
Packit daac2c
	  indent--;
Packit daac2c
	  n += (coverage->table.RangeRecord[i].End
Packit daac2c
		- coverage->table.RangeRecord[i].Start + 1);
Packit daac2c
	}
Packit daac2c
      char_list = malloc (sizeof (int) * (n + 1));
Packit daac2c
      for (i = n = 0; i < coverage->Count; i++)
Packit daac2c
	for (c = coverage->table.RangeRecord[i].Start;
Packit daac2c
	     c <= coverage->table.RangeRecord[i].End;
Packit daac2c
	     c++)
Packit daac2c
	  char_list[n++] = c;
Packit daac2c
      char_list[n] = -1;
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
  return char_list;
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_coverage_list (int indent, char *title,
Packit daac2c
		    OTF_Coverage *coverage, unsigned num)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(%s %d)", title, num);
Packit daac2c
  for (i = 0; i < num; i++)
Packit daac2c
    free (dump_coverage (indent, NULL, coverage + i));
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_language_system (int indent, int index, OTF_Tag tag, OTF_Offset offset,
Packit daac2c
		      OTF_LangSys *langsys)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(LangSys ");
Packit daac2c
  if (index >= 0)
Packit daac2c
    printf ("(%d) ", index);
Packit daac2c
  if (tag)
Packit daac2c
    dump_tag (tag);
Packit daac2c
  else
Packit daac2c
    printf ("DefaultLangSys");
Packit daac2c
  printf (" (Offset #x%04X)", offset);
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(LookupOrder #x%04X)", langsys->LookupOrder);
Packit daac2c
  IPRINT ("(ReqFeatureIndex %d)", langsys->ReqFeatureIndex);
Packit daac2c
  IPRINT ("(FeatureCount %d)", langsys->FeatureCount);
Packit daac2c
  if (langsys->FeatureCount)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(FeatureIndex");
Packit daac2c
      for (i = 0; i < langsys->FeatureCount; i++)
Packit daac2c
	printf (" %d", langsys->FeatureIndex[i]);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_script_list (int indent, OTF_ScriptList *list)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  IPRINT ("(ScriptList (count %d)", list->ScriptCount);
Packit daac2c
  indent++;
Packit daac2c
  for (i = 0; i < list->ScriptCount; i++)
Packit daac2c
    {
Packit daac2c
      OTF_Script *script = list->Script + i;
Packit daac2c
Packit daac2c
      IPRINT ("(Script (%d) ", i);
Packit daac2c
      dump_tag (list->Script[i].ScriptTag);
Packit daac2c
      printf (" (Offset #x%04X)", list->Script[i].offset);
Packit daac2c
      indent++;
Packit daac2c
      IPRINT ("(DefaultLangSysOffset #x%04X)",
Packit daac2c
	      script->DefaultLangSysOffset);
Packit daac2c
      if (script->DefaultLangSysOffset)
Packit daac2c
	dump_language_system (indent, -1, 0,
Packit daac2c
			      script->DefaultLangSysOffset,
Packit daac2c
			      &script->DefaultLangSys);
Packit daac2c
      IPRINT ("(LangSysCount %d)", script->LangSysCount);
Packit daac2c
      for (j = 0; j < script->LangSysCount; j++)
Packit daac2c
	dump_language_system (indent, j,
Packit daac2c
			      script->LangSysRecord[j].LangSysTag,
Packit daac2c
			      script->LangSysRecord[j].LangSys,
Packit daac2c
			      script->LangSys + j);
Packit daac2c
      printf (")");
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_feature_list (int indent, OTF_FeatureList *list)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
  
Packit daac2c
  IPRINT ("(FeatureList (count %d)", list->FeatureCount);
Packit daac2c
  indent++;
Packit daac2c
  for (i = 0; i < list->FeatureCount; i++)
Packit daac2c
    {
Packit daac2c
      OTF_Feature *feature = list->Feature + i;
Packit daac2c
Packit daac2c
      IPRINT ("(Feature (%d) ", i);
Packit daac2c
      dump_tag (list->Feature[i].FeatureTag);
Packit daac2c
      printf (" (Offset #x%04X)", list->Feature[i].offset);
Packit daac2c
      printf (" (LookupCount %d)", feature->LookupCount);
Packit daac2c
      if (feature->LookupCount)
Packit daac2c
	{
Packit daac2c
	  indent++;
Packit daac2c
	  IPRINT ("(LookupListIndex");
Packit daac2c
	  for (j = 0; j < feature->LookupCount; j++)
Packit daac2c
	    printf (" %d", feature->LookupListIndex[j]);
Packit daac2c
	  printf (")");
Packit daac2c
	  indent--;
Packit daac2c
	}
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_class_def (int indent, char *title, OTF_ClassDef *class)
Packit daac2c
{
Packit daac2c
  IPRINT ("(%s (offset #x%04X) (ClassFormat %d)",
Packit daac2c
	  (title ? title : "ClassDef"),
Packit daac2c
	  class->offset, class->ClassFormat);
Packit daac2c
  if (class->offset)
Packit daac2c
    {
Packit daac2c
      indent++;
Packit daac2c
      if (class->ClassFormat == 1)
Packit daac2c
	{
Packit daac2c
	  IPRINT ("(StartGlyph #x%04X)", class->f.f1.StartGlyph);
Packit daac2c
	  dump_glyph_ids (indent, "ClassValueArray",
Packit daac2c
			  (OTF_GlyphID *) class->f.f1.ClassValueArray,
Packit daac2c
			  class->f.f1.GlyphCount);
Packit daac2c
	}
Packit daac2c
      else if (class->ClassFormat == 2)
Packit daac2c
	{
Packit daac2c
	  int i;
Packit daac2c
Packit daac2c
	  IPRINT ("(ClassRangeCount %d)", class->f.f2.ClassRangeCount);
Packit daac2c
	  IPRINT ("(ClassRangeRecord");
Packit daac2c
	  indent++;
Packit daac2c
	  for (i = 0; i < class->f.f2.ClassRangeCount; i++)
Packit daac2c
	    IPRINT ("((Start #x%04X) (End #x%04X) (class %d))",
Packit daac2c
		    class->f.f2.ClassRangeRecord[i].Start,
Packit daac2c
		    class->f.f2.ClassRangeRecord[i].End,
Packit daac2c
		    class->f.f2.ClassRangeRecord[i].Class);
Packit daac2c
	  printf (")");
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" UnknownClassFormat");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_device_table (int indent, char *title, OTF_DeviceTable *table)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  if (! table->offset)
Packit daac2c
    return;
Packit daac2c
  IPRINT ("(%s (offset #x%04X)", title, table->offset);
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(StartSize %d) (EndSize %d) (DeltaFormat %d)",
Packit daac2c
	  table->StartSize, table->EndSize, table->DeltaFormat);
Packit daac2c
  if (table->DeltaValue)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(DeltaValue");
Packit daac2c
      for (i = 0; i < table->EndSize - table->StartSize + 1; i++)
Packit daac2c
	printf (" %d", table->DeltaValue[i]);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c

Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_value_record (int indent, char *title, OTF_ValueRecord *rec)
Packit daac2c
{
Packit daac2c
  IPRINT ("(%s %d %d %d %d", title,
Packit daac2c
	  rec->XPlacement, rec->YPlacement, rec->XAdvance, rec->YAdvance);
Packit daac2c
  indent++;
Packit daac2c
  if (rec->XPlaDevice.offset)
Packit daac2c
    dump_device_table (indent, "XPlaDevice", &rec->XPlaDevice);
Packit daac2c
  if (rec->YPlaDevice.offset)
Packit daac2c
    dump_device_table (indent, "YPlaDevice", &rec->YPlaDevice);
Packit daac2c
  if (rec->XAdvDevice.offset)
Packit daac2c
    dump_device_table (indent, "XAdvDevice", &rec->XAdvDevice);
Packit daac2c
  if (rec->YAdvDevice.offset)
Packit daac2c
    dump_device_table (indent, "YAdvDevice", &rec->YAdvDevice);
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_sequence_list (int indent, OTF_Sequence *sequence, unsigned num)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
  IPRINT ("(SequenceCount %d)", num);
Packit daac2c
Packit daac2c
  for (i = 0; i < num; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(Sequence (%d) (offset #x%04X)",
Packit daac2c
	      i, sequence[i].offset);
Packit daac2c
      dump_glyph_ids (indent + 1, "Substitute", sequence[i].Substitute,
Packit daac2c
		      sequence[i].GlyphCount);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_alternate_set_list (int indent, OTF_AlternateSet *altset, unsigned num)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(AlternateSetCount %d)", num);
Packit daac2c
  for (i = 0; i < num; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(AlternateSet (%d) (offset #x%04X)",
Packit daac2c
	      i, altset[i].offset);
Packit daac2c
      dump_glyph_ids (indent + 1, "Alternate", altset[i].Alternate,
Packit daac2c
		      altset[i].GlyphCount);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_ligature_set_list (int indent, int *char_list,
Packit daac2c
			OTF_LigatureSet *ligset, unsigned num)
Packit daac2c
{
Packit daac2c
  int i, j, k;
Packit daac2c
Packit daac2c
  IPRINT ("(LigSetCount %d)", num);
Packit daac2c
  for (i = 0; i < num; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(LigatureSet (%d) (offset #x%04X) (count %d)",
Packit daac2c
	      i, ligset[i].offset, ligset[i].LigatureCount);
Packit daac2c
      indent++;
Packit daac2c
      for (j = 0; j < ligset[i].LigatureCount; j++)
Packit daac2c
	{
Packit daac2c
	  IPRINT ("(Ligature (%d) (offset #x%04X)",
Packit daac2c
		  j, ligset[i].Ligature[j].offset);
Packit daac2c
	  indent++;
Packit daac2c
	  IPRINT ("(LigGlyph #x%04X)",
Packit daac2c
		  ligset[i].Ligature[j].LigGlyph);
Packit daac2c
	  dump_glyph_ids (indent, "Component", ligset[i].Ligature[j].Component,
Packit daac2c
			  ligset[i].Ligature[j].CompCount - 1);
Packit daac2c
	  IPRINT ("(i.e. #x%04X", char_list[i]);
Packit daac2c
	  for (k = 0; k < ligset[i].Ligature[j].CompCount - 1; k++)
Packit daac2c
	    printf (" #x%04X", ligset[i].Ligature[j].Component[k]);
Packit daac2c
	  printf (" = #x%04X)", ligset[i].Ligature[j].LigGlyph);
Packit daac2c
	  printf (")");
Packit daac2c
	  indent--;
Packit daac2c
	}
Packit daac2c
      indent--;
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_pair_set_list (int indent, unsigned count, OTF_PairSet *set)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(PairSet (%d)", i);
Packit daac2c
      indent++;
Packit daac2c
      for (j = 0; j < set[i].PairValueCount; j++)
Packit daac2c
	{
Packit daac2c
	  IPRINT ("(PairValueRecord (%d)", j);
Packit daac2c
	  indent++;
Packit daac2c
	  IPRINT ("(SecondGlyph #x%04X)",
Packit daac2c
		  set[i].PairValueRecord[j].SecondGlyph);
Packit daac2c
	  dump_value_record (indent, "Value1",
Packit daac2c
			     &set[i].PairValueRecord[j].Value1);
Packit daac2c
	  dump_value_record (indent, "Value2",
Packit daac2c
			     &set[i].PairValueRecord[j].Value2);
Packit daac2c
	  printf (")");
Packit daac2c
	  indent--;
Packit daac2c
	}
Packit daac2c
      printf (")");
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_class1_record_list (int indent,
Packit daac2c
			 unsigned Class1Count, unsigned Class2Count,
Packit daac2c
			 OTF_Class1Record *rec)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  for (i = 0; i < Class1Count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(Class1Record (%d)", i);
Packit daac2c
      indent++;
Packit daac2c
      for (j = 0; j < Class2Count; j++)
Packit daac2c
	{
Packit daac2c
	  IPRINT ("(Class2Record (%d)", j);
Packit daac2c
	  indent++;
Packit daac2c
	  dump_value_record (indent, "Value1", &rec[i].Class2Record[j].Value1);
Packit daac2c
	  dump_value_record (indent, "Value2", &rec[i].Class2Record[j].Value2);
Packit daac2c
	  printf (")");
Packit daac2c
	  indent--;
Packit daac2c
	}
Packit daac2c
      printf (")");
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_anchor (int indent, OTF_Anchor *anchor)
Packit daac2c
{
Packit daac2c
  if (anchor->offset == 0)
Packit daac2c
    return;
Packit daac2c
  IPRINT ("(Anchor (offset #x%04X) (AnchorFormat %d)",
Packit daac2c
	  anchor->offset, anchor->AnchorFormat);
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(XCoordinate %d) (YCoordinate %d)",
Packit daac2c
	  anchor->XCoordinate, anchor->YCoordinate);
Packit daac2c
  if (anchor->AnchorFormat == 1)
Packit daac2c
    ;
Packit daac2c
  else if (anchor->AnchorFormat == 2)
Packit daac2c
    IPRINT ("(AnchorPoint %d)", anchor->f.f1.AnchorPoint);
Packit daac2c
  else
Packit daac2c
    {
Packit daac2c
      dump_device_table (indent, "XDeviceTable", &anchor->f.f2.XDeviceTable);
Packit daac2c
      dump_device_table (indent, "YDeviceTable", &anchor->f.f2.YDeviceTable);
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_entry_exit_list (int indent, unsigned count, OTF_EntryExitRecord *rec)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(EntryExitRecord (%d)", i);
Packit daac2c
      indent++;
Packit daac2c
      dump_anchor (indent, &rec[i].EntryAnchor);
Packit daac2c
      dump_anchor (indent, &rec[i].EntryAnchor);
Packit daac2c
      printf (")");
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_mark_array (int indent, OTF_MarkArray *array)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(MarkArray (MarkCount %d)", array->MarkCount);
Packit daac2c
  indent++;
Packit daac2c
  for (i = 0; i < array->MarkCount; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(MarkRecord (%d) (Class %d)", i, array->MarkRecord[i].Class);
Packit daac2c
      dump_anchor (indent + 1, &array->MarkRecord[i].MarkAnchor);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_anchor_array (int indent, unsigned ClassCount, OTF_AnchorArray *array)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  IPRINT ("(AnchorArray (Count %d)", array->Count);
Packit daac2c
  indent++;
Packit daac2c
  for (i = 0; i < array->Count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(AnchorRecord (%d) ", i);
Packit daac2c
      for (j = 0; j < ClassCount; j++)
Packit daac2c
	dump_anchor (indent + 1, array->AnchorRecord[i].Anchor + j);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_lookup_record_list (int indent, OTF_LookupRecord *rec, unsigned num)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(LookupCount %d)", num);
Packit daac2c
  for (i = 0; i < num; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(LookupRecord (%d)", i);
Packit daac2c
      indent++;
Packit daac2c
      IPRINT ("(SequenceIndex %d)", rec[i].SequenceIndex);
Packit daac2c
      IPRINT ("(LookupListIndex %d))", rec[i].LookupListIndex);
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
static void dump_lookup_subtable_gsub (int indent, int index, unsigned type,
Packit daac2c
				       OTF_LookupSubTableGSUB *subtable);
Packit daac2c
static void dump_lookup_subtable_gpos (int indent, int index, unsigned type,
Packit daac2c
				       OTF_LookupSubTableGPOS *subtable);
Packit daac2c
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_lookup_list (int indent, OTF_LookupList *list, int gsub)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  IPRINT ("(LookupList (count %d)", list->LookupCount);
Packit daac2c
  indent++;
Packit daac2c
  for (i = 0; i < list->LookupCount; i++)
Packit daac2c
    {
Packit daac2c
      OTF_Lookup *lookup = list->Lookup + i;
Packit daac2c
Packit daac2c
      IPRINT ("(Lookup (%d) (Offset #x%04X)",
Packit daac2c
	      i, lookup->offset);
Packit daac2c
      printf (" (Type %d) (Flag #x%04X) (SubTableCount %d)",
Packit daac2c
	      lookup->LookupType, lookup->LookupFlag, lookup->SubTableCount);
Packit daac2c
      if (gsub)
Packit daac2c
	for (j = 0; j < lookup->SubTableCount; j++)
Packit daac2c
	  dump_lookup_subtable_gsub (indent + 1, j,
Packit daac2c
				     lookup->LookupType,
Packit daac2c
				     lookup->SubTable.gsub + j);
Packit daac2c
      else
Packit daac2c
	for (j = 0; j < lookup->SubTableCount; j++)
Packit daac2c
	  dump_lookup_subtable_gpos (indent + 1, j,
Packit daac2c
				     lookup->LookupType,
Packit daac2c
				     lookup->SubTable.gpos + j);
Packit daac2c
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_rule_list (int indent, OTF_Rule *rule, int count)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(RuleCount %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(Rule (%d)", i);
Packit daac2c
      indent++;
Packit daac2c
      IPRINT ("(GlyphCount %d)", rule[i].GlyphCount);
Packit daac2c
      IPRINT ("(LookupCount %d)", rule[i].LookupCount);
Packit daac2c
      dump_glyph_ids (indent, "Input", rule[i].Input, rule[i].GlyphCount - 1);
Packit daac2c
      dump_lookup_record_list (indent, rule[i].LookupRecord,
Packit daac2c
			       rule[i].LookupCount);
Packit daac2c
      printf (")");
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_rule_set_list (int indent, OTF_RuleSet *set, int count)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(RuleSetCount %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(RuleSet (%d)", i);
Packit daac2c
      dump_rule_list (indent + 1, set[i].Rule, set[i].RuleCount);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_class_rule_list (int indent, OTF_ClassRule *rule, int count)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  IPRINT ("(ClassRuleCnt %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(ClassRule (%d)", i);
Packit daac2c
      indent++;
Packit daac2c
      IPRINT ("(GlyphCount %d)", rule[i].GlyphCount);
Packit daac2c
      IPRINT ("(LookupCount %d)", rule[i].LookupCount);
Packit daac2c
      IPRINT ("(Class");
Packit daac2c
      for (j = 0; j < rule[i].GlyphCount - 1; j++)
Packit daac2c
	printf (" %d", rule[i].Class[j]);
Packit daac2c
      printf (")");
Packit daac2c
      dump_lookup_record_list (indent, rule[i].LookupRecord,
Packit daac2c
			       rule[i].LookupCount);
Packit daac2c
      printf (")");
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_class_set_list (int indent, OTF_ClassSet *set, int count)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(ClassSetCount %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    if (set[i].offset)
Packit daac2c
      {
Packit daac2c
	IPRINT ("(ClassSet (%d)", i);
Packit daac2c
	dump_class_rule_list (indent + 1, set[i].ClassRule,
Packit daac2c
			      set[i].ClassRuleCnt);
Packit daac2c
	printf (")");
Packit daac2c
      }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_chain_rule_list (int indent, OTF_ChainRule *rule, int count)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(ChainRuleCount %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(ChainRule (%d)", i);
Packit daac2c
      dump_glyph_ids (indent + 1, "Backtrack",
Packit daac2c
		      rule[i].Backtrack, rule[i].BacktrackGlyphCount);
Packit daac2c
      dump_glyph_ids (indent + 1, "Input",
Packit daac2c
		      rule[i].Input, rule[i].InputGlyphCount - 1);
Packit daac2c
      dump_glyph_ids (indent + 1, "LookAhead",
Packit daac2c
		      rule[i].LookAhead, rule[i].LookaheadGlyphCount);
Packit daac2c
      dump_lookup_record_list (indent + 1, rule[i].LookupRecord,
Packit daac2c
			       rule[i].LookupCount);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_chain_rule_set_list (int indent, OTF_ChainRuleSet *set, int count)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(ChainRuleSetCount %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(ChainRuleSet (%d)", i);
Packit daac2c
      dump_chain_rule_list (indent + 1,
Packit daac2c
			    set[i].ChainRule, set[i].ChainRuleCount);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_chain_class_rule_list (int indent, OTF_ChainClassRule *rule, int count)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(ChainClassRuleCount %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(ChainClassRule (%d)", i);
Packit daac2c
      dump_glyph_ids (indent + 1, "Backtrack",
Packit daac2c
		      rule[i].Backtrack, rule[i].BacktrackGlyphCount);
Packit daac2c
      dump_glyph_ids (indent + 1, "Input",
Packit daac2c
		      rule[i].Input, rule[i].InputGlyphCount - 1);
Packit daac2c
      dump_glyph_ids (indent + 1, "LookAhead",
Packit daac2c
		      rule[i].LookAhead, rule[i].LookaheadGlyphCount);
Packit daac2c
      dump_lookup_record_list (indent + 1, rule[i].LookupRecord,
Packit daac2c
			       rule[i].LookupCount);
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_chain_class_set_list (int indent, OTF_ChainClassSet *set, int count)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(ChainClassSetCount %d)", count);
Packit daac2c
  for (i = 0; i < count; i++)
Packit daac2c
    if (set[i].offset)
Packit daac2c
      {
Packit daac2c
	IPRINT ("(ChainClassSet (%d)", i);
Packit daac2c
	dump_chain_class_rule_list (indent + 1,
Packit daac2c
				    set[i].ChainClassRule,
Packit daac2c
				    set[i].ChainClassRuleCnt);
Packit daac2c
	printf (")");
Packit daac2c
      }
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
Packit daac2c
Packit daac2c

Packit daac2c
/* GSUB */
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_lookup_subtable_gsub (int indent, int index, unsigned type,
Packit daac2c
			   OTF_LookupSubTableGSUB *subtable)
Packit daac2c
{
Packit daac2c
  IPRINT ("(SubTable (%d) (Format %d)", index, subtable->Format);
Packit daac2c
  indent++;
Packit daac2c
  switch (type)
Packit daac2c
    {
Packit daac2c
    case 1:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  IPRINT ("(DeltaGlyhpID #x%04X)",
Packit daac2c
		  subtable->u.single1.DeltaGlyphID);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 2)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_glyph_ids (indent, "Substitute", subtable->u.single2.Substitute,
Packit daac2c
			  subtable->u.single2.GlyphCount);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 2:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_sequence_list (indent,
Packit daac2c
			      subtable->u.multiple1.Sequence,
Packit daac2c
			      subtable->u.multiple1.SequenceCount);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
      
Packit daac2c
    case 3:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_alternate_set_list (indent, subtable->u.alternate1.AlternateSet,
Packit daac2c
				   subtable->u.alternate1.AlternateSetCount);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 4:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  int *char_list = dump_coverage (indent, NULL, &subtable->Coverage);
Packit daac2c
	  dump_ligature_set_list (indent, char_list,
Packit daac2c
				  subtable->u.ligature1.LigatureSet,
Packit daac2c
				  subtable->u.ligature1.LigSetCount);
Packit daac2c
	  free (char_list);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 5:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_rule_set_list (indent, subtable->u.context1.RuleSet,
Packit daac2c
			      subtable->u.context1.RuleSetCount); 
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 2)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_class_def (indent, NULL, &subtable->u.context2.ClassDef);
Packit daac2c
	  dump_class_set_list (indent, subtable->u.context2.ClassSet,
Packit daac2c
			       subtable->u.context2.ClassSetCnt);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 3)
Packit daac2c
	{
Packit daac2c
	  dump_coverage_list (indent, "Coverage",
Packit daac2c
			      subtable->u.context3.Coverage,
Packit daac2c
			      subtable->u.context3.GlyphCount);
Packit daac2c
	  dump_lookup_record_list (indent,
Packit daac2c
				   subtable->u.context3.LookupRecord,
Packit daac2c
				   subtable->u.context3.LookupCount);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 6:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_chain_rule_set_list
Packit daac2c
	    (indent,
Packit daac2c
	     subtable->u.chain_context1.ChainRuleSet,
Packit daac2c
	     subtable->u.chain_context1.ChainRuleSetCount);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 2)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_class_def (indent, "BacktrackClassDef",
Packit daac2c
			  &subtable->u.chain_context2.BacktrackClassDef);
Packit daac2c
	  dump_class_def (indent, "InputClassDef",
Packit daac2c
			  &subtable->u.chain_context2.InputClassDef);
Packit daac2c
	  dump_class_def (indent, "LookaheadClassDef",
Packit daac2c
			  &subtable->u.chain_context2.LookaheadClassDef);
Packit daac2c
	  dump_chain_class_set_list
Packit daac2c
	    (indent,
Packit daac2c
	     subtable->u.chain_context2.ChainClassSet,
Packit daac2c
	     subtable->u.chain_context2.ChainClassSetCnt);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 3)
Packit daac2c
	{
Packit daac2c
	  dump_coverage_list
Packit daac2c
	    (indent, "BackTrackGlyphCount",
Packit daac2c
	     subtable->u.chain_context3.Backtrack,
Packit daac2c
	     subtable->u.chain_context3.BacktrackGlyphCount);
Packit daac2c
	  dump_coverage_list
Packit daac2c
	    (indent, "InputGlyphCount",
Packit daac2c
	     subtable->u.chain_context3.Input,
Packit daac2c
	     subtable->u.chain_context3.InputGlyphCount);
Packit daac2c
	  dump_coverage_list
Packit daac2c
	    (indent, "LookaheadGlyphCount",
Packit daac2c
	     subtable->u.chain_context3.LookAhead,
Packit daac2c
	     subtable->u.chain_context3.LookaheadGlyphCount);
Packit daac2c
	  dump_lookup_record_list
Packit daac2c
	    (indent,
Packit daac2c
	     subtable->u.chain_context3.LookupRecord,
Packit daac2c
	     subtable->u.chain_context3.LookupCount);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 7:
Packit daac2c
      IPRINT ("(ExtensionLookupType %d)",
Packit daac2c
	      subtable->u.extension1.ExtensionLookupType);
Packit daac2c
      IPRINT ("(ExtensionOffset %d)",
Packit daac2c
	      subtable->u.extension1.ExtensionOffset);
Packit daac2c
      dump_lookup_subtable_gsub (indent, index, 
Packit daac2c
				 subtable->u.extension1.ExtensionLookupType,
Packit daac2c
				 subtable->u.extension1.ExtensionSubtable);
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 8:
Packit daac2c
      printf (" not-yet-supported");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    default:
Packit daac2c
      printf (" invalid");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_gsub_table (int indent, OTF_GSUB *gsub)
Packit daac2c
{
Packit daac2c
  IPRINT ("(GSUB");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(Header");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(Version %d.%d)", gsub->Version.high, gsub->Version.low);
Packit daac2c
  IPRINT ("(ScriptList #x%04X)", gsub->ScriptList.offset);
Packit daac2c
  IPRINT ("(FeatureList #x%04X)", gsub->FeatureList.offset);
Packit daac2c
  IPRINT ("(LookupList #x%04X))", gsub->LookupList.offset);
Packit daac2c
  indent--;
Packit daac2c
  dump_script_list (indent, &gsub->ScriptList);
Packit daac2c
  dump_feature_list (indent, &gsub->FeatureList);
Packit daac2c
  dump_lookup_list (indent, &gsub->LookupList, 1);
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c

Packit daac2c
/* GPOS */
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_lookup_subtable_gpos (int indent, int index, unsigned type,
Packit daac2c
			   OTF_LookupSubTableGPOS *subtable)
Packit daac2c
{
Packit daac2c
  IPRINT ("(SubTable (%d) (Format %d)", index, subtable->Format);
Packit daac2c
  indent++;
Packit daac2c
  switch (type)
Packit daac2c
    {
Packit daac2c
    case 1:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  IPRINT ("(ValueFormat #x%04X)",
Packit daac2c
		  subtable->u.single1.ValueFormat);
Packit daac2c
	  dump_value_record (indent, "Value", &subtable->u.single1.Value);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 2)
Packit daac2c
	{
Packit daac2c
	  int i;
Packit daac2c
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  IPRINT ("(ValueFormat #x%04X)",
Packit daac2c
		  subtable->u.single2.ValueFormat);
Packit daac2c
	  IPRINT ("(ValueCount %d)",
Packit daac2c
		  subtable->u.single2.ValueCount);
Packit daac2c
	  for (i = 0; i < subtable->u.single2.ValueCount; i++)
Packit daac2c
	    dump_value_record (indent, "Value", &subtable->u.single2.Value[i]);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 2:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  IPRINT ("(ValueFormat1 #x%04X)",
Packit daac2c
		  subtable->u.pair1.ValueFormat1);
Packit daac2c
	  IPRINT ("(ValueFormat2 #x%04X)",
Packit daac2c
		  subtable->u.pair1.ValueFormat2);
Packit daac2c
	  dump_pair_set_list (indent, subtable->u.pair1.PairSetCount,
Packit daac2c
			      subtable->u.pair1.PairSet);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 2)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  IPRINT ("(ValueFormat1 #x%04X)",
Packit daac2c
		  subtable->u.pair2.ValueFormat1);
Packit daac2c
	  IPRINT ("(ValueFormat2 #x%04X)",
Packit daac2c
		  subtable->u.pair2.ValueFormat2);
Packit daac2c
	  dump_class_def (indent, "ClassDef1",
Packit daac2c
			  &subtable->u.pair2.ClassDef1);
Packit daac2c
	  dump_class_def (indent, "ClassDef2",
Packit daac2c
			  &subtable->u.pair2.ClassDef2);
Packit daac2c
	  IPRINT ("(Class1Count %d)",
Packit daac2c
		  subtable->u.pair2.Class1Count);
Packit daac2c
	  IPRINT ("(Class2Count %d)",
Packit daac2c
		  subtable->u.pair2.Class2Count);
Packit daac2c
	  dump_class1_record_list (indent,
Packit daac2c
				   subtable->u.pair2.Class1Count,
Packit daac2c
				   subtable->u.pair2.Class2Count,
Packit daac2c
				   subtable->u.pair2.Class1Record);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
      
Packit daac2c
    case 3:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_entry_exit_list (indent, subtable->u.cursive1.EntryExitCount,
Packit daac2c
				subtable->u.cursive1.EntryExitRecord);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 4:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, "Mark", &subtable->Coverage));
Packit daac2c
	  free (dump_coverage (indent, "Base",
Packit daac2c
			       &subtable->u.mark_base1.BaseCoverage));
Packit daac2c
	  IPRINT ("(ClassCount %d)",
Packit daac2c
		  subtable->u.mark_base1.ClassCount);
Packit daac2c
	  dump_mark_array (indent, &subtable->u.mark_base1.MarkArray);
Packit daac2c
	  dump_anchor_array (indent, subtable->u.mark_base1.ClassCount,
Packit daac2c
			   &subtable->u.mark_base1.BaseArray);
Packit daac2c
	}
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 5:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  OTF_GPOS_MarkLig1 *mark_lig1 = &subtable->u.mark_lig1;
Packit daac2c
	  int i, j, k;
Packit daac2c
Packit daac2c
	  free (dump_coverage (indent, "Mark", &subtable->Coverage));
Packit daac2c
	  free (dump_coverage (indent, "Ligature",
Packit daac2c
			       &mark_lig1->LigatureCoverage));
Packit daac2c
	  IPRINT ("(ClassCount %d)", mark_lig1->ClassCount);
Packit daac2c
	  dump_mark_array (indent, &mark_lig1->MarkArray);
Packit daac2c
	  IPRINT ("(LigatureArray (%d)",
Packit daac2c
		  mark_lig1->LigatureArray.LigatureCount);
Packit daac2c
	  indent++;
Packit daac2c
	  for (i = 0; i < mark_lig1->LigatureArray.LigatureCount; i++)
Packit daac2c
	    {
Packit daac2c
	      OTF_LigatureAttach *attach
Packit daac2c
		= mark_lig1->LigatureArray.LigatureAttach + i;
Packit daac2c
Packit daac2c
	      IPRINT ("(LigatureAttach (%d)", attach->ComponentCount);
Packit daac2c
	      indent++;
Packit daac2c
	      for (j = 0; j < attach->ComponentCount; j++)
Packit daac2c
		{
Packit daac2c
		  OTF_ComponentRecord *rec = attach->ComponentRecord + j;
Packit daac2c
Packit daac2c
		  IPRINT ("(LigatureAnchor (%d)", mark_lig1->ClassCount);
Packit daac2c
		  for (k = 0; k < mark_lig1->ClassCount; k++)
Packit daac2c
		    if (rec->LigatureAnchor[k].AnchorFormat)
Packit daac2c
		      dump_anchor (indent + 1, rec->LigatureAnchor + k);
Packit daac2c
		  printf (")");
Packit daac2c
		}
Packit daac2c
	      printf (")");
Packit daac2c
	      indent--;
Packit daac2c
	    }
Packit daac2c
	  printf (")");
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 6:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, "Mark1", &subtable->Coverage));
Packit daac2c
	  free (dump_coverage (indent, "Mark2",
Packit daac2c
			       &subtable->u.mark_mark1.Mark2Coverage));
Packit daac2c
	  IPRINT ("(ClassCount %d)",
Packit daac2c
		  subtable->u.mark_mark1.ClassCount);
Packit daac2c
	  dump_mark_array (indent, &subtable->u.mark_mark1.Mark1Array);
Packit daac2c
	  dump_anchor_array (indent, subtable->u.mark_mark1.ClassCount,
Packit daac2c
			   &subtable->u.mark_mark1.Mark2Array);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 7:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_rule_set_list (indent, subtable->u.context1.RuleSet,
Packit daac2c
			      subtable->u.context1.RuleSetCount); 
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 2)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_class_def (indent, NULL, &subtable->u.context2.ClassDef);
Packit daac2c
	  dump_class_set_list (indent, subtable->u.context2.ClassSet,
Packit daac2c
			       subtable->u.context2.ClassSetCnt);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 3)
Packit daac2c
	{
Packit daac2c
	  dump_coverage_list (indent, "Coverage",
Packit daac2c
			      subtable->u.context3.Coverage,
Packit daac2c
			      subtable->u.context3.GlyphCount);
Packit daac2c
	  dump_lookup_record_list (indent,
Packit daac2c
				   subtable->u.context3.LookupRecord,
Packit daac2c
				   subtable->u.context3.LookupCount);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 8:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_chain_rule_set_list
Packit daac2c
	    (indent,
Packit daac2c
	     subtable->u.chain_context1.ChainRuleSet,
Packit daac2c
	     subtable->u.chain_context1.ChainRuleSetCount);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 2)
Packit daac2c
	{
Packit daac2c
	  free (dump_coverage (indent, NULL, &subtable->Coverage));
Packit daac2c
	  dump_class_def (indent, "BacktrackClassDef",
Packit daac2c
			  &subtable->u.chain_context2.BacktrackClassDef);
Packit daac2c
	  dump_class_def (indent, "InputClassDef",
Packit daac2c
			  &subtable->u.chain_context2.InputClassDef);
Packit daac2c
	  dump_class_def (indent, "LookaheadClassDef",
Packit daac2c
			  &subtable->u.chain_context2.LookaheadClassDef);
Packit daac2c
	  dump_chain_class_set_list
Packit daac2c
	    (indent,
Packit daac2c
	     subtable->u.chain_context2.ChainClassSet,
Packit daac2c
	     subtable->u.chain_context2.ChainClassSetCnt);
Packit daac2c
	}
Packit daac2c
      else if (subtable->Format == 3)
Packit daac2c
	{
Packit daac2c
	  dump_coverage_list
Packit daac2c
	    (indent, "BackTrackGlyphCount",
Packit daac2c
	     subtable->u.chain_context3.Backtrack,
Packit daac2c
	     subtable->u.chain_context3.BacktrackGlyphCount);
Packit daac2c
	  dump_coverage_list
Packit daac2c
	    (indent, "InputGlyphCount",
Packit daac2c
	     subtable->u.chain_context3.Input,
Packit daac2c
	     subtable->u.chain_context3.InputGlyphCount);
Packit daac2c
	  dump_coverage_list
Packit daac2c
	    (indent, "LookaheaGlyphCount",
Packit daac2c
	     subtable->u.chain_context3.LookAhead,
Packit daac2c
	     subtable->u.chain_context3.LookaheadGlyphCount);
Packit daac2c
	  dump_lookup_record_list
Packit daac2c
	    (indent,
Packit daac2c
	     subtable->u.chain_context3.LookupRecord,
Packit daac2c
	     subtable->u.chain_context3.LookupCount);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
      break;
Packit daac2c
Packit daac2c
    case 9:
Packit daac2c
      if (subtable->Format == 1)
Packit daac2c
	{
Packit daac2c
	  IPRINT ("(ExtensionLookupType %d)",
Packit daac2c
		  subtable->u.extension1.ExtensionLookupType);
Packit daac2c
	  IPRINT ("(ExtensionOffset %d)",
Packit daac2c
		  subtable->u.extension1.ExtensionOffset);
Packit daac2c
	  dump_lookup_subtable_gpos
Packit daac2c
	    (indent, index, 
Packit daac2c
	     subtable->u.extension1.ExtensionLookupType,
Packit daac2c
	     subtable->u.extension1.ExtensionSubtable);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	printf (" invalid");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_gpos_table (int indent, OTF_GPOS *gpos)
Packit daac2c
{
Packit daac2c
  if (! gpos)
Packit daac2c
    return;
Packit daac2c
  IPRINT ("(GPOS");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(Header");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(Version %d.%d)", gpos->Version.high, gpos->Version.low);
Packit daac2c
  IPRINT ("(ScriptList #x%04X)", gpos->ScriptList.offset);
Packit daac2c
  IPRINT ("(FeatureList #x%04X)", gpos->FeatureList.offset);
Packit daac2c
  IPRINT ("(LookupList #x%04X))", gpos->LookupList.offset);
Packit daac2c
  indent--;
Packit daac2c
  dump_script_list (indent, &gpos->ScriptList);
Packit daac2c
  dump_feature_list (indent, &gpos->FeatureList);
Packit daac2c
  dump_lookup_list (indent, &gpos->LookupList, 0);
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
#if 0
Packit daac2c
static void
Packit daac2c
dump_base_table (OTF_BASE *base)
Packit daac2c
{
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_jstf_table (OTF_JSTF *jstf)
Packit daac2c
{
Packit daac2c
}
Packit daac2c
#endif
Packit daac2c
Packit daac2c

Packit daac2c
/* GDEF */
Packit daac2c
static void
Packit daac2c
dump_gdef_header (int indent, OTF_GDEFHeader *header)
Packit daac2c
{
Packit daac2c
  IPRINT ("(Header");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(Version %d.%d)",
Packit daac2c
	  header->Version.high, header->Version.low);
Packit daac2c
  IPRINT ("(GlyphClassDef #x%04X)", header->GlyphClassDef);
Packit daac2c
  IPRINT ("(AttachList #x%04X)", header->AttachList);
Packit daac2c
  IPRINT ("(LigCaretList #x%04X)", header->LigCaretList);
Packit daac2c
  IPRINT ("(MarkAttachClassDef #x%04X))",
Packit daac2c
	  header->MarkAttachClassDef);
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_attach_list (int indent, OTF_AttachList *list)
Packit daac2c
{
Packit daac2c
}
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_lig_caret_list (int indent, OTF_LigCaretList *list)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  IPRINT ("(LigCaretList");
Packit daac2c
  indent++;
Packit daac2c
  free (dump_coverage (indent, NULL, &list->Coverage));
Packit daac2c
  IPRINT ("(LigGlyphCount %d)", list->LigGlyphCount);
Packit daac2c
  for (i = 0; i < list->LigGlyphCount; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(LigGlyph (%d) (offset #x%04X)",
Packit daac2c
	      i, list->LigGlyph[i].offset);
Packit daac2c
      indent++;
Packit daac2c
      IPRINT ("(CaretCount %d)", list->LigGlyph[i].CaretCount);
Packit daac2c
      for (j = 0; j < list->LigGlyph[i].CaretCount; j++)
Packit daac2c
	{
Packit daac2c
	  unsigned format = list->LigGlyph[i].CaretValue[j].CaretValueFormat;
Packit daac2c
Packit daac2c
	  IPRINT ("(Caret (%d) (CaretValueFormat %d)", j, format);
Packit daac2c
	  if (format == 1)
Packit daac2c
	    {
Packit daac2c
	      printf ("(Coordinate %d)",
Packit daac2c
		      list->LigGlyph[i].CaretValue[j].f.f1.Coordinate);
Packit daac2c
	    }
Packit daac2c
	  else if (format == 2)
Packit daac2c
	    {
Packit daac2c
	      printf ("(CaretValuePoint %d)",
Packit daac2c
		      list->LigGlyph[i].CaretValue[j].f.f2.CaretValuePoint);
Packit daac2c
	    }
Packit daac2c
	  else if (format == 3)
Packit daac2c
	    {
Packit daac2c
	      printf ("(Coodinate %d)",
Packit daac2c
		      list->LigGlyph[i].CaretValue[j].f.f3.Coordinate);
Packit daac2c
	      indent++;
Packit daac2c
	      dump_device_table
Packit daac2c
		(indent, "DeviceTable", 
Packit daac2c
		 &list->LigGlyph[i].CaretValue[j].f.f3.DeviceTable);
Packit daac2c
	      indent--;
Packit daac2c
	    }
Packit daac2c
	  printf (")");
Packit daac2c
	}
Packit daac2c
      printf (")");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
static void
Packit daac2c
dump_gdef_table (int indent, OTF_GDEF *gdef)
Packit daac2c
{
Packit daac2c
  if (! gdef)
Packit daac2c
    return;
Packit daac2c
  IPRINT ("(GDEF");
Packit daac2c
  indent++;
Packit daac2c
  dump_gdef_header (indent, &gdef->header);
Packit daac2c
  if (gdef->header.GlyphClassDef)
Packit daac2c
    dump_class_def (indent, "GlyphClassDef", &gdef->glyph_class_def);
Packit daac2c
  if (gdef->header.AttachList)
Packit daac2c
    dump_attach_list (indent, &gdef->attach_list);
Packit daac2c
  if (gdef->header.LigCaretList)
Packit daac2c
    dump_lig_caret_list (indent, &gdef->lig_caret_list);
Packit daac2c
  if (gdef->header.MarkAttachClassDef)
Packit daac2c
    dump_class_def (indent, "MarkAttachClassDef",
Packit daac2c
		    &gdef->mark_attach_class_def);
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c

Packit daac2c
/* cmap */
Packit daac2c
static void
Packit daac2c
dump_cmap_table (int indent, OTF_cmap *cmap)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(cmap");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(version %d)", cmap->version);
Packit daac2c
  IPRINT ("(numTables %d)", cmap->numTables);
Packit daac2c
  for (i = 0; i < cmap->numTables; i++)
Packit daac2c
    {
Packit daac2c
      IPRINT ("(EncodingRecord (%d) (platformID %d) (encodingID %d)",
Packit daac2c
	      i,
Packit daac2c
	      cmap->EncodingRecord[i].platformID,
Packit daac2c
	      cmap->EncodingRecord[i].encodingID);
Packit daac2c
      indent++;
Packit daac2c
      IPRINT ("(Subtable (offset #x%04X) (format %d) (length #x%04X) (language %d)",
Packit daac2c
	      cmap->EncodingRecord[i].offset,
Packit daac2c
	      cmap->EncodingRecord[i].subtable.format,
Packit daac2c
	      cmap->EncodingRecord[i].subtable.length,
Packit daac2c
	      cmap->EncodingRecord[i].subtable.language);
Packit daac2c
      indent++;
Packit daac2c
      switch (cmap->EncodingRecord[i].subtable.format)
Packit daac2c
	{
Packit daac2c
	case 0:
Packit daac2c
	  {
Packit daac2c
	    int j, k;
Packit daac2c
	    unsigned char *array
Packit daac2c
	      = cmap->EncodingRecord[i].subtable.f.f0->glyphIdArray;
Packit daac2c
Packit daac2c
	    IPRINT ("(glyphIdArray");
Packit daac2c
	    for (j = 0; j < 16; j++)
Packit daac2c
	      {
Packit daac2c
		IPRINT (" ");
Packit daac2c
		for (k = 0; k < 16; k++)
Packit daac2c
		  printf (" %3d", array[j * 16 + k]);
Packit daac2c
	      }
Packit daac2c
	    printf (")");
Packit daac2c
	  }
Packit daac2c
	  break;
Packit daac2c
Packit daac2c
	case 4:
Packit daac2c
	  {
Packit daac2c
	    OTF_EncodingSubtable4 *sub4
Packit daac2c
	      = cmap->EncodingRecord[i].subtable.f.f4;
Packit daac2c
	    int j;
Packit daac2c
Packit daac2c
	    IPRINT ("(segCountX2 %d) (searchRange %d)",
Packit daac2c
		    sub4->segCountX2, sub4->searchRange);
Packit daac2c
	    IPRINT ("(entrySelector %d) (rangeShift %d)",
Packit daac2c
		    sub4->entrySelector, sub4->rangeShift);
Packit daac2c
	    for (j = 0; j < sub4->segCountX2 / 2; j++)
Packit daac2c
	      {
Packit daac2c
		IPRINT ("(Segment (%d)", j);
Packit daac2c
		indent++;
Packit daac2c
		IPRINT ("(startCount #x%04X) (endCount #x%04X)",
Packit daac2c
			sub4->segments[j].startCount,
Packit daac2c
			sub4->segments[j].endCount);
Packit daac2c
		IPRINT ("(idDelta %d) (idRangeOffset #x%04X))",
Packit daac2c
			sub4->segments[j].idDelta,
Packit daac2c
			sub4->segments[j].idRangeOffset);
Packit daac2c
		indent--;
Packit daac2c
	      }
Packit daac2c
	    IPRINT ("(glyphIdArray");
Packit daac2c
	    for (j = 0; j < sub4->GlyphCount; j++)
Packit daac2c
	      {
Packit daac2c
		if ((j % 16) == 0)
Packit daac2c
		  IPRINT (" ");
Packit daac2c
		printf (" %3d", sub4->glyphIdArray[j]);
Packit daac2c
	      }
Packit daac2c
	    printf (")");
Packit daac2c
	  }
Packit daac2c
	  break;
Packit daac2c
Packit daac2c
	case 6:
Packit daac2c
	  {
Packit daac2c
	    OTF_EncodingSubtable6 *sub6
Packit daac2c
	      = cmap->EncodingRecord[i].subtable.f.f6;
Packit daac2c
	    int j;
Packit daac2c
Packit daac2c
	    IPRINT ("(firstCode %d) (entryCount %d)",
Packit daac2c
		    sub6->firstCode, sub6->entryCount);
Packit daac2c
	    IPRINT ("(glyphIdArray");
Packit daac2c
	    for (j = 0; j < sub6->entryCount; j++)
Packit daac2c
	      {
Packit daac2c
		if ((j % 16) == 0)
Packit daac2c
		  IPRINT (" ");
Packit daac2c
		printf (" %3d", sub6->glyphIdArray[j]);
Packit daac2c
	      }
Packit daac2c
	    printf (")");
Packit daac2c
	  }
Packit daac2c
	  break;
Packit daac2c
Packit daac2c
	case 12:
Packit daac2c
	  {
Packit daac2c
	    OTF_EncodingSubtable12 *sub12
Packit daac2c
	      = cmap->EncodingRecord[i].subtable.f.f12;
Packit daac2c
	    int j;
Packit daac2c
Packit daac2c
	    for (j = 0; j < sub12->nGroups; j++)
Packit daac2c
	      {
Packit daac2c
		IPRINT ("(Group (#x%X) (startChar #x%04X) (endChar #x%04X) (startGlyphID #x%X))",
Packit daac2c
			j,
Packit daac2c
			sub12->Groups[j].startCharCode,
Packit daac2c
			sub12->Groups[j].endCharCode,
Packit daac2c
			sub12->Groups[j].startGlyphID);
Packit daac2c
	      }
Packit daac2c
	  }
Packit daac2c
	  break;
Packit daac2c
Packit daac2c
	case 14:
Packit daac2c
	  {
Packit daac2c
	    OTF_EncodingSubtable14 *sub14
Packit daac2c
	      = cmap->EncodingRecord[i].subtable.f.f14;
Packit daac2c
	    unsigned j,k;
Packit daac2c
Packit daac2c
	    IPRINT ("(VariationSelectorRecords %d)",sub14->nRecords);
Packit daac2c
	    for (j = 0; j < sub14->nRecords; j++)
Packit daac2c
	      {
Packit daac2c
		OTF_VariationSelectorRecord *record = sub14->Records + j;
Packit daac2c
		IPRINT ("(VariationSelectorRecord (varSelector #x%x)",
Packit daac2c
			record->varSelector);
Packit daac2c
		indent += 1;
Packit daac2c
		IPRINT ("(defaultUVSOffset #x%x)",
Packit daac2c
			record->defaultUVSOffset);
Packit daac2c
		if (record->defaultUVSOffset) 
Packit daac2c
		  {
Packit daac2c
		    IPRINT ("(defaultUVS");
Packit daac2c
		    indent += 1;
Packit daac2c
		    for (k = 0 ; k < record->numUnicodeValueRanges; k++)
Packit daac2c
		      {
Packit daac2c
			OTF_UnicodeValueRange *unicodeValueRange
Packit daac2c
			  = &record->unicodeValueRanges[k];
Packit daac2c
			IPRINT("(startUnicodeValue #x%x) (additionalCount %d)",
Packit daac2c
			       unicodeValueRange->startUnicodeValue,
Packit daac2c
			       unicodeValueRange->additionalCount);
Packit daac2c
		      }
Packit daac2c
		    printf (")");
Packit daac2c
		    indent -= 1;
Packit daac2c
		  }
Packit daac2c
		IPRINT ("(nonDefaultUVSOffset #x%x)",
Packit daac2c
			record->nonDefaultUVSOffset);
Packit daac2c
		if (record->nonDefaultUVSOffset) 
Packit daac2c
		  {
Packit daac2c
		    IPRINT ("(NonDefaultUVS");
Packit daac2c
		    indent += 1;
Packit daac2c
		    for (k=0; k < record->numUVSMappings; k++)
Packit daac2c
		      {
Packit daac2c
			OTF_UVSMapping *uvsMapping
Packit daac2c
			  = &record->uvsMappings[k];
Packit daac2c
			IPRINT("(unicodeValue #x%x) (glyphID %d)",
Packit daac2c
			       uvsMapping->unicodeValue,
Packit daac2c
			       uvsMapping->glyphID);
Packit daac2c
		      }
Packit daac2c
		    printf (")");
Packit daac2c
		    indent -= 1;
Packit daac2c
		  }
Packit daac2c
		printf (")");
Packit daac2c
		indent -= 1;
Packit daac2c
	      }
Packit daac2c
	  }
Packit daac2c
	}
Packit daac2c
Packit daac2c
      indent -= 2;
Packit daac2c
      printf ("))");
Packit daac2c
    }
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c

Packit daac2c
Packit daac2c
/* name */
Packit daac2c
static void
Packit daac2c
dump_name_table (int indent, OTF_name *name)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  IPRINT ("(name");
Packit daac2c
  indent++;
Packit daac2c
  IPRINT ("(format %d)", name->format);
Packit daac2c
  IPRINT ("(count %d)", name->count);
Packit daac2c
  IPRINT ("(stringOffset %d)", name->stringOffset);
Packit daac2c
  for (i = 0; i < name->count; i++)
Packit daac2c
    {
Packit daac2c
      OTF_NameRecord *rec = name->nameRecord + i; 
Packit daac2c
Packit daac2c
      IPRINT ("(nameRecord (%d)", i);
Packit daac2c
      indent++;
Packit daac2c
      IPRINT ("(platformID %d) (encodingID %d) (languageID %d) (nameID %d)",
Packit daac2c
	      rec->platformID, rec->encodingID, rec->languageID, rec->nameID);
Packit daac2c
      IPRINT ("(length %d) (offset #x%04X))", rec->length, rec->offset);
Packit daac2c
      indent--;
Packit daac2c
    }
Packit daac2c
  for (i = 0; i <= OTF_max_nameID; i++)
Packit daac2c
    if (name->name[i])
Packit daac2c
      IPRINT ("(nameID %d \"%s\")", i, name->name[i]);
Packit daac2c
Packit daac2c
  printf (")");
Packit daac2c
}
Packit daac2c
Packit daac2c

Packit daac2c
Packit daac2c
static void
Packit daac2c
otf_dump (OTF *otf)
Packit daac2c
{
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  printf ("(OTF");
Packit daac2c
Packit daac2c
  dump_offset_table (1, &otf->offset_table);
Packit daac2c
  for (i = 0; i < otf->offset_table.numTables; i++)
Packit daac2c
    dump_table_directory (1, otf->table_dirs + i, i);
Packit daac2c
Packit daac2c
  if (otf->head)
Packit daac2c
    dump_head_table (1, otf->head);
Packit daac2c
  if (otf->name)
Packit daac2c
    dump_name_table (1, otf->name);
Packit daac2c
  if (otf->cmap)
Packit daac2c
    dump_cmap_table (1, otf->cmap);
Packit daac2c
  if (otf->gdef)
Packit daac2c
    dump_gdef_table (1, otf->gdef);
Packit daac2c
  if (otf->gsub)
Packit daac2c
    dump_gsub_table (1, otf->gsub);
Packit daac2c
  if (otf->gpos)
Packit daac2c
    dump_gpos_table (1, otf->gpos);
Packit daac2c
#if 0
Packit daac2c
  if (otf->base)
Packit daac2c
    dump_base_table (1, otf->base);
Packit daac2c
  if (otf->jstf)
Packit daac2c
    dump_jstf_table (1, otf->jstf);
Packit daac2c
#endif
Packit daac2c
  printf (")\n");
Packit daac2c
}
Packit daac2c
Packit daac2c
Packit daac2c
int
Packit daac2c
main (int argc, char **argv)
Packit daac2c
{
Packit daac2c
  OTF *otf;
Packit daac2c
Packit daac2c
  if (argc != 2 || !strcmp (argv[1], "-h") || !strcmp (argv[1], "--help"))
Packit daac2c
    {
Packit daac2c
      fprintf (stderr, "Usage: %s OTF-FILE\n", basename (argv[0]));
Packit daac2c
      exit (argc != 2);
Packit daac2c
    }
Packit daac2c
  
Packit daac2c
  otf = OTF_open (argv[1]);
Packit daac2c
  if (! otf)
Packit daac2c
    {
Packit daac2c
      OTF_perror ("otfdump");
Packit daac2c
      exit (1);
Packit daac2c
    }
Packit daac2c
  OTF_get_table (otf, "head");
Packit daac2c
  OTF_get_table (otf, "name");
Packit daac2c
  OTF_get_table (otf, "cmap");
Packit daac2c
  OTF_get_table (otf, "GDEF");
Packit daac2c
  OTF_get_table (otf, "GSUB");
Packit daac2c
  OTF_get_table (otf, "GPOS");
Packit daac2c
#if 0
Packit daac2c
  OTF_get_table (otf, "BASE");
Packit daac2c
  OTF_get_table (otf, "JSTF");
Packit daac2c
#endif
Packit daac2c
  otf_dump (otf);
Packit daac2c
  OTF_close (otf);
Packit daac2c
  exit (0);
Packit daac2c
}