summaryrefslogtreecommitdiff
path: root/Build/source/texk/ttfdump/libttf/gsub.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/ttfdump/libttf/gsub.c')
-rw-r--r--Build/source/texk/ttfdump/libttf/gsub.c556
1 files changed, 0 insertions, 556 deletions
diff --git a/Build/source/texk/ttfdump/libttf/gsub.c b/Build/source/texk/ttfdump/libttf/gsub.c
deleted file mode 100644
index b0ca3ee5b54..00000000000
--- a/Build/source/texk/ttfdump/libttf/gsub.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/* gsub.c -- Glyph Substitution Table
- */
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "ttf.h"
-#include "ttfutil.h"
-
-static Sub11Ptr makeGSUB11 (FILE *fp, ULONG offset)
-{
- USHORT cOffset;
- Sub11Ptr sub = XCALLOC1 (Sub11);
-
- cOffset = ttfGetUSHORT (fp);
- sub->deltaGlyphID = ttfGetUSHORT (fp);
- sub->coverage = otfMakeCoverage (fp, offset + cOffset);
-
- return sub;
-}
-
-static void printGSUB11 (FILE *fp, Sub11Ptr sub)
-{
- fprintf (fp, " - Single Substitution Delta\n\t ");
- otfPrintCoverage (fp, sub->coverage);
- fprintf (fp, "\t deltaGlyphID: %d\n", sub->deltaGlyphID);
-}
-
-static void freeGSUB11 (Sub11Ptr sub)
-{
- otfFreeCoverage (sub->coverage);
-}
-
-static Sub12Ptr makeGSUB12 (FILE *fp, ULONG offset)
-{
- USHORT cOffset;
- Sub12Ptr sub = XCALLOC1 (Sub12);
-
- cOffset = ttfGetUSHORT (fp);
- sub->glyphCount = ttfGetUSHORT (fp);
- sub->substitute = ttfMakeUSHORT (sub->glyphCount, fp);
- sub->coverage = otfMakeCoverage (fp, offset + cOffset);
-
- return sub;
-}
-
-static void printGSUB12 (FILE *fp, Sub12Ptr sub)
-{
- int i;
-
- fprintf (fp, " - Single Substitution List\n\t ");
- otfPrintCoverage (fp, sub->coverage);
- fprintf (fp, "\t glyphCount: %d\n\t\t substitute: %d",
- sub->glyphCount, sub->substitute[0]);
- for (i = 1; i < sub->glyphCount; i++)
- fprintf (fp, i % 8 ? ", %d" : ",\n\t\t\t %d", sub->substitute[i]);
- fprintf (fp, "\n");
-}
-
-static void freeGSUB12 (Sub12Ptr sub)
-{
- otfFreeCoverage (sub->coverage);
- free (sub->substitute);
-}
-
-static void gsubLoadSequence (SequencePtr sequence, FILE *fp, ULONG offset)
-{
- xfseek (fp, offset, SEEK_SET, "gsubLoadSequence");
-
- sequence->glyphCount = ttfGetUSHORT (fp);
- sequence->substitute = ttfMakeUSHORT (sequence->glyphCount, fp);
-}
-
-static Sub21Ptr makeGSUB21 (FILE *fp, ULONG offset)
-{
- int i;
- USHORT cOffset;
- USHORT *sOffset;
- Sub21Ptr sub = XCALLOC1 (Sub21);
-
- cOffset = ttfGetUSHORT (fp);
- sub->sequenceCount = ttfGetUSHORT (fp);
- sOffset = ttfMakeUSHORT (sub->sequenceCount, fp);
- sub->coverage = otfMakeCoverage (fp, offset + cOffset);
- sub->sequence = XCALLOC (sub->sequenceCount, Sequence);
- for (i = 0; i < sub->sequenceCount; i++)
- gsubLoadSequence (&sub->sequence[i], fp, offset + sOffset[i]);
- free (sOffset);
-
- return sub;
-}
-
-static void printGSUB21 (FILE *fp, Sub21Ptr sub)
-{
- int i;
-
- fprintf (fp, " - Multiple Substitution\n\t ");
- otfPrintCoverage (fp, sub->coverage);
- fprintf (fp, "\t sequenceCount: %d\n", sub->sequenceCount);
- for (i = 0; i < sub->sequenceCount; i++) {
- int j;
-
- fprintf (fp, "\t %2d. glyphCount: %d - ", i, sub->sequence[i].glyphCount);
- for (j = 0; j < sub->sequence[i].glyphCount; j++)
- fprintf (fp, j == 0 ? "- %d" : ", %d", sub->sequence[i].substitute[j]);
- fprintf (fp, "\n");
- }
-}
-
-static void freeGSUB21 (Sub21Ptr sub)
-{
- int i;
-
- otfFreeCoverage (sub->coverage);
- for (i = 0; i < sub->sequenceCount; i++)
- free (sub->sequence[i].substitute);
- free (sub->sequence);
-}
-
-static void gsubLoadAlternateSet (AlternateSetPtr alternateSet, FILE *fp, ULONG offset)
-{
- xfseek (fp, offset, SEEK_SET, "gsubLoadAlternateSet");
-
- alternateSet->glyphCount = ttfGetUSHORT (fp);
- alternateSet->alternate = ttfMakeUSHORT (alternateSet->glyphCount, fp);
-}
-
-static Sub31Ptr makeGSUB31 (FILE *fp, ULONG offset)
-{
- int i;
- USHORT cOffset;
- USHORT *aOffset;
- Sub31Ptr sub = XCALLOC1 (Sub31);
-
- cOffset = ttfGetUSHORT (fp);
- sub->alternateSetCount = ttfGetUSHORT (fp);
- aOffset = ttfMakeUSHORT (sub->alternateSetCount, fp);
- sub->coverage = otfMakeCoverage (fp, offset + cOffset);
- sub->alternateSet = XCALLOC (sub->alternateSetCount, AlternateSet);
- for (i = 0; i < sub->alternateSetCount; i++)
- gsubLoadAlternateSet (&sub->alternateSet[i], fp, offset + aOffset[i]);
- free (aOffset);
-
- return sub;
-}
-
-static void printGSUB31 (FILE *fp, Sub31Ptr sub)
-{
- int i;
-
- fprintf (fp, " - Alternate Substitution\n\t ");
- otfPrintCoverage (fp, sub->coverage);
- fprintf (fp, "\t alternateSetCount: %d\n", sub->alternateSetCount);
- for (i = 0; i < sub->alternateSetCount; i++) {
- int j;
-
- fprintf (fp, "\t %2d. glyphCount: %d ", i, sub->alternateSet[i].glyphCount);
- for (j = 0; j < sub->alternateSet[i].glyphCount; j++)
- fprintf (fp, j == 0 ? "- %d" : ", %d", sub->alternateSet[i].alternate[j]);
- fprintf (fp, "\n");
- }
-}
-
-static void freeGSUB31 (Sub31Ptr sub)
-{
- int i;
-
- otfFreeCoverage (sub->coverage);
- for (i = 0; i < sub->alternateSetCount; i++)
- free (sub->alternateSet[i].alternate);
- free (sub->alternateSet);
-}
-
-static void gsubLoadLigature (LigaturePtr ligature, FILE *fp, ULONG offset)
-{
- xfseek (fp, offset, SEEK_SET, "gsubLoadLigature");
-
- ligature->ligGlyph = ttfGetUSHORT (fp);
- ligature->compCount = ttfGetUSHORT (fp);
- ligature->component = ttfMakeUSHORT (ligature->compCount - 1, fp);
-}
-
-static void gsubLoadLigatureSet (LigatureSetPtr ligatureSet, FILE *fp, ULONG offset)
-{
- int i;
- USHORT *lOffset;
-
- xfseek (fp, offset, SEEK_SET, "gsubLoadLigatureSet");
-
- ligatureSet->ligatureCount = ttfGetUSHORT (fp);
- lOffset = ttfMakeUSHORT (ligatureSet->ligatureCount, fp);
- ligatureSet->ligature = XCALLOC (ligatureSet->ligatureCount, Ligature);
- for (i = 0; i < ligatureSet->ligatureCount; i++)
- gsubLoadLigature (&ligatureSet->ligature[i], fp, offset + lOffset[i]);
- free (lOffset);
-}
-
-static Sub41Ptr makeGSUB41 (FILE *fp, ULONG offset)
-{
- int i;
- USHORT cOffset;
- USHORT *lOffset;
- Sub41Ptr sub = XCALLOC1 (Sub41);
-
- cOffset = ttfGetUSHORT (fp);
- sub->ligSetCount = ttfGetUSHORT (fp);
- lOffset = ttfMakeUSHORT (sub->ligSetCount, fp);
- sub->coverage = otfMakeCoverage (fp, offset + cOffset);
- sub->ligatureSet = XCALLOC (sub->ligSetCount, LigatureSet);
- for (i = 0; i < sub->ligSetCount; i++)
- gsubLoadLigatureSet (&sub->ligatureSet[i], fp, offset + lOffset[i]);
- free (lOffset);
-
- return sub;
-}
-
-static void printGSUB41 (FILE *fp, Sub41Ptr sub)
-{
- int i;
-
- fprintf (fp, " - Ligature Substitution\n\t ");
- otfPrintCoverage (fp, sub->coverage);
- fprintf (fp, "\t ligSetCount: %d\n", sub->ligSetCount);
- for (i = 0; i < sub->ligSetCount; i++) {
- int j;
-
- fprintf (fp, "\t %2d. ligatureCount: %d\n", i, sub->ligatureSet[i].ligatureCount);
- for (j = 0; j < sub->ligatureSet[i].ligatureCount; j++) {
- int k;
-
- fprintf (fp, "\t %2d. ligGlyph: %d, compCount: %d ", j,
- sub->ligatureSet[i].ligature[j].ligGlyph,
- sub->ligatureSet[i].ligature[j].compCount);
- for (k = 0; k < sub->ligatureSet[i].ligature[j].compCount - 1; k++)
- fprintf (fp, k == 0 ? "- %d" : ", %d", sub->ligatureSet[i].ligature[j].component[k]);
- fprintf (fp, "\n");
- }
- }
-}
-
-static void freeGSUB41 (Sub41Ptr sub)
-{
- int i;
-
- otfFreeCoverage (sub->coverage);
- for (i = 0; i < sub->ligSetCount; i++) {
- int j;
-
- for (j = 0; j < sub->ligatureSet[i].ligatureCount; j++)
- free (sub->ligatureSet[i].ligature[j].component);
- free (sub->ligatureSet[i].ligature);
- }
- free (sub->ligatureSet);
-}
-
-#define makeGSUB51 makeOTFCtx1
-#define printGSUB51 printOTFCtx1
-#define freeGSUB51 freeOTFCtx1
-
-#define makeGSUB52 makeOTFCtx2
-#define printGSUB52 printOTFCtx2
-#define freeGSUB52 freeOTFCtx2
-
-#define makeGSUB53 makeOTFCtx3
-#define printGSUB53 printOTFCtx3
-#define freeGSUB53 freeOTFCtx3
-
-#define makeGSUB61 makeOTFChn1
-#define printGSUB61 printOTFChn1
-#define freeGSUB61 freeOTFChn1
-
-#define makeGSUB62 makeOTFChn2
-#define printGSUB62 printOTFChn2
-#define freeGSUB62 freeOTFChn2
-
-#define makeGSUB63 makeOTFChn3
-#define printGSUB63 printOTFChn3
-#define freeGSUB63 freeOTFChn3
-
-static Sub81Ptr makeGSUB81 (FILE *fp, ULONG offset)
-{
- int i;
- USHORT cOffset;
- USHORT *bOffset, *lOffset;
- Sub81Ptr sub = XCALLOC1 (Sub81);
-
- cOffset = ttfGetUSHORT (fp);
- sub->backtrackGlyphCount = ttfGetUSHORT (fp);
- bOffset = ttfMakeUSHORT (sub->backtrackGlyphCount, fp);
- sub->lookaheadGlyphCount = ttfGetUSHORT (fp);
- lOffset = ttfMakeUSHORT (sub->lookaheadGlyphCount, fp);
- sub->glyphCount = ttfGetUSHORT (fp);
- sub->substitute = ttfMakeUSHORT (sub->glyphCount, fp);
- sub->coverage = otfMakeCoverage (fp, offset + cOffset);
- sub->backtrack = XCALLOC (sub->backtrackGlyphCount, CoveragePtr);
- for (i = 0; i < sub->backtrackGlyphCount; i++)
- sub->backtrack[i] = otfMakeCoverage (fp, offset + bOffset[i]);
- free (bOffset);
- sub->lookahead = XCALLOC (sub->lookaheadGlyphCount, CoveragePtr);
- for (i = 0; i < sub->lookaheadGlyphCount; i++)
- sub->lookahead[i] = otfMakeCoverage (fp, offset + lOffset[i]);
- free (lOffset);
-
- return sub;
-}
-
-static void printGSUB81 (FILE *fp, Sub81Ptr sub)
-{
- int i;
-
- fprintf (fp, " - Reverse Chaining Context Single Substitution\n\t ");
- otfPrintCoverage (fp, sub->coverage);
- fprintf (fp, "\t backtrackGlyphCount: %d\n", sub->backtrackGlyphCount);
- for (i = 0; i < sub->backtrackGlyphCount; i++) {
- fprintf (fp, "\t %2d. backtrack", i);
- otfPrintCoverage (fp, sub->backtrack[i]);
- }
- fprintf (fp, "\t lookaheadGlyphCount: %d\n", sub->lookaheadGlyphCount);
- for (i = 0; i < sub->lookaheadGlyphCount; i++) {
- fprintf (fp, "\t %2d. lookahead", i);
- otfPrintCoverage (fp, sub->lookahead[i]);
- }
- fprintf (fp, "\t glyphCount: %d\n\t substitute - %d",
- sub->glyphCount, sub->substitute[0]);
- for (i = 1; i < sub->glyphCount; i++)
- fprintf (fp, i % 8 ? ",\n\t\t %d" : ", %d", sub->substitute[i]);
-}
-
-static void freeGSUB81 (Sub81Ptr sub)
-{
- int i;
-
- otfFreeCoverage (sub->coverage);
- for (i = 0; i < sub->backtrackGlyphCount; i++)
- otfFreeCoverage (sub->backtrack[i]);
- free (sub->backtrack);
- for (i = 0; i < sub->lookaheadGlyphCount; i++)
- otfFreeCoverage (sub->lookahead[i]);
- free (sub->lookahead);
- free (sub->substitute);
-}
-
-static LookupPtr makeGSUBLookup (FILE *fp, USHORT lookupType, ULONG offset)
-{
- LookupPtr lookup;
- USHORT lookupFormat;
-
-again:
- if (lookupType == 0 || lookupType > SubLookup_Max)
- ttfError ("Unrecognized GSUB lookupType\n");
-
- xfseek (fp, offset, SEEK_SET, "makeGSUBLookup");
-
- lookupFormat = ttfGetUSHORT (fp);
- if (lookupFormat & 0xfff0)
- lookupFormat = 0x000f;
-
- switch (lookupType << 4 | lookupFormat)
- {
- case 0x011:
- lookup.sub.sub11 = makeGSUB11 (fp, offset);
- break;
- case 0x012:
- lookup.sub.sub12 = makeGSUB12 (fp, offset);
- break;
- case 0x021:
- lookup.sub.sub21 = makeGSUB21 (fp, offset);
- break;
- case 0x031:
- lookup.sub.sub31 = makeGSUB31 (fp, offset);
- break;
- case 0x041:
- lookup.sub.sub41 = makeGSUB41 (fp, offset);
- break;
- case 0x051:
- lookup.sub.sub51 = makeGSUB51 (fp, offset);
- break;
- case 0x052:
- lookup.sub.sub52 = makeGSUB52 (fp, offset);
- break;
- case 0x053:
- lookup.sub.sub53 = makeGSUB53 (fp, offset);
- break;
- case 0x061:
- lookup.sub.sub61 = makeGSUB61 (fp, offset);
- break;
- case 0x062:
- lookup.sub.sub62 = makeGSUB62 (fp, offset);
- break;
- case 0x063:
- lookup.sub.sub63 = makeGSUB63 (fp, offset);
- break;
- case 0x081:
- lookup.sub.sub81 = makeGSUB81 (fp, offset);
- break;
- case 0x071:
- lookupType = ttfGetUSHORT (fp);
- if (lookupType == 7)
- ttfError ("Invalid GSUB extensionLookupType\n");
- offset += ttfGetULONG (fp);
- goto again;
- default:
- ttfError ("Unrecognized GSUB lookupFormat\n");
- }
-
- lookup.otf->lookupType = lookupType;
- lookup.otf->lookupFormat = lookupFormat;
-
- return lookup;
-}
-
-static void printGSUBLookup (FILE *fp, LookupPtr lookup)
-{
- switch (lookup.otf->lookupType << 4 | lookup.otf->lookupFormat)
- {
- case 0x011:
- printGSUB11 (fp, lookup.sub.sub11);
- break;
- case 0x012:
- printGSUB12 (fp, lookup.sub.sub12);
- break;
- case 0x021:
- printGSUB21 (fp, lookup.sub.sub21);
- break;
- case 0x031:
- printGSUB31 (fp, lookup.sub.sub31);
- break;
- case 0x041:
- printGSUB41 (fp, lookup.sub.sub41);
- break;
- case 0x051:
- printGSUB51 (fp, lookup.sub.sub51);
- break;
- case 0x052:
- printGSUB52 (fp, lookup.sub.sub52);
- break;
- case 0x053:
- printGSUB53 (fp, lookup.sub.sub53);
- break;
- case 0x061:
- printGSUB61 (fp, lookup.sub.sub61);
- break;
- case 0x062:
- printGSUB62 (fp, lookup.sub.sub62);
- break;
- case 0x063:
- printGSUB63 (fp, lookup.sub.sub63);
- break;
- case 0x081:
- printGSUB81 (fp, lookup.sub.sub81);
- break;
- default:
- ttfError ("Internal error: printGSUBLookup\n");
- }
-}
-
-static void freeGSUBLookup (LookupPtr lookup)
-{
- switch (lookup.otf->lookupType << 4 | lookup.otf->lookupFormat)
- {
- case 0x011:
- freeGSUB11 (lookup.sub.sub11);
- break;
- case 0x012:
- freeGSUB12 (lookup.sub.sub12);
- break;
- case 0x021:
- freeGSUB21 (lookup.sub.sub21);
- break;
- case 0x031:
- freeGSUB31 (lookup.sub.sub31);
- break;
- case 0x041:
- freeGSUB41 (lookup.sub.sub41);
- break;
- case 0x051:
- freeGSUB51 (lookup.sub.sub51);
- break;
- case 0x052:
- freeGSUB52 (lookup.sub.sub52);
- break;
- case 0x053:
- freeGSUB53 (lookup.sub.sub53);
- break;
- case 0x061:
- freeGSUB61 (lookup.sub.sub61);
- break;
- case 0x062:
- freeGSUB62 (lookup.sub.sub62);
- break;
- case 0x063:
- freeGSUB63 (lookup.sub.sub63);
- break;
- case 0x081:
- freeGSUB81 (lookup.sub.sub81);
- break;
- default:
- ttfError ("Internal error: freeGSUBLookup\n");
- }
-}
-
-static void ttfLoadGSUB (FILE *fp, GSUBPtr gsub, ULONG offset)
-{
- USHORT sOffset, fOffset, lOffset;
-
- xfseek (fp, offset, SEEK_SET, "ttfLoadGSUB");
-
- gsub->version = ttfGetFixed (fp);
- sOffset = ttfGetUSHORT (fp);
- fOffset = ttfGetUSHORT (fp);
- lOffset = ttfGetUSHORT (fp);
-
- gsub->scriptList = otfMakeScriptList (fp, offset + sOffset);
- gsub->featureList = otfMakeFeatureList (fp, offset + fOffset);
- gsub->lookupList = otfMakeLookupList (fp, offset + lOffset, &makeGSUBLookup);
-}
-
-void ttfInitGSUB (TTFontPtr font)
-{
- ULONG tag = FT_MAKE_TAG ('G', 'S', 'U', 'B');
- TableDirPtr ptd;
-
- if ((ptd = ttfLookUpTableDir (tag, font)) != NULL)
- {
- font->gsub = XCALLOC1 (GSUB);
- ttfLoadGSUB (font->fp, font->gsub, ptd->offset);
- }
-}
-
-void ttfPrintGSUB (FILE *fp, GSUBPtr gsub)
-{
- int b[2];
-
- FixedSplit (gsub->version, b);
-
- fprintf (fp, "'GSUB' Table - Glyph Substitution Data\n");
- fprintf (fp, "--------------------------------------\n");
- fprintf (fp, "\t 'GSUB' Version:\t %d.%d\n",b[1],b[0]);
-
- otfPrintScriptList (fp, gsub->scriptList);
- otfPrintFeatureList (fp, gsub->featureList);
- otfPrintLookupList (fp, gsub->lookupList, &printGSUBLookup);
-}
-
-void ttfFreeGSUB (GSUBPtr gsub)
-{
- if (gsub != NULL)
- {
- otfFreeScriptList (gsub->scriptList);
- otfFreeFeatureList (gsub->featureList);
- otfFreeLookupList (gsub->lookupList, &freeGSUBLookup);
- free (gsub);
- }
-}