|
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 |
}
|