diff options
Diffstat (limited to 'Build/source/texk/ttfdump/libttf/otfcommon.c')
-rw-r--r-- | Build/source/texk/ttfdump/libttf/otfcommon.c | 1083 |
1 files changed, 0 insertions, 1083 deletions
diff --git a/Build/source/texk/ttfdump/libttf/otfcommon.c b/Build/source/texk/ttfdump/libttf/otfcommon.c deleted file mode 100644 index 55cb46c8ff7..00000000000 --- a/Build/source/texk/ttfdump/libttf/otfcommon.c +++ /dev/null @@ -1,1083 +0,0 @@ -/* otfcommon.c -- OpenType Common Table Formats - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <stdlib.h> -#include "ttf.h" -#include "ttfutil.h" - -static LangSysPtr -otfMakeLangSys (FILE *fp, ULONG offset) -{ - LangSysPtr langSys = XCALLOC1 (LangSys); - USHORT lookupOrder; - - xfseek (fp, offset, SEEK_SET, "otfMakeLangSys"); - - if ((lookupOrder = ttfGetUSHORT (fp)) != 0) - ttfError ("Non-zero lookupOrder\n"); - langSys->reqFeatureIndex = ttfGetUSHORT (fp); - langSys->featureCount = ttfGetUSHORT (fp); - langSys->featureIndex = ttfMakeUSHORT (langSys->featureCount, fp); - - return langSys; -} - -static void -otfLoadScriptRecord (FILE *fp, ScriptRecordPtr scriptRecord, ULONG offset) -{ - int i; - USHORT dOffset; - USHORT *lOffset; - - xfseek (fp, offset, SEEK_SET, "otfLoadScriptRecord"); - - dOffset = ttfGetUSHORT (fp); - - scriptRecord->langSysCount = ttfGetUSHORT (fp); - if (scriptRecord->langSysCount) { - scriptRecord->langSysRecord = XCALLOC (scriptRecord->langSysCount, LangSysRecord); - lOffset = XTALLOC (scriptRecord->langSysCount, USHORT); - - for (i = 0; i < scriptRecord->langSysCount; i++) { - scriptRecord->langSysRecord[i].tag = ttfGetULONG (fp); - lOffset[i] = ttfGetUSHORT (fp); - } - - for (i = 0; i < scriptRecord->langSysCount; i++) - scriptRecord->langSysRecord[i].langSys = otfMakeLangSys (fp, offset + lOffset[i]); - - free (lOffset); - } - - if (dOffset) - scriptRecord->defaultLangSys = otfMakeLangSys (fp, offset + dOffset); -} - -ScriptListPtr -otfMakeScriptList (FILE *fp, ULONG offset) -{ - int i; - USHORT *sOffset; - ScriptListPtr scriptList = XCALLOC1 (ScriptList); - - xfseek (fp, offset, SEEK_SET, "otfMakeScriptList"); - - scriptList->scriptCount = ttfGetUSHORT (fp); - scriptList->scriptRecord = XCALLOC (scriptList->scriptCount, ScriptRecord); - sOffset = XTALLOC (scriptList->scriptCount, USHORT); - - for (i = 0; i < scriptList->scriptCount; i++) { - scriptList->scriptRecord[i].tag = ttfGetULONG (fp); - sOffset[i] = ttfGetUSHORT (fp); - } - - for (i = 0; i < scriptList->scriptCount; i++) - otfLoadScriptRecord (fp, &scriptList->scriptRecord[i], offset + sOffset[i]); - - free (sOffset); - - return scriptList; -} - -static void -otfPrintLangSys (FILE *fp, LangSysPtr langSys) -{ - int i; - - fprintf (fp, " lang - featureCount: %d\n", langSys->featureCount); - if (langSys->reqFeatureIndex != 0xffff) - fprintf (fp, "\t\t reqFeatureIndex: %d\n", langSys->reqFeatureIndex); - if (langSys->featureCount) { - fprintf (fp, "\t\t featureIndex: %d", langSys->featureIndex[0]); - for (i = 1; i < langSys->featureCount; i++) - fprintf (fp, i % 8 ? ", %d" : ",\n\t\t\t\t%d", - langSys->featureIndex[i]); - fprintf (fp, "\n"); - } -} - -static void -otfPrintScriptRecord (FILE *fp, ScriptRecordPtr scriptRecord) -{ - int i; - - fprintf (fp, "'%s' script - langSysCount: %d\n", - TagToStr (scriptRecord->tag), scriptRecord->langSysCount); - if (scriptRecord->defaultLangSys) { - fprintf (fp, "\t default"); - otfPrintLangSys (fp, scriptRecord->defaultLangSys); - } - for (i = 0; i < scriptRecord->langSysCount; i++) { - fprintf (fp, " %2d. '%s'", i, - TagToStr (scriptRecord->langSysRecord[i].tag)); - otfPrintLangSys (fp, scriptRecord->langSysRecord[i].langSys); - } -} - -void -otfPrintScriptList (FILE *fp, ScriptListPtr scriptList) -{ - int i; - - fprintf (fp, " scriptCount: %d\n", scriptList->scriptCount); - - for (i = 0; i < scriptList->scriptCount; i++) { - fprintf (fp, " %2d. ", i); - otfPrintScriptRecord (fp, &scriptList->scriptRecord[i]); - } - fprintf (fp, "\n"); -} - -static void -otfFreeLangSys (LangSysPtr langSys) -{ - free (langSys->featureIndex); - free (langSys); -} - -static void -otfFreeScriptRecord (ScriptRecordPtr scriptRecord) -{ - int i; - - if (scriptRecord->defaultLangSys) - otfFreeLangSys (scriptRecord->defaultLangSys); - for (i = 0; i < scriptRecord->langSysCount; i++) - otfFreeLangSys (scriptRecord->langSysRecord[i].langSys); - free (scriptRecord->langSysRecord); -} - -void -otfFreeScriptList (ScriptListPtr scriptList) -{ - int i; - - for (i = 0; i < scriptList->scriptCount; i++) - otfFreeScriptRecord (&scriptList->scriptRecord[i]); - free (scriptList->scriptRecord); - free (scriptList); -} - -static void -otfLoadFeatureRecord (FILE *fp, FeatureRecordPtr featureRecord, ULONG offset) -{ - xfseek (fp, offset, SEEK_SET, "otfLoadFeatureRecord"); - - featureRecord->featureParams = ttfGetUSHORT (fp); - featureRecord->lookupCount = ttfGetUSHORT (fp); - featureRecord->lookupListIndex = ttfMakeUSHORT (featureRecord->lookupCount, fp); -} - -FeatureListPtr -otfMakeFeatureList (FILE *fp, ULONG offset) -{ - int i; - USHORT *fOffset; - FeatureListPtr featureList = XCALLOC1 (FeatureList); - - xfseek (fp, offset, SEEK_SET, "otfMakeFeatureList"); - - featureList->featureCount = ttfGetUSHORT (fp); - if (featureList->featureCount) { - featureList->featureRecord = XCALLOC (featureList->featureCount, FeatureRecord); - fOffset = XTALLOC (featureList->featureCount, USHORT); - - for (i = 0; i < featureList->featureCount; i++) { - featureList->featureRecord[i].tag = ttfGetULONG (fp); - fOffset[i] = ttfGetUSHORT (fp); - } - - for (i = 0; i < featureList->featureCount; i++) - otfLoadFeatureRecord (fp, &featureList->featureRecord[i], offset + fOffset[i]); - - free (fOffset); - } - - return featureList; -} - -static void -otfPrintFeatureRecord (FILE *fp, FeatureRecordPtr featureRecord) -{ - int i; - - fprintf (fp, "'%s' feature - lookupCount: %d\n", - TagToStr (featureRecord->tag), featureRecord->lookupCount); - fprintf (fp, "\t\tlookupListIndex: %d", featureRecord->lookupListIndex[0]); - for (i = 1; i < featureRecord->lookupCount; i++) - fprintf (fp, i % 8 ? ", %d" : ",\n\t\t\t\t %d", - featureRecord->lookupListIndex[i]); - fprintf (fp, "\n"); - if (featureRecord->featureParams) - fprintf (fp, "\t\tfeatureParams Offset: 0x%04x\n", featureRecord->featureParams); -} - -void -otfPrintFeatureList (FILE *fp, FeatureListPtr featureList) -{ - int i; - - fprintf (fp, " featureCount: %d\n", featureList->featureCount); - - for (i = 0; i < featureList->featureCount; i++) { - fprintf (fp, " %2d. ", i); - otfPrintFeatureRecord (fp, &featureList->featureRecord[i]); - } - fprintf (fp, "\n"); -} - -void -otfFreeFeatureList (FeatureListPtr featureList) -{ - int i; - - if (featureList->featureCount) { - for (i = 0; i < featureList->featureCount; i++) - free (featureList->featureRecord[i].lookupListIndex); - free (featureList->featureRecord); - } - free (featureList); -} - -static void -otfLoadLookupRecord (FILE *fp, LookupRecordPtr lookupRecord, ULONG offset, MakeLookupFunc makeLookup) -{ - int i; - USHORT lookupType; - USHORT *lOffset; - - xfseek (fp, offset, SEEK_SET, "otfLoadLookupRecord"); - - lookupType = ttfGetUSHORT (fp); - lookupRecord->lookupFlag = ttfGetUSHORT (fp); - lookupRecord->subTableCount = ttfGetUSHORT (fp); - lookupRecord->lookup = XCALLOC (lookupRecord->subTableCount, LookupPtr); - lOffset = ttfMakeUSHORT (lookupRecord->subTableCount, fp); - if (lookupRecord->lookupFlag & lookupFlag_UseMarkFilteringSet) - lookupRecord->markFilteringSet = ttfGetUSHORT (fp); - for (i = 0; i < lookupRecord->subTableCount; i++) - lookupRecord->lookup[i] = (*makeLookup) (fp, lookupType, offset + lOffset[i]); - free (lOffset); -} - -LookupListPtr -otfMakeLookupList (FILE *fp, ULONG offset, MakeLookupFunc makeLookup) -{ - int i; - USHORT *lOffset; - LookupListPtr lookupList = XCALLOC1 (LookupList); - - xfseek (fp, offset, SEEK_SET, "otfMakeLookupList"); - - lookupList->lookupCount = ttfGetUSHORT (fp); - if (lookupList->lookupCount) { - lookupList->lookupRecord = XCALLOC (lookupList->lookupCount, LookupRecord); - lOffset = ttfMakeUSHORT (lookupList->lookupCount, fp); - - for (i = 0; i < lookupList->lookupCount; i++) - otfLoadLookupRecord (fp, &lookupList->lookupRecord[i], offset + lOffset[i], makeLookup); - - free (lOffset); - } - - return lookupList; -} - -void -otfPrintLookupList (FILE *fp, LookupListPtr lookupList, PrintLookupFunc printLookup) -{ - int i; - - fprintf (fp, " lookupCount: %d\n", lookupList->lookupCount); - - for (i = 0; i < lookupList->lookupCount; i++) { - int j; - - fprintf (fp, " %2d. lookupType: %d, lookupFlag: 0x%04x", i, - lookupList->lookupRecord[i].lookup[0].otf->lookupType, - lookupList->lookupRecord[i].lookupFlag); - if (lookupList->lookupRecord[i].lookupFlag & lookupFlag_UseMarkFilteringSet) - fprintf (fp, ", markFilteringSet: %d", lookupList->lookupRecord[i].markFilteringSet); - fprintf (fp, "\n\tsubTableCount:\t%d\n", lookupList->lookupRecord[i].subTableCount); - for (j = 0; j < lookupList->lookupRecord[i].subTableCount; j++) { - fprintf (fp, " %2d. lookupFormat: %d", j, - lookupList->lookupRecord[i].lookup[j].otf->lookupFormat); - (*printLookup) (fp, lookupList->lookupRecord[i].lookup[j]); - } - } - fprintf (fp, "\n"); -} - -void -otfFreeLookupList (LookupListPtr lookupList, FreeLookupFunc freeLookup) -{ - int i; - - if (lookupList->lookupCount) { - for (i = 0; i < lookupList->lookupCount; i++) { - int j; - - for (j = 0; j < lookupList->lookupRecord[i].subTableCount; j++) { - (*freeLookup) (lookupList->lookupRecord[i].lookup[j]); - free (lookupList->lookupRecord[i].lookup[j].otf); - } - free (lookupList->lookupRecord[i].lookup); - } - free (lookupList->lookupRecord); - } - free (lookupList); -} - -CoveragePtr -otfMakeCoverage (FILE *fp, ULONG offset) -{ - CoveragePtr coverage; - int i; - USHORT format; - - xfseek (fp, offset, SEEK_SET, "otfMakeCoverage"); - - format = ttfGetUSHORT (fp); - switch (format) - { - case 1: - coverage.coverage1 = XCALLOC1 (Coverage1); - coverage.coverage1->glyphCount = ttfGetUSHORT (fp); - coverage.coverage1->glyphArray = ttfMakeUSHORT (coverage.coverage1->glyphCount, fp); - break; - case 2: - coverage.coverage2 = XCALLOC1 (Coverage2); - coverage.coverage2->rangeCount = ttfGetUSHORT (fp); - coverage.coverage2->rangeRecord = XTALLOC (coverage.coverage2->rangeCount, RangeRecord); - for (i = 0; i < coverage.coverage2->rangeCount; i++) { - coverage.coverage2->rangeRecord[i].start = ttfGetUSHORT (fp); - coverage.coverage2->rangeRecord[i].end = ttfGetUSHORT (fp); - coverage.coverage2->rangeRecord[i].startCoverageIndex = ttfGetUSHORT (fp); - } - break; - default: - ttfError ("Unrecognized coverageFormat\n"); - } - - *coverage.format = format; - return coverage; -} - -void -otfPrintCoverage (FILE *fp, CoveragePtr coverage) -{ - int i; - - fprintf (fp, "Coverage - "); - switch (*coverage.format) - { - case 1: - fprintf (fp, "glyphCount: %d\n\t\t glyphArray: %d", - coverage.coverage1->glyphCount, coverage.coverage1->glyphArray[0]); - for (i = 1; i < coverage.coverage1->glyphCount; i++) - fprintf (fp, i % 8 ? ", %d" : ",\n\t\t\t %d", - coverage.coverage1->glyphArray[i]); - fprintf (fp, "\n"); - break; - case 2: - fprintf (fp, "rangeCount: %d\n", coverage.coverage2->rangeCount); - for (i = 0; i < coverage.coverage2->rangeCount; i++) { - fprintf (fp, "\t %2d. start: %d, end: %d, startCoverageIndex: %d\n", i, - coverage.coverage2->rangeRecord[i].start, - coverage.coverage2->rangeRecord[i].end, - coverage.coverage2->rangeRecord[i].startCoverageIndex); - } - break; - default: - ttfError ("Internal error: otfPrintCoverage\n"); - } -} - -void -otfFreeCoverage (CoveragePtr coverage) -{ - switch (*coverage.format) - { - case 1: - free (coverage.coverage1->glyphArray); - break; - case 2: - free (coverage.coverage2->rangeRecord); - break; - default: - ttfError ("Internal error: otfFreeCoverage\n"); - } - free (coverage.format); -} - -ClassDefPtr -otfMakeClassDef (FILE *fp, ULONG offset) -{ - ClassDefPtr classDef; - int i; - USHORT format; - - xfseek (fp, offset, SEEK_SET, "otfMakeClassDef"); - - format = ttfGetUSHORT (fp); - switch (format) - { - case 1: - classDef.classDef1 = XCALLOC1 (ClassDef1); - classDef.classDef1->startGlyph = ttfGetUSHORT (fp); - classDef.classDef1->glyphCount = ttfGetUSHORT (fp); - classDef.classDef1->classValueArray = ttfMakeUSHORT (classDef.classDef1->glyphCount, fp); - break; - case 2: - classDef.classDef2 = XCALLOC1 (ClassDef2); - classDef.classDef2->classRangeCount = ttfGetUSHORT (fp); - classDef.classDef2->classRangeRecord = XTALLOC (classDef.classDef2->classRangeCount, ClassRangeRecord); - for (i = 0; i < classDef.classDef2->classRangeCount; i++) { - classDef.classDef2->classRangeRecord[i].start = ttfGetUSHORT (fp); - classDef.classDef2->classRangeRecord[i].end = ttfGetUSHORT (fp); - classDef.classDef2->classRangeRecord[i].classValue = ttfGetUSHORT (fp); - } - break; - default: - ttfError ("Unrecognized classDefFormat\n"); - } - - *classDef.format = format; - return classDef; -} - -void -otfPrintClassDef (FILE *fp, ClassDefPtr classDef) -{ - int i; - - switch (*classDef.format) - { - case 1: - fprintf (fp, "startGlyph: %d, glyphCount: %d\n\t\tclassValueArray ", - classDef.classDef1->startGlyph, classDef.classDef1->glyphCount); - for (i = 0; i < classDef.classDef1->glyphCount; i++) - fprintf (fp, i == 0 ? "- %d" : i % 8 ? ", %d" : ",\n\t\t\t\t %d", - classDef.classDef1->classValueArray[i]); - fprintf (fp, "\n"); - break; - case 2: - fprintf (fp, "classRangeCount: %d\n", classDef.classDef2->classRangeCount); - for (i = 0; i < classDef.classDef2->classRangeCount; i++) - fprintf (fp, "\t\t%2d. start: %d, end: %d, classValue: %d\n", i, - classDef.classDef2->classRangeRecord[i].start, - classDef.classDef2->classRangeRecord[i].end, - classDef.classDef2->classRangeRecord[i].classValue); - break; - default: - ttfError ("Internal error: otfPrintClassDef\n"); - } -} - -void -otfFreeClassDef (ClassDefPtr classDef) -{ - switch (*classDef.format) - { - case 1: - free (classDef.classDef1->classValueArray); - break; - case 2: - free (classDef.classDef2->classRangeRecord); - break; - default: - ttfError ("Internal error: otfFreeClassDef\n"); - } - free (classDef.format); -} - -DevicePtr -otfMakeDevice (FILE *fp, ULONG offset) -{ - size_t num; - DevicePtr device; - USHORT startSize, endSize, deltaFormat; - - xfseek (fp, offset, SEEK_SET, "otfMakeDevice"); - - startSize = ttfGetUSHORT (fp); - endSize = ttfGetUSHORT (fp); - deltaFormat = ttfGetUSHORT (fp); - if (deltaFormat < 1 || deltaFormat > 3) - ttfError ("Unrecognized deltaFormat\n"); - num = (endSize - startSize) >> (4 - deltaFormat); - device = (DevicePtr) xcalloc (1, sizeof (Device) + num * sizeof (USHORT)); - device->startSize = startSize; - device->endSize = endSize; - device->deltaFormat = deltaFormat; - ttfReadUSHORT (device->deltaValue, num + 1, fp); - - return device; -} - -void -otfPrintDevice (FILE *fp, DevicePtr device) -{ - int i; - size_t num = (device->endSize - device->startSize) >> (4 - device->deltaFormat); - - fprintf (fp, "startSize = %d, endSize = %d, deltaFormat = %d, deltaValue = 0x", - device->startSize, device->endSize, device->deltaFormat); - for (i = 0; i < num; i++) - fprintf (fp, "%04x", device->deltaValue[i]); - fprintf (fp, "%04x\n", device->deltaValue[num]); -} - -static OtfLookupRecordPtr -makeOtfLookupRecord (USHORT otfCount, FILE *fp) -{ - int i; - OtfLookupRecordPtr otf = XCALLOC (otfCount, OtfLookupRecord); - - for (i = 0; i < otfCount; i++) { - otf[i].sequenceIndex = ttfGetUSHORT (fp); - otf[i].lookupListIndex = ttfGetUSHORT (fp); - } - return otf; -} - -static void -printOtfLookupRecord (FILE * fp, const char *str, USHORT otfCount, OtfLookupRecordPtr otf) -{ - int i; - - fprintf (fp, "\t%sotfCount: %d\n", str, otfCount); - for (i = 0; i < otfCount; i++) - fprintf (fp, "\t%s%2d. sequenceIndex: %d, lookupListIndex: %d\n", - str, i, otf[i].sequenceIndex, otf[i].lookupListIndex); -} - -static void loadOtfRule (OtfRulePtr otfRule, FILE *fp, ULONG offset) -{ - xfseek (fp, offset, SEEK_SET, "loadOtfRule"); - - otfRule->glyphCount = ttfGetUSHORT (fp); - otfRule->otfCount = ttfGetUSHORT (fp); - otfRule->input = ttfMakeUSHORT (otfRule->glyphCount - 1, fp); - otfRule->otf = makeOtfLookupRecord (otfRule->otfCount, fp); -} - -static void loadOtfRuleSet (OtfRuleSetPtr otfRuleSet, FILE *fp, ULONG offset) -{ - int i; - USHORT *rOffset; - - xfseek (fp, offset, SEEK_SET, "loadOtfRuleSet"); - - otfRuleSet->otfRuleCount = ttfGetUSHORT (fp); - rOffset = ttfMakeUSHORT (otfRuleSet->otfRuleCount, fp); - otfRuleSet->otfRule = XCALLOC (otfRuleSet->otfRuleCount, OtfRule); - for (i = 0; i < otfRuleSet->otfRuleCount; i++) - loadOtfRule (&otfRuleSet->otfRule[i], fp, offset + rOffset[i]); - free (rOffset); -} - -OtfCtx1Ptr makeOTFCtx1 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset; - USHORT *rOffset; - OtfCtx1Ptr otf = XCALLOC1 (OtfCtx1); - - cOffset = ttfGetUSHORT (fp); - otf->otfRuleSetCount = ttfGetUSHORT (fp); - rOffset = ttfMakeUSHORT (otf->otfRuleSetCount, fp); - otf->otfRuleSet = XCALLOC (otf->otfRuleSetCount, OtfRuleSet); - otf->coverage = otfMakeCoverage (fp, offset + cOffset); - for (i = 0; i < otf->otfRuleSetCount; i++) - loadOtfRuleSet (&otf->otfRuleSet[i], fp, offset + rOffset[i]); - free (rOffset); - - return otf; -} - -void printOTFCtx1 (FILE *fp, OtfCtx1Ptr otf) -{ - int i; - - fprintf (fp, " - Context %s Simple\n\t ", - otf->lookupType == 7 ? "Positioning" : "Substitution"); - otfPrintCoverage (fp, otf->coverage); - fprintf (fp, "\t otfRuleSetCount: %d\n", otf->otfRuleSetCount); - for (i = 0; i < otf->otfRuleSetCount; i++) { - int j; - - fprintf (fp, "\t %2d. otfRuleCount: %d\n", i, otf->otfRuleSet[i].otfRuleCount); - for (j = 0; j < otf->otfRuleSet[i].otfRuleCount; j++) { - int k; - - fprintf (fp, "\t %2d. glyphCount: %d ", j, - otf->otfRuleSet[i].otfRule[j].glyphCount); - for (k = 0; k < otf->otfRuleSet[i].otfRule[j].glyphCount - 1; k++) - fprintf (fp, k == 0 ? "- %d" : ", %d", otf->otfRuleSet[i].otfRule[j].input[k]); - fprintf (fp, "\n"); - printOtfLookupRecord (fp, " ", - otf->otfRuleSet[i].otfRule[j].otfCount, - otf->otfRuleSet[i].otfRule[j].otf); - } - } -} - -void freeOTFCtx1 (OtfCtx1Ptr otf) -{ - int i; - - otfFreeCoverage (otf->coverage); - for (i = 0; i < otf->otfRuleSetCount; i++) { - int j; - - for (j = 0; j < otf->otfRuleSet[i].otfRuleCount; j++) { - free (otf->otfRuleSet[i].otfRule[j].input); - free (otf->otfRuleSet[i].otfRule[j].otf); - } - free (otf->otfRuleSet[i].otfRule); - } - free (otf->otfRuleSet); -} - -static void loadOtfClassRule (OtfClassRulePtr otfClassRule, FILE *fp, ULONG offset) -{ - xfseek (fp, offset, SEEK_SET, "loadOtfClassRule"); - - otfClassRule->glyphCount = ttfGetUSHORT (fp); - otfClassRule->otfCount = ttfGetUSHORT (fp); - otfClassRule->class = ttfMakeUSHORT (otfClassRule->glyphCount - 1, fp); - otfClassRule->otf = makeOtfLookupRecord (otfClassRule->otfCount, fp); -} - -static void loadOtfClassSet (OtfClassSetPtr otfClassSet, FILE *fp, ULONG offset) -{ - int i; - USHORT *sOffset; - - xfseek (fp, offset, SEEK_SET, "loadOtfClassSet"); - - otfClassSet->otfClassRuleCnt = ttfGetUSHORT (fp); - sOffset = ttfMakeUSHORT (otfClassSet->otfClassRuleCnt, fp); - otfClassSet->otfClassRule = XCALLOC (otfClassSet->otfClassRuleCnt, OtfClassRule); - for (i = 0; i < otfClassSet->otfClassRuleCnt; i++) - loadOtfClassRule (&otfClassSet->otfClassRule[i], fp, offset + sOffset[i]); - free (sOffset); -} - -OtfCtx2Ptr makeOTFCtx2 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset; - USHORT clOffset; - USHORT *sOffset; - OtfCtx2Ptr otf = XCALLOC1 (OtfCtx2); - - cOffset = ttfGetUSHORT (fp); - clOffset = ttfGetUSHORT (fp); - otf->otfClassSetCnt = ttfGetUSHORT (fp); - sOffset = ttfMakeUSHORT (otf->otfClassSetCnt, fp); - otf->otfClassSet = XCALLOC (otf->otfClassSetCnt, OtfClassSet); - otf->coverage = otfMakeCoverage (fp, offset + cOffset); - otf->classDef = otfMakeClassDef (fp, offset + clOffset); - for (i = 0; i < otf->otfClassSetCnt; i++) - if (sOffset[i]) - loadOtfClassSet (&otf->otfClassSet[i], fp, offset + sOffset[i]); - free (sOffset); - - return otf; -} - -void printOTFCtx2 (FILE *fp, OtfCtx2Ptr otf) -{ - int i; - - fprintf (fp, " - Context %s Class-based\n\t ", - otf->lookupType == 7 ? "Positioning" : "Substitution"); - otfPrintCoverage (fp, otf->coverage); - fprintf (fp, "\t ClassDef - "); - otfPrintClassDef (fp, otf->classDef); - fprintf (fp, "\t otfClassSetCnt: %d\n", otf->otfClassSetCnt); - for (i = 0; i < otf->otfClassSetCnt; i++) { - int j; - - fprintf (fp, "\t %2d. otfClassRuleCnt: %d\n", i, otf->otfClassSet[i].otfClassRuleCnt); - for (j = 0; j < otf->otfClassSet[i].otfClassRuleCnt; j++) { - int k; - - fprintf (fp, "\t %2d. glyphCount: %d ", j, - otf->otfClassSet[i].otfClassRule[j].glyphCount); - for (k = 0; k < otf->otfClassSet[i].otfClassRule[j].glyphCount - 1; k++) - fprintf (fp, k == 0 ? "- %d" : ", %d", otf->otfClassSet[i].otfClassRule[j].class[k]); - fprintf (fp, "\n"); - printOtfLookupRecord (fp, " ", - otf->otfClassSet[i].otfClassRule[j].otfCount, - otf->otfClassSet[i].otfClassRule[j].otf); - } - } -} - -void freeOTFCtx2 (OtfCtx2Ptr otf) -{ - int i; - - otfFreeCoverage (otf->coverage); - otfFreeClassDef (otf->classDef); - for (i = 0; i < otf->otfClassSetCnt; i++) { - int j; - - for (j = 0; j < otf->otfClassSet[i].otfClassRuleCnt; j++) { - free (otf->otfClassSet[i].otfClassRule[j].class); - free (otf->otfClassSet[i].otfClassRule[j].otf); - } - free (otf->otfClassSet[i].otfClassRule); - } - free (otf->otfClassSet); -} - -OtfCtx3Ptr makeOTFCtx3 (FILE *fp, ULONG offset) -{ - int i; - USHORT *gOffset; - OtfCtx3Ptr otf = XCALLOC1 (OtfCtx3); - - otf->glyphCount = ttfGetUSHORT (fp); - otf->otfCount = ttfGetUSHORT (fp); - gOffset = ttfMakeUSHORT (otf->glyphCount, fp); - otf->otf = makeOtfLookupRecord (otf->otfCount, fp); - otf->glyphs = XCALLOC (otf->glyphCount, CoveragePtr); - for (i = 0; i < otf->glyphCount; i++) - otf->glyphs[i] = otfMakeCoverage (fp, offset + gOffset[i]); - free (gOffset); - - return otf; -} - -void printOTFCtx3 (FILE *fp, OtfCtx3Ptr otf) -{ - int i; - - fprintf (fp, " - Context %s Coverage-based\n", - otf->lookupType == 7 ? "Positioning" : "Substitution"); - fprintf (fp, "\t glyphCount: %d\n", otf->glyphCount); - for (i = 0; i < otf->glyphCount; i++) { - fprintf (fp, "\t %2d. ", i); - otfPrintCoverage (fp, otf->glyphs[i]); - } - printOtfLookupRecord (fp, " ", otf->otfCount, otf->otf); -} - -void freeOTFCtx3 (OtfCtx3Ptr otf) -{ - int i; - - for (i = 0; i < otf->glyphCount; i++) - otfFreeCoverage (otf->glyphs[i]); - free (otf->glyphs); - free (otf->otf); -} - -static void -loadChainOtfRule (ChainOtfRulePtr chainOtfRule, FILE *fp, ULONG offset) -{ - xfseek (fp, offset, SEEK_SET, "loadChainOtfRule"); - - chainOtfRule->backtrackGlyphCount = ttfGetUSHORT (fp); - chainOtfRule->backtrack = ttfMakeUSHORT (chainOtfRule->backtrackGlyphCount, fp); - chainOtfRule->inputGlyphCount = ttfGetUSHORT (fp); - chainOtfRule->input = ttfMakeUSHORT (chainOtfRule->inputGlyphCount - 1, fp); - chainOtfRule->lookaheadGlyphCount = ttfGetUSHORT (fp); - chainOtfRule->lookahead = ttfMakeUSHORT (chainOtfRule->lookaheadGlyphCount, fp); - chainOtfRule->otfCount = ttfGetUSHORT (fp); - chainOtfRule->otf = makeOtfLookupRecord (chainOtfRule->otfCount, fp); -} - -static void -loadChainOtfRuleSet (ChainOtfRuleSetPtr chainOtfRuleSet, FILE *fp, ULONG offset) -{ - int i; - USHORT *rOffset; - - xfseek (fp, offset, SEEK_SET, "loadChainOtfRuleSet"); - - chainOtfRuleSet->chainOtfRuleCount = ttfGetUSHORT (fp); - rOffset = ttfMakeUSHORT (chainOtfRuleSet->chainOtfRuleCount, fp); - chainOtfRuleSet->chainOtfRule = XCALLOC (chainOtfRuleSet->chainOtfRuleCount, ChainOtfRule); - for (i = 0; i < chainOtfRuleSet->chainOtfRuleCount; i++) - loadChainOtfRule (&chainOtfRuleSet->chainOtfRule[i], fp, offset + rOffset[i]); - free (rOffset); -} - -OtfChn1Ptr makeOTFChn1 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset; - USHORT *rOffset; - OtfChn1Ptr otf = XCALLOC1 (OtfChn1); - - cOffset = ttfGetUSHORT (fp); - otf->chainOtfRuleSetCount = ttfGetUSHORT (fp); - rOffset = ttfMakeUSHORT (otf->chainOtfRuleSetCount, fp); - otf->coverage = otfMakeCoverage (fp, offset + cOffset); - otf->chainOtfRuleSet = XCALLOC (otf->chainOtfRuleSetCount, ChainOtfRuleSet); - for (i = 0; i < otf->chainOtfRuleSetCount; i++) - loadChainOtfRuleSet (&otf->chainOtfRuleSet[i], fp, offset + rOffset[i]); - free (rOffset); - - return otf; -} - -void printOTFChn1 (FILE *fp, OtfChn1Ptr otf) -{ - int i; - - fprintf (fp, " - Chained Context %s Simple\n\t ", - otf->lookupType == 8 ? "Positioning" : "Substitution"); - otfPrintCoverage (fp, otf->coverage); - fprintf (fp, "\t chainOtfRuleSetCount: %d\n", otf->chainOtfRuleSetCount); - for (i = 0; i < otf->chainOtfRuleSetCount; i++) { - int j; - - fprintf (fp, "\t %2d. chainOtfRuleCount: %d\n", i, - otf->chainOtfRuleSet[i].chainOtfRuleCount); - for (j = 0; j < otf->chainOtfRuleSet[i].chainOtfRuleCount; j++) { - int k; - - fprintf (fp, "\t %2d. backtrackGlyphCount: %d ", j, - otf->chainOtfRuleSet[i].chainOtfRule[j].backtrackGlyphCount); - for (k = 0; k < otf->chainOtfRuleSet[i].chainOtfRule[j].backtrackGlyphCount; k++) - fprintf (fp, k == 0 ? "- %d" : ", %d", otf->chainOtfRuleSet[i].chainOtfRule[j].backtrack[k]); - fprintf (fp, "\n\t\tinputGlyphCount: %d ", - otf->chainOtfRuleSet[i].chainOtfRule[j].inputGlyphCount); - for (k = 0; k < otf->chainOtfRuleSet[i].chainOtfRule[j].inputGlyphCount; k++) - fprintf (fp, k == 0 ? "- %d" : ", %d", otf->chainOtfRuleSet[i].chainOtfRule[j].input[k]); - fprintf (fp, "\n\t\tlookaheadGlyphCount: %d ", - otf->chainOtfRuleSet[i].chainOtfRule[j].lookaheadGlyphCount); - for (k = 0; k < otf->chainOtfRuleSet[i].chainOtfRule[j].lookaheadGlyphCount; k++) - fprintf (fp, k == 0 ? "- %d" : ", %d", otf->chainOtfRuleSet[i].chainOtfRule[j].lookahead[k]); - fprintf (fp, "\n"); - printOtfLookupRecord (fp, " ", - otf->chainOtfRuleSet[i].chainOtfRule[j].otfCount, - otf->chainOtfRuleSet[i].chainOtfRule[j].otf); - } - } -} - -void freeOTFChn1 (OtfChn1Ptr otf) -{ - int i; - - otfFreeCoverage (otf->coverage); - for (i = 0; i < otf->chainOtfRuleSetCount; i++) { - int j; - - for (j = 0; j < otf->chainOtfRuleSet[i].chainOtfRuleCount; j++) { - free (otf->chainOtfRuleSet[i].chainOtfRule[j].backtrack); - free (otf->chainOtfRuleSet[i].chainOtfRule[j].input); - free (otf->chainOtfRuleSet[i].chainOtfRule[j].lookahead); - free (otf->chainOtfRuleSet[i].chainOtfRule[j].otf); - } - free (otf->chainOtfRuleSet[i].chainOtfRule); - } - free (otf->chainOtfRuleSet); -} - -static void -loadChainOtfClassRule (ChainOtfClassRulePtr chainOtfClassRule, FILE *fp, ULONG offset) -{ - xfseek (fp, offset, SEEK_SET, "loadChainOtfClassRule"); - - chainOtfClassRule->backtrackGlyphCount = ttfGetUSHORT (fp); - chainOtfClassRule->backtrack = ttfMakeUSHORT (chainOtfClassRule->backtrackGlyphCount, fp); - chainOtfClassRule->inputGlyphCount = ttfGetUSHORT (fp); - chainOtfClassRule->input = ttfMakeUSHORT (chainOtfClassRule->inputGlyphCount - 1, fp); - chainOtfClassRule->lookaheadGlyphCount = ttfGetUSHORT (fp); - chainOtfClassRule->lookahead = ttfMakeUSHORT (chainOtfClassRule->lookaheadGlyphCount, fp); - chainOtfClassRule->otfCount = ttfGetUSHORT (fp); - chainOtfClassRule->otf = makeOtfLookupRecord (chainOtfClassRule->otfCount, fp); -} - -static void -loadChainOtfClassSet (ChainOtfClassSetPtr chainOtfClassSet, FILE *fp, ULONG offset) -{ - int i; - USHORT *rOffset; - - xfseek (fp, offset, SEEK_SET, "loadChainOtfClassSet"); - - chainOtfClassSet->chainOtfClassRuleCnt = ttfGetUSHORT (fp); - rOffset = ttfMakeUSHORT (chainOtfClassSet->chainOtfClassRuleCnt, fp); - chainOtfClassSet->chainOtfClassRule = XCALLOC (chainOtfClassSet->chainOtfClassRuleCnt, ChainOtfClassRule); - for (i = 0; i < chainOtfClassSet->chainOtfClassRuleCnt; i++) - loadChainOtfClassRule (&chainOtfClassSet->chainOtfClassRule[i], fp, offset + rOffset[i]); - free (rOffset); -} - -OtfChn2Ptr makeOTFChn2 (FILE *fp, ULONG offset) -{ - int i; - USHORT cOffset; - USHORT bOffset, iOffset, lOffset; - USHORT *sOffset; - OtfChn2Ptr otf = XCALLOC1 (OtfChn2); - - cOffset = ttfGetUSHORT (fp); - bOffset = ttfGetUSHORT (fp); - iOffset = ttfGetUSHORT (fp); - lOffset = ttfGetUSHORT (fp); - otf->chainOtfClassSetCnt = ttfGetUSHORT (fp); - sOffset = ttfMakeUSHORT (otf->chainOtfClassSetCnt, fp); - otf->coverage = otfMakeCoverage (fp, offset + cOffset); - otf->backtrackClassDef = otfMakeClassDef (fp, offset + bOffset); - otf->inputClassDef = otfMakeClassDef (fp, offset + iOffset); - otf->lookaheadClassDef = otfMakeClassDef (fp, offset + lOffset); - otf->chainOtfClassSet = XCALLOC (otf->chainOtfClassSetCnt, ChainOtfClassSet); - for (i = 0; i < otf->chainOtfClassSetCnt; i++) - if (sOffset[i]) - loadChainOtfClassSet (&otf->chainOtfClassSet[i], fp, offset + sOffset[i]); - free (sOffset); - - return otf; -} - -void printOTFChn2 (FILE *fp, OtfChn2Ptr otf) -{ - int i; - - fprintf (fp, " - Chained Context %s Class-based\n\t ", - otf->lookupType == 8 ? "Positioning" : "Substitution"); - otfPrintCoverage (fp, otf->coverage); - fprintf (fp, "\t backtrackClassDef - "); - otfPrintClassDef (fp, otf->backtrackClassDef); - fprintf (fp, "\t inputClassDef - "); - otfPrintClassDef (fp, otf->inputClassDef); - fprintf (fp, "\t lookaheadClassDef - "); - otfPrintClassDef (fp, otf->lookaheadClassDef); - fprintf (fp, "\t chainOtfClassSetCnt: %d\n", otf->chainOtfClassSetCnt); - for (i = 0; i < otf->chainOtfClassSetCnt; i++) { - int j; - - fprintf (fp, "\t %2d. chainOtfClassRuleCnt: %d\n", i, - otf->chainOtfClassSet[i].chainOtfClassRuleCnt); - for (j = 0; j < otf->chainOtfClassSet[i].chainOtfClassRuleCnt; j++) { - int k; - - fprintf (fp, "\t %2d. backtrackGlyphCount: %2d ", j, - otf->chainOtfClassSet[i].chainOtfClassRule[j].backtrackGlyphCount); - for (k = 0; k < otf->chainOtfClassSet[i].chainOtfClassRule[j].backtrackGlyphCount; k++) - fprintf (fp, k == 0 ? "- %d" : k % 8 ? ", %d" : ",\n\t\t\t\t\t %d", - otf->chainOtfClassSet[i].chainOtfClassRule[j].backtrack[k]); - fprintf (fp, "\n\t\tinputGlyphCount: %2d ", - otf->chainOtfClassSet[i].chainOtfClassRule[j].inputGlyphCount); - for (k = 0; k < otf->chainOtfClassSet[i].chainOtfClassRule[j].inputGlyphCount; k++) - fprintf (fp, k == 0 ? "- %d" : k % 8 ? ", %d" : ",\n\t\t\t\t %d", - otf->chainOtfClassSet[i].chainOtfClassRule[j].input[k]); - fprintf (fp, "\n\t\tlookaheadGlyphCount: %2d ", - otf->chainOtfClassSet[i].chainOtfClassRule[j].lookaheadGlyphCount); - for (k = 0; k < otf->chainOtfClassSet[i].chainOtfClassRule[j].lookaheadGlyphCount; k++) - fprintf (fp, k == 0 ? "- %d" : k % 8 ? ", %d" : ",\n\t\t\t\t\t %d", - otf->chainOtfClassSet[i].chainOtfClassRule[j].lookahead[k]); - fprintf (fp, "\n"); - printOtfLookupRecord (fp, " ", - otf->chainOtfClassSet[i].chainOtfClassRule[j].otfCount, - otf->chainOtfClassSet[i].chainOtfClassRule[j].otf); - } - } -} - -void freeOTFChn2 (OtfChn2Ptr otf) -{ - int i; - - otfFreeCoverage (otf->coverage); - otfFreeClassDef (otf->backtrackClassDef); - otfFreeClassDef (otf->inputClassDef); - otfFreeClassDef (otf->lookaheadClassDef); - for (i = 0; i < otf->chainOtfClassSetCnt; i++) { - int j; - - for (j = 0; j < otf->chainOtfClassSet[i].chainOtfClassRuleCnt; j++) { - free (otf->chainOtfClassSet[i].chainOtfClassRule[j].backtrack); - free (otf->chainOtfClassSet[i].chainOtfClassRule[j].input); - free (otf->chainOtfClassSet[i].chainOtfClassRule[j].lookahead); - free (otf->chainOtfClassSet[i].chainOtfClassRule[j].otf); - } - free (otf->chainOtfClassSet[i].chainOtfClassRule); - } - free (otf->chainOtfClassSet); -} - -OtfChn3Ptr makeOTFChn3 (FILE *fp, ULONG offset) -{ - int i; - USHORT *bOffset, *iOffset, *lOffset; - OtfChn3Ptr otf = XCALLOC1 (OtfChn3); - - otf->backtrackGlyphCount = ttfGetUSHORT (fp); - bOffset = ttfMakeUSHORT (otf->backtrackGlyphCount, fp); - otf->inputGlyphCount = ttfGetUSHORT (fp); - iOffset = ttfMakeUSHORT (otf->inputGlyphCount, fp); - otf->lookaheadGlyphCount = ttfGetUSHORT (fp); - lOffset = ttfMakeUSHORT (otf->lookaheadGlyphCount, fp); - otf->otfCount = ttfGetUSHORT (fp); - otf->otf = makeOtfLookupRecord (otf->otfCount, fp); - otf->backtrack = XCALLOC (otf->backtrackGlyphCount, CoveragePtr); - for (i = 0; i < otf->backtrackGlyphCount; i++) - otf->backtrack[i] = otfMakeCoverage (fp, offset + bOffset[i]); - free (bOffset); - otf->input = XCALLOC (otf->inputGlyphCount, CoveragePtr); - for (i = 0; i < otf->inputGlyphCount; i++) - otf->input[i] = otfMakeCoverage (fp, offset + iOffset[i]); - free (iOffset); - otf->lookahead = XCALLOC (otf->lookaheadGlyphCount, CoveragePtr); - for (i = 0; i < otf->lookaheadGlyphCount; i++) - otf->lookahead[i] = otfMakeCoverage (fp, offset + lOffset[i]); - free (lOffset); - - return otf; -} - -void printOTFChn3 (FILE *fp, OtfChn3Ptr otf) -{ - int i; - - fprintf (fp, " - Chained Context %s Coverage-based\n", - otf->lookupType == 8 ? "Positioning" : "Substitution"); - fprintf (fp, "\t backtrackGlyphCount: %d\n", otf->backtrackGlyphCount); - for (i = 0; i < otf->backtrackGlyphCount; i++) { - fprintf (fp, "\t %2d. backtrack", i); - otfPrintCoverage (fp, otf->backtrack[i]); - } - fprintf (fp, "\t inputGlyphCount: %d\n", otf->inputGlyphCount); - for (i = 0; i < otf->inputGlyphCount; i++) { - fprintf (fp, "\t %2d. input", i); - otfPrintCoverage (fp, otf->input[i]); - } - fprintf (fp, "\t lookaheadGlyphCount: %d\n", otf->lookaheadGlyphCount); - for (i = 0; i < otf->lookaheadGlyphCount; i++) { - fprintf (fp, "\t %2d. lookahead", i); - otfPrintCoverage (fp, otf->lookahead[i]); - } - printOtfLookupRecord (fp, " ", otf->otfCount, otf->otf); -} - -void freeOTFChn3 (OtfChn3Ptr otf) -{ - int i; - - for (i = 0; i < otf->backtrackGlyphCount; i++) - otfFreeCoverage (otf->backtrack[i]); - free (otf->backtrack); - for (i = 0; i < otf->inputGlyphCount; i++) - otfFreeCoverage (otf->input[i]); - free (otf->input); - for (i = 0; i < otf->lookaheadGlyphCount; i++) - otfFreeCoverage (otf->lookahead[i]); - free (otf->lookahead); - free (otf->otf); -} - |