diff options
Diffstat (limited to 'Build/source/texk/ttfdump/libttf/gpos.c')
-rw-r--r-- | Build/source/texk/ttfdump/libttf/gpos.c | 1006 |
1 files changed, 0 insertions, 1006 deletions
diff --git a/Build/source/texk/ttfdump/libttf/gpos.c b/Build/source/texk/ttfdump/libttf/gpos.c deleted file mode 100644 index bc01e29cf24..00000000000 --- a/Build/source/texk/ttfdump/libttf/gpos.c +++ /dev/null @@ -1,1006 +0,0 @@ -/* gpos.c -- Glyph Positioning Table - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include "ttf.h" -#include "ttfutil.h" - -static USHORT getValueFormat (FILE *fp) -{ - USHORT valueFormat = ttfGetUSHORT (fp); - - if (valueFormat & ValueFormat_Reserved) - ttfError ("Unrecognized GPOS valueFormat\n"); - - return valueFormat; -} - -static ValueRecordPtr -gposMakeValueRecord (USHORT valueFormat, FILE *fp) -{ - int i; - ValueRecordPtr value; - - if (valueFormat == 0) - return NULL; - - value = XCALLOC1 (ValueRecord); - for (i = 0; i < 4; i++) - if (valueFormat & (ValueFormat_XPlacement << i)) - value->valDesign[i] = ttfGetSHORT (fp); - for (i = 0; i < 4; i++) - if (valueFormat & (ValueFormat_XPlaDevice << i)) - value->valDevice[i].offset = ttfGetUSHORT (fp); - - return value; -} - -static void -gposLoadValueRecord (ValueRecordPtr value, FILE *fp, ULONG offset) -{ - int i; - - if (value == NULL) - return; - for (i = 0; i < 4; i++) - if (value->valDevice[i].offset) - value->valDevice[i].device = otfMakeDevice (fp, offset + value->valDevice[i].offset); -} - -static const char *txtDesign[4] = { - "XPlacement", - "YPlacement", - "XAdvance", - "YAdvance" -}; - -static const char *txtDevice[4] = { - "XPlaDevice", - "YPlaDevice", - "XAdvDevice", - "YAdvDevice" -}; - -static void -gposPrintValueRecord (FILE *fp, const char *str, USHORT valueFormat, ValueRecordPtr value) -{ - const char *s = ":"; - int i; - - for (i = 0; i < 4; i++) - if (valueFormat & (ValueFormat_XPlacement << i)) { - fprintf (fp, "%s %s = %d\n", s, txtDesign[i], value->valDesign[i]); - s = str; - } - for (i = 0; i < 4; i++) - if (value->valDevice[i].device) { - fprintf (fp, "%s %s:", s, txtDevice[i]); - otfPrintDevice (fp, value->valDevice[i].device); - s = str; - } -} - -static void freeValueRecord (ValueRecordPtr value) -{ - if (value) { - int i; - - for (i = 0; i < 4; i++) - if (value->valDevice[i].device) - free (value->valDevice[i].device); - free (value); - } -} - -static AnchorPtr gposMakeAnchor (FILE *fp, ULONG offset) -{ - AnchorPtr anchor; - USHORT anchorFormat; - USHORT xOffset, yOffset; - - xfseek (fp, offset, SEEK_SET, "gposMakeAnchor"); - - anchorFormat = ttfGetUSHORT (fp); - switch (anchorFormat) - { - case 1: - anchor.anchor1 = XCALLOC1 (Anchor1); - break; - case 2: - anchor.anchor2 = XCALLOC1 (Anchor2); - break; - case 3: - anchor.anchor3 = XCALLOC1 (Anchor3); - break; - default: - ttfError ("Unrecognized GPOS anchorFormat\n"); - } - anchor.anchor1->anchorFormat = anchorFormat; - anchor.anchor1->xCoordinate = ttfGetSHORT (fp); - anchor.anchor1->yCoordinate = ttfGetSHORT (fp); - - switch (anchorFormat) - { - case 2: - anchor.anchor2->anchorPoint = ttfGetUSHORT (fp); - break; - case 3: - xOffset = ttfGetUSHORT (fp); - yOffset = ttfGetUSHORT (fp); - if (xOffset) - anchor.anchor3->xDevice = otfMakeDevice (fp, offset + xOffset); - if (yOffset) - anchor.anchor3->yDevice = otfMakeDevice (fp, offset + yOffset); - break; - } - - return anchor; -} - -static void -gposPrintAnchor (FILE *fp, const char *str, AnchorPtr anchor) -{ - fprintf (fp, "anchorFormat = %d, xCoordinate = %d, yCoordinate = %d\n", - anchor.anchor1->anchorFormat, anchor.anchor1->xCoordinate, anchor.anchor1->yCoordinate); - - switch (anchor.anchor1->anchorFormat) - { - case 2: - fprintf (fp, "%sanchorPoint = %d\n", str, anchor.anchor2->anchorPoint); - break; - case 3: - if (anchor.anchor3->xDevice) { - fprintf (fp, "%sxDevice: ", str); - otfPrintDevice (fp, anchor.anchor3->xDevice); - } - if (anchor.anchor3->yDevice) { - fprintf (fp, "%syDevice: ", str); - otfPrintDevice (fp, anchor.anchor3->yDevice); - } - break; - } -} - -static void freeAnchor (AnchorPtr anchor) -{ - if (anchor.anchor3) { - if (anchor.anchor3->anchorFormat == 3) { - if (anchor.anchor3->xDevice) - free (anchor.anchor3->xDevice); - if (anchor.anchor3->yDevice) - free (anchor.anchor3->yDevice); - } - free (anchor.anchor3); - } -} - -static MarkRecordPtr -gposMakeMarkArray (FILE *fp, USHORT *markCount, ULONG offset) -{ - int i; - MarkRecordPtr markArray; - USHORT *aOffset; - - xfseek (fp, offset, SEEK_SET, "gposMakeMarkArray"); - - *markCount = ttfGetUSHORT (fp); - markArray = XCALLOC (*markCount, MarkRecord); - aOffset = XCALLOC (*markCount, USHORT); - for (i = 0; i < *markCount; i++) { - markArray[i].class = ttfGetUSHORT (fp); - aOffset[i] = ttfGetUSHORT (fp); - } - for (i = 0; i < *markCount; i++) - markArray[i].markAnchor = gposMakeAnchor (fp, offset + aOffset[i]); - free (aOffset); - - return markArray; -} - -static void -gposPrintMarkArray (FILE *fp, USHORT markCount, MarkRecordPtr markArray) -{ - int i; - - for (i = 0; i < markCount; i++) { - fprintf (fp, "\t %2d. class: %d - ", i, markArray[i].class); - gposPrintAnchor (fp, "\t\t ", markArray[i].markAnchor); - } -} - -/* Used for both pos41->baseArray and pos61->mark2Array. */ -static AnchorPtr * -gposMakeBaseArray (FILE *fp, USHORT *baseCount, USHORT classCount, ULONG offset) -{ - int i; - AnchorPtr *baseArray; - USHORT *aOffset; - - xfseek (fp, offset, SEEK_SET, "gposMakeBaseArray"); - - *baseCount = ttfGetUSHORT (fp); - aOffset = ttfMakeUSHORT (*baseCount * classCount, fp); - baseArray = XCALLOC (*baseCount * classCount, AnchorPtr); - for (i = 0; i < *baseCount * classCount; i++) - if (aOffset[i]) - baseArray[i] = gposMakeAnchor (fp, offset + aOffset[i]); - free (aOffset); - - return baseArray; -} - -static Pos11Ptr makeGPOS11 (FILE *fp, ULONG offset) -{ - USHORT cOffset; - Pos11Ptr pos = XCALLOC1 (Pos11); - - cOffset = ttfGetUSHORT (fp); - pos->valueFormat = getValueFormat (fp); - pos->value = gposMakeValueRecord (pos->valueFormat, fp); - pos->coverage = otfMakeCoverage (fp, offset + cOffset); - gposLoadValueRecord (pos->value, fp, offset); - - return pos; -} - -static void printGPOS11 (FILE *fp, Pos11Ptr pos) -{ - fprintf (fp, " - Single Adjustment Value\n\t "); - otfPrintCoverage (fp, pos->coverage); - fprintf (fp, "\t valueFormat: 0x%04x\n", pos->valueFormat); - if (pos->valueFormat) { - fprintf (fp, "\t value"); - gposPrintValueRecord (fp, "\t\t", pos->valueFormat, pos->value); - } -} - -static void freeGPOS11 (Pos11Ptr pos) -{ - freeValueRecord (pos->value); - otfFreeCoverage (pos->coverage); -} - -static Pos12Ptr makeGPOS12 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset; - Pos12Ptr pos = XCALLOC1 (Pos12); - - cOffset = ttfGetUSHORT (fp); - pos->valueFormat = getValueFormat (fp); - pos->valueCount = ttfGetUSHORT (fp); - pos->value = XCALLOC (pos->valueCount, ValueRecordPtr); - for (i = 0; i < pos->valueCount; i++) - pos->value[i] = gposMakeValueRecord (pos->valueFormat, fp); - pos->coverage = otfMakeCoverage (fp, offset + cOffset); - for (i = 0; i < pos->valueCount; i++) - gposLoadValueRecord (pos->value[i], fp, offset); - - return pos; -} - -static void printGPOS12 (FILE *fp, Pos12Ptr pos) -{ - int i; - - fprintf (fp, " - Single Adjustment List\n\t "); - otfPrintCoverage (fp, pos->coverage); - fprintf (fp, "\t valueFormat: 0x%04x, valueCount: %d\n", pos->valueFormat, pos->valueCount); - for (i = 0; i < pos->valueCount; i++) { - fprintf (fp, "\t %2d. value", i); - gposPrintValueRecord (fp, "\t\t ", pos->valueFormat, pos->value[i]); - } -} - -static void freeGPOS12 (Pos12Ptr pos) -{ - int i; - - for (i = 0; i < pos->valueCount; i++) - freeValueRecord (pos->value[i]); - free (pos->value); - otfFreeCoverage (pos->coverage); -} - -static void gposLoadPairSet (Pos21Ptr pos, int i, FILE *fp, ULONG offset) -{ - int j; - PairSetPtr pairSet = &pos->pairSet[i]; - - xfseek (fp, offset, SEEK_SET, "gposLoadPairSet"); - - pairSet->pairValueCount = ttfGetUSHORT (fp); - pairSet->pairValue = XCALLOC (pairSet->pairValueCount, PairValueRecord); - for (j = 0; j < pairSet->pairValueCount; j++) { - pairSet->pairValue[j].secondGlyph = ttfGetUSHORT (fp); - pairSet->pairValue[j].value1 = gposMakeValueRecord (pos->valueFormat1, fp); - pairSet->pairValue[j].value2 = gposMakeValueRecord (pos->valueFormat2, fp); - } -} - -static Pos21Ptr makeGPOS21 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset; - USHORT *pOffset; - Pos21Ptr pos = XCALLOC1 (Pos21); - - cOffset = ttfGetUSHORT (fp); - pos->valueFormat1 = getValueFormat (fp); - pos->valueFormat2 = getValueFormat (fp); - pos->pairSetCount = ttfGetUSHORT (fp); - pOffset = ttfMakeUSHORT (pos->pairSetCount, fp); - pos->coverage = otfMakeCoverage (fp, offset + cOffset); - pos->pairSet = XCALLOC (pos->pairSetCount, PairSet); - for (i = 0; i < pos->pairSetCount; i++) - gposLoadPairSet (pos, i, fp, offset + pOffset[i]); - free (pOffset); - for (i = 0; i < pos->pairSetCount; i++) { - int j; - - for (j = 0; j < pos->pairSet[i].pairValueCount; j++) { - gposLoadValueRecord (pos->pairSet[i].pairValue[j].value1, fp, offset); - gposLoadValueRecord (pos->pairSet[i].pairValue[j].value2, fp, offset); - } - } - - return pos; -} - -static void printGPOS21 (FILE *fp, Pos21Ptr pos) -{ - int i; - - fprintf (fp, " - Pair Adjustment List\n\t "); - otfPrintCoverage (fp, pos->coverage); - fprintf (fp, "\t valueFormat1: 0x%04x, valueFormat2: 0x%04x, pairSetCount: %d\n", - pos->valueFormat1, pos->valueFormat2, pos->pairSetCount); - for (i = 0; i < pos->pairSetCount; i++) { - int j; - - fprintf (fp, "\t %2d. pairValueCount: %d\n", i, pos->pairSet[i].pairValueCount); - for (j = 0; j < pos->pairSet[i].pairValueCount; j++) { - fprintf (fp, "\t %2d. secondGlyph: %d\n", j, - pos->pairSet[i].pairValue[j].secondGlyph); - if (pos->valueFormat1) { - fprintf (fp, "\t\t value1"); - gposPrintValueRecord (fp, "\t\t\t ", pos->valueFormat1, - pos->pairSet[i].pairValue[j].value1); - } - if (pos->valueFormat2) { - fprintf (fp, "\t\t value2"); - gposPrintValueRecord (fp, "\t\t\t ", pos->valueFormat2, - pos->pairSet[i].pairValue[j].value2); - } - } - } -} - -static void freeGPOS21 (Pos21Ptr pos) -{ - int i; - - for (i = 0; i < pos->pairSetCount; i++) { - int j; - for (j = 0; j < pos->pairSet[i].pairValueCount; j++) { - freeValueRecord (pos->pairSet[i].pairValue[j].value1); - freeValueRecord (pos->pairSet[i].pairValue[j].value2); - } - free (pos->pairSet[i].pairValue); - } - free (pos->pairSet); - otfFreeCoverage (pos->coverage); -} - -static Pos22Ptr makeGPOS22 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset, cOffset1, cOffset2; - Pos22Ptr pos = XCALLOC1 (Pos22); - - cOffset = ttfGetUSHORT (fp); - pos->valueFormat1 = getValueFormat (fp); - pos->valueFormat2 = getValueFormat (fp); - cOffset1 = ttfGetUSHORT (fp); - cOffset2 = ttfGetUSHORT (fp); - pos->class1Count = ttfGetUSHORT (fp); - pos->class2Count = ttfGetUSHORT (fp); - pos->values = XCALLOC (2 * pos->class1Count * pos->class2Count, ValueRecordPtr); - for (i = 0; i < 2 * pos->class1Count * pos->class2Count; i++) - pos->values[i] = gposMakeValueRecord (i & 1 ? pos->valueFormat2 : pos->valueFormat1, fp); - pos->coverage = otfMakeCoverage (fp, offset + cOffset); - pos->classDef1 = otfMakeClassDef (fp, offset + cOffset1); - pos->classDef2 = otfMakeClassDef (fp, offset + cOffset2); - for (i = 0; i < 2 * pos->class1Count * pos->class2Count; i++) - gposLoadValueRecord (pos->values[i], fp, offset); - - return pos; -} - -static void printGPOS22 (FILE *fp, Pos22Ptr pos) -{ - int i, num = 0; - - fprintf (fp, " - Pair Adjustment Class\n\t "); - otfPrintCoverage (fp, pos->coverage); - fprintf (fp, "\t valueFormat1: 0x%04x, valueFormat2: 0x%04x\n", - pos->valueFormat1, pos->valueFormat2); - fprintf (fp, "\t ClassDef1 - "); - otfPrintClassDef (fp, pos->classDef1); - fprintf (fp, "\t ClassDef2 - "); - otfPrintClassDef (fp, pos->classDef2); - fprintf (fp, "\t class1Count: %d, class2Count: %d\n", - pos->class1Count, pos->class2Count); - for (i = 0; i < pos->class1Count; i++) { - int j; - const char *s = ""; - - fprintf (fp, "\t %2d.", i); - for (j = 0; j < pos->class2Count; j++) { - fprintf (fp, "%s %2d.", s, j); - s = "\t "; - - if (pos->valueFormat1) { - fprintf (fp, " value1"); - gposPrintValueRecord (fp, "\t\t\t ", pos->valueFormat1, - pos->values[num]); - } - num++; - if (pos->valueFormat2) { - fprintf (fp, " value2"); - gposPrintValueRecord (fp, "\t\t\t ", pos->valueFormat2, - pos->values[num]); - } - num++; - } - } -} - -static void freeGPOS22 (Pos22Ptr pos) -{ - int i; - - for (i = 0; i < 2 * pos->class1Count * pos->class2Count; i++) - freeValueRecord (pos->values[i]); - free (pos->values); - otfFreeCoverage (pos->coverage); - otfFreeClassDef (pos->classDef1); - otfFreeClassDef (pos->classDef2); -} - -static Pos31Ptr makeGPOS31 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset; - USHORT *eOffset; - Pos31Ptr pos = XCALLOC1 (Pos31); - - cOffset = ttfGetUSHORT (fp); - pos->entryExitCount = ttfGetUSHORT (fp); - eOffset = ttfMakeUSHORT (2 * pos->entryExitCount, fp); - pos->coverage = otfMakeCoverage (fp, offset + cOffset); - pos->entryExit = XCALLOC (2 * pos->entryExitCount, AnchorPtr); - for (i = 0; i < 2 * pos->entryExitCount; i++) - if (eOffset[i]) - pos->entryExit[i] = gposMakeAnchor (fp, offset + eOffset[i]); - free (eOffset); - - return pos; -} - -static void printGPOS31 (FILE *fp, Pos31Ptr pos) -{ - int i, num = 0; - - fprintf (fp, " - Cursive Attachment\n\t "); - otfPrintCoverage (fp, pos->coverage); - fprintf (fp, "\t entryExitCount: %d\n", pos->entryExitCount); - for (i = 0; i < pos->entryExitCount; i++) { - int j; - const char *s = ""; - - fprintf (fp, "\t %2d. ", i); - for (j = 0; j < 2; j++) { - if (pos->entryExit[num].anchor1) { - fprintf (fp, "%s%sAnchor - ", s, j ? "exit" : "entry"); - gposPrintAnchor (fp, "\t\t ", pos->entryExit[num]); - s = "\t "; - } - num++; - } - } -} - -static void freeGPOS31 (Pos31Ptr pos) -{ - int i; - - for (i = 0; i < 2 * pos->entryExitCount; i++) - freeAnchor (pos->entryExit[i]); - free (pos->entryExit); - otfFreeCoverage (pos->coverage); -} - -static Pos41Ptr makeGPOS41 (FILE *fp, ULONG offset) -{ - USHORT mcOffset, bcOffset, maOffset, baOffset; - Pos41Ptr pos = XCALLOC1 (Pos41); - - mcOffset = ttfGetUSHORT (fp); - bcOffset = ttfGetUSHORT (fp); - pos->classCount = ttfGetUSHORT (fp); - maOffset = ttfGetUSHORT (fp); - baOffset = ttfGetUSHORT (fp); - pos->markCoverage = otfMakeCoverage (fp, offset + mcOffset); - pos->baseCoverage = otfMakeCoverage (fp, offset + bcOffset); - pos->markArray = gposMakeMarkArray (fp, &pos->markCount, offset + maOffset); - pos->baseArray = gposMakeBaseArray (fp, &pos->baseCount, pos->classCount, offset + baOffset); - - return pos; -} - -static void printGPOS41 (FILE *fp, Pos41Ptr pos) -{ - int i, num = 0; - - fprintf (fp, " - Mark To Base Attachment\n\t mark"); - otfPrintCoverage (fp, pos->markCoverage); - fprintf (fp, "\t markArray - markCount: %d\n", pos->markCount); - gposPrintMarkArray (fp, pos->markCount, pos->markArray); - fprintf (fp, "\t base"); - otfPrintCoverage (fp, pos->baseCoverage); - fprintf (fp, "\t baseArray - baseCount: %d, classCount: %d\n", - pos->baseCount, pos->classCount); - for (i = 0; i < pos->baseCount; i++) { - int j; - const char *s = ""; - - fprintf (fp, "\t %2d. ", i); - for (j = 0; j < pos->classCount; j++) { - if (pos->baseArray[num].anchor1) { - fprintf (fp, "%s%2d. ", s, j); - gposPrintAnchor (fp, "\t\t ", pos->baseArray[num]); - s = "\t "; - } - num++; - } - } -} - -static void freeGPOS41 (Pos41Ptr pos) -{ - int i; - - for (i = 0; i < pos->markCount; i++) - freeAnchor (pos->markArray[i].markAnchor); - free (pos->markArray); - for (i = 0; i < pos->baseCount * pos->classCount; i++) - freeAnchor (pos->baseArray[i]); - free (pos->baseArray); - otfFreeCoverage (pos->markCoverage); - otfFreeCoverage (pos->baseCoverage); -} - -static void -gposLoadLigatureArray (LigatureAttachPtr ligatureArray, USHORT classCount, FILE *fp, ULONG offset) -{ - int i; - USHORT *aOffset; - - xfseek (fp, offset, SEEK_SET, "gposLoadLigatureArray"); - - ligatureArray->componentCount = ttfGetUSHORT (fp); - aOffset = ttfMakeUSHORT (ligatureArray->componentCount * classCount, fp); - ligatureArray->componentRecord = XCALLOC (ligatureArray->componentCount * classCount, AnchorPtr); - for (i = 0; i < ligatureArray->componentCount * classCount; i++) - if (aOffset[i]) - ligatureArray->componentRecord[i] = gposMakeAnchor (fp, offset + aOffset[i]); - free (aOffset); -} - -static LigatureAttachPtr -gposMakeLigatureArray (FILE *fp, USHORT *ligatureCount, USHORT classCount, ULONG offset) -{ - int i; - LigatureAttachPtr ligatureArray; - USHORT *aOffset; - - xfseek (fp, offset, SEEK_SET, "gposMakeLigatureArray"); - - *ligatureCount = ttfGetUSHORT (fp); - aOffset = ttfMakeUSHORT (*ligatureCount, fp); - ligatureArray = XCALLOC (*ligatureCount, LigatureAttach); - for (i = 0; i < *ligatureCount; i++) - gposLoadLigatureArray (&ligatureArray[i], classCount, fp, offset + aOffset[i]); - free (aOffset); - - return ligatureArray; -} - -static Pos51Ptr makeGPOS51 (FILE *fp, ULONG offset) -{ - USHORT mcOffset, lcOffset, maOffset, laOffset; - Pos51Ptr pos = XCALLOC1 (Pos51); - - mcOffset = ttfGetUSHORT (fp); - lcOffset = ttfGetUSHORT (fp); - pos->classCount = ttfGetUSHORT (fp); - maOffset = ttfGetUSHORT (fp); - laOffset = ttfGetUSHORT (fp); - pos->markCoverage = otfMakeCoverage (fp, offset + mcOffset); - pos->ligatureCoverage = otfMakeCoverage (fp, offset + lcOffset); - pos->markArray = gposMakeMarkArray (fp, &pos->markCount, offset + maOffset); - pos->ligatureArray = gposMakeLigatureArray (fp, &pos->ligatureCount, pos->classCount, offset + laOffset); - - return pos; -} - -static void printGPOS51 (FILE *fp, Pos51Ptr pos) -{ - int i; - - fprintf (fp, " - Mark To Ligature Attachment\n\t mark"); - otfPrintCoverage (fp, pos->markCoverage); - fprintf (fp, "\t markArray - markCount: %d\n", pos->markCount); - gposPrintMarkArray (fp, pos->markCount, pos->markArray); - fprintf (fp, "\t ligature"); - otfPrintCoverage (fp, pos->ligatureCoverage); - fprintf (fp, "\t ligatureArray - ligatureCount: %d\n", pos->ligatureCount); - for (i = 0; i < pos->ligatureCount; i++) { - int j, num = 0; - - fprintf (fp, "\t %2d. componentCount: %d, classCount: %d\n", i, - pos->ligatureArray[i].componentCount, pos->classCount); - for (j = 0; j < pos->ligatureArray[i].componentCount; j++) { - int k; - const char *s = ""; - - fprintf (fp, "\t %2d. ", j); - for (k = 0; k < pos->classCount; k++) { - if (pos->ligatureArray[i].componentRecord[num].anchor1) { - fprintf (fp, "%s%2d. ", s, k); - gposPrintAnchor (fp, "\t\t ", pos->ligatureArray[i].componentRecord[num]); - s = "\t\t "; - } - num++; - } - } - } -} - -static void freeGPOS51 (Pos51Ptr pos) -{ - int i; - - for (i = 0; i < pos->markCount; i++) - freeAnchor (pos->markArray[i].markAnchor); - free (pos->markArray); - for (i = 0; i < pos->ligatureCount; i++) { - int j; - - for (j = 0; j < pos->ligatureArray[i].componentCount * pos->classCount; j++) - freeAnchor (pos->ligatureArray[i].componentRecord[j]); - } - free (pos->ligatureArray); - otfFreeCoverage (pos->markCoverage); - otfFreeCoverage (pos->ligatureCoverage); -} - -static Pos61Ptr makeGPOS61 (FILE *fp, ULONG offset) -{ - USHORT c1Offset, c2Offset, a1Offset, a2Offset; - Pos61Ptr pos = XCALLOC1 (Pos61); - - c1Offset = ttfGetUSHORT (fp); - c2Offset = ttfGetUSHORT (fp); - pos->classCount = ttfGetUSHORT (fp); - a1Offset = ttfGetUSHORT (fp); - a2Offset = ttfGetUSHORT (fp); - pos->mark1Coverage = otfMakeCoverage (fp, offset + c1Offset); - pos->mark2Coverage = otfMakeCoverage (fp, offset + c2Offset); - pos->mark1Array = gposMakeMarkArray (fp, &pos->mark1Count, offset + a1Offset); - pos->mark2Array = gposMakeBaseArray (fp, &pos->mark2Count, pos->classCount, offset + a2Offset); - - return pos; -} - -static void printGPOS61 (FILE *fp, Pos61Ptr pos) -{ - int i, num = 0; - - fprintf (fp, " - Mark To Mark Attachment\n\t mark1"); - otfPrintCoverage (fp, pos->mark1Coverage); - fprintf (fp, "\t mark1Array - mark1Count: %d\n", pos->mark1Count); - gposPrintMarkArray (fp, pos->mark1Count, pos->mark1Array); - fprintf (fp, "\t mark2"); - otfPrintCoverage (fp, pos->mark2Coverage); - fprintf (fp, "\t mark2Array - mark2Count: %d, classCount: %d\n", - pos->mark2Count, pos->classCount); - for (i = 0; i < pos->mark2Count; i++) { - int j; - const char *s = ""; - - fprintf (fp, "\t %2d. ", i); - for (j = 0; j < pos->classCount; j++) { - if (pos->mark2Array[num].anchor1) { - fprintf (fp, "%s%2d. ", s, j); - gposPrintAnchor (fp, "\t\t ", pos->mark2Array[num]); - s = "\t "; - } - num++; - } - } -} - -static void freeGPOS61 (Pos61Ptr pos) -{ - int i; - - for (i = 0; i < pos->mark1Count; i++) - freeAnchor (pos->mark1Array[i].markAnchor); - free (pos->mark1Array); - for (i = 0; i < pos->mark2Count * pos->classCount; i++) - freeAnchor (pos->mark2Array[i]); - free (pos->mark2Array); - otfFreeCoverage (pos->mark1Coverage); - otfFreeCoverage (pos->mark2Coverage); -} - -#define makeGPOS71 makeOTFCtx1 -#define printGPOS71 printOTFCtx1 -#define freeGPOS71 freeOTFCtx1 - -#define makeGPOS72 makeOTFCtx2 -#define printGPOS72 printOTFCtx2 -#define freeGPOS72 freeOTFCtx2 - -#define makeGPOS73 makeOTFCtx3 -#define printGPOS73 printOTFCtx3 -#define freeGPOS73 freeOTFCtx3 - -#define makeGPOS81 makeOTFChn1 -#define printGPOS81 printOTFChn1 -#define freeGPOS81 freeOTFChn1 - -#define makeGPOS82 makeOTFChn2 -#define printGPOS82 printOTFChn2 -#define freeGPOS82 freeOTFChn2 - -#define makeGPOS83 makeOTFChn3 -#define printGPOS83 printOTFChn3 -#define freeGPOS83 freeOTFChn3 - -static LookupPtr makeGPOSLookup (FILE *fp, USHORT lookupType, ULONG offset) -{ - LookupPtr lookup; - USHORT lookupFormat; - -again: - if (lookupType == 0 || lookupType > PosLookup_Max) - ttfError ("Unrecognized GPOS lookupType\n"); - - xfseek (fp, offset, SEEK_SET, "makeGPOSLookup"); - - lookupFormat = ttfGetUSHORT (fp); - if (lookupFormat & 0xfff0) - lookupFormat = 0x000f; - - switch (lookupType << 4 | lookupFormat) - { - case 0x011: - lookup.pos.pos11 = makeGPOS11 (fp, offset); - break; - case 0x012: - lookup.pos.pos12 = makeGPOS12 (fp, offset); - break; - case 0x021: - lookup.pos.pos21 = makeGPOS21 (fp, offset); - break; - case 0x022: - lookup.pos.pos22 = makeGPOS22 (fp, offset); - break; - case 0x031: - lookup.pos.pos31 = makeGPOS31 (fp, offset); - break; - case 0x041: - lookup.pos.pos41 = makeGPOS41 (fp, offset); - break; - case 0x051: - lookup.pos.pos51 = makeGPOS51 (fp, offset); - break; - case 0x061: - lookup.pos.pos61 = makeGPOS61 (fp, offset); - break; - case 0x071: - lookup.pos.pos71 = makeGPOS71 (fp, offset); - break; - case 0x072: - lookup.pos.pos72 = makeGPOS72 (fp, offset); - break; - case 0x073: - lookup.pos.pos73 = makeGPOS73 (fp, offset); - break; - case 0x081: - lookup.pos.pos81 = makeGPOS81 (fp, offset); - break; - case 0x082: - lookup.pos.pos82 = makeGPOS82 (fp, offset); - break; - case 0x083: - lookup.pos.pos83 = makeGPOS83 (fp, offset); - break; - case 0x091: - lookupType = ttfGetUSHORT (fp); - if (lookupType == 9) - ttfError ("Invalid GPOS extensionLookupType\n"); - offset += ttfGetULONG (fp); - goto again; - default: - ttfError ("Unrecognized GPOS lookupFormat\n"); - } - - lookup.otf->lookupType = lookupType; - lookup.otf->lookupFormat = lookupFormat; - - return lookup; -} - -static void printGPOSLookup (FILE *fp, LookupPtr lookup) -{ - switch (lookup.otf->lookupType << 4 | lookup.otf->lookupFormat) - { - case 0x011: - printGPOS11 (fp, lookup.pos.pos11); - break; - case 0x012: - printGPOS12 (fp, lookup.pos.pos12); - break; - case 0x021: - printGPOS21 (fp, lookup.pos.pos21); - break; - case 0x022: - printGPOS22 (fp, lookup.pos.pos22); - break; - case 0x031: - printGPOS31 (fp, lookup.pos.pos31); - break; - case 0x041: - printGPOS41 (fp, lookup.pos.pos41); - break; - case 0x051: - printGPOS51 (fp, lookup.pos.pos51); - break; - case 0x061: - printGPOS61 (fp, lookup.pos.pos61); - break; - case 0x071: - printGPOS71 (fp, lookup.pos.pos71); - break; - case 0x072: - printGPOS72 (fp, lookup.pos.pos72); - break; - case 0x073: - printGPOS73 (fp, lookup.pos.pos73); - break; - case 0x081: - printGPOS81 (fp, lookup.pos.pos81); - break; - case 0x082: - printGPOS82 (fp, lookup.pos.pos82); - break; - case 0x083: - printGPOS83 (fp, lookup.pos.pos83); - break; - default: - ttfError ("Internal error: printGPOSLookup\n"); - } -} - -static void freeGPOSLookup (LookupPtr lookup) -{ - switch (lookup.otf->lookupType << 4 | lookup.otf->lookupFormat) - { - case 0x011: - freeGPOS11 (lookup.pos.pos11); - break; - case 0x012: - freeGPOS12 (lookup.pos.pos12); - break; - case 0x021: - freeGPOS21 (lookup.pos.pos21); - break; - case 0x022: - freeGPOS22 (lookup.pos.pos22); - break; - case 0x031: - freeGPOS31 (lookup.pos.pos31); - break; - case 0x041: - freeGPOS41 (lookup.pos.pos41); - break; - case 0x051: - freeGPOS51 (lookup.pos.pos51); - break; - case 0x061: - freeGPOS61 (lookup.pos.pos61); - break; - case 0x071: - freeGPOS71 (lookup.pos.pos71); - break; - case 0x072: - freeGPOS72 (lookup.pos.pos72); - break; - case 0x073: - freeGPOS73 (lookup.pos.pos73); - break; - case 0x081: - freeGPOS81 (lookup.pos.pos81); - break; - case 0x082: - freeGPOS82 (lookup.pos.pos82); - break; - case 0x083: - freeGPOS83 (lookup.pos.pos83); - break; - default: - ttfError ("Internal error: freeGPOSLookup\n"); - } -} - -static void ttfLoadGPOS (FILE *fp, GPOSPtr gpos, ULONG offset) -{ - USHORT sOffset, fOffset, lOffset; - - xfseek (fp, offset, SEEK_SET, "ttfLoadGPOS"); - - gpos->version = ttfGetFixed (fp); - sOffset = ttfGetUSHORT (fp); - fOffset = ttfGetUSHORT (fp); - lOffset = ttfGetUSHORT (fp); - - gpos->scriptList = otfMakeScriptList (fp, offset + sOffset); - gpos->featureList = otfMakeFeatureList (fp, offset + fOffset); - gpos->lookupList = otfMakeLookupList (fp, offset + lOffset, &makeGPOSLookup); -} - -void ttfInitGPOS (TTFontPtr font) -{ - ULONG tag = FT_MAKE_TAG ('G', 'P', 'O', 'S'); - TableDirPtr ptd; - - if ((ptd = ttfLookUpTableDir (tag, font)) != NULL) - { - font->gpos = XCALLOC1 (GPOS); - ttfLoadGPOS (font->fp, font->gpos, ptd->offset); - } -} - -void ttfPrintGPOS (FILE *fp, GPOSPtr gpos) -{ - int b[2]; - - FixedSplit (gpos->version, b); - - fprintf (fp, "'GPOS' Table - Glyph Positioning Data\n"); - fprintf (fp, "-------------------------------------\n"); - fprintf (fp, "\t 'GPOS' Version:\t %d.%d\n",b[1],b[0]); - - otfPrintScriptList (fp, gpos->scriptList); - otfPrintFeatureList (fp, gpos->featureList); - otfPrintLookupList (fp, gpos->lookupList, &printGPOSLookup); -} - -void ttfFreeGPOS (GPOSPtr gpos) -{ - if (gpos != NULL) - { - otfFreeScriptList (gpos->scriptList); - otfFreeFeatureList (gpos->featureList); - otfFreeLookupList (gpos->lookupList, &freeGPOSLookup); - free (gpos); - } -} |