diff options
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/table/head.c')
-rw-r--r-- | Build/source/texk/web2c/mfluadir/otfcc/lib/table/head.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/table/head.c b/Build/source/texk/web2c/mfluadir/otfcc/lib/table/head.c new file mode 100644 index 00000000000..e5478aab4ec --- /dev/null +++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/table/head.c @@ -0,0 +1,137 @@ +#include "head.h" + +#include "support/util.h" + +static INLINE void initHead(table_head *head) { + memset(head, 0, sizeof(*head)); + head->magicNumber = 0x5f0f3cf5; + head->unitsPerEm = 1000; +} +static INLINE void disposeHead(table_head *head) { + // trivial +} +caryll_standardRefType(table_head, table_iHead, initHead, disposeHead); + +table_head *otfcc_readHead(const otfcc_Packet packet, const otfcc_Options *options) { + FOR_TABLE(OTFCC_CHR('h','e','a','d'), table) { + font_file_pointer data = table.data; + uint32_t length = table.length; + + if (length < 54) { + logWarning("table 'head' corrupted.\n"); + } else { + table_head *head; + NEW(head); + head->version = read_32s(data); + head->fontRevision = read_32u(data + 4); + head->checkSumAdjustment = read_32u(data + 8); + head->magicNumber = read_32u(data + 12); + head->flags = read_16u(data + 16); + head->unitsPerEm = read_16u(data + 18); + head->created = read_64u(data + 20); + head->modified = read_64u(data + 28); + head->xMin = read_16u(data + 36); + head->yMin = read_16u(data + 38); + head->xMax = read_16u(data + 40); + head->yMax = read_16u(data + 42); + head->macStyle = read_16u(data + 44); + head->lowestRecPPEM = read_16u(data + 46); + head->fontDirectoryHint = read_16u(data + 48); + head->indexToLocFormat = read_16u(data + 50); + head->glyphDataFormat = read_16u(data + 52); + return head; + } + } + return NULL; +} + +static const char *headFlagsLabels[] = {"baselineAtY_0", + "lsbAtX_0", + "instrMayDependOnPointSize", + "alwaysUseIntegerSize", + "instrMayAlterAdvanceWidth", + "designedForVertical", + "_reserved1", + "designedForComplexScript", + "hasMetamorphosisEffects", + "containsStrongRTL", + "containsIndicRearrangement", + "fontIsLossless", + "fontIsConverted", + "optimizedForCleartype", + "lastResortFont", + NULL}; +static const char *macStyleLabels[] = {"bold", "italic", "underline", "outline", + "shadow", "condensed", "extended", NULL}; + +void otfcc_dumpHead(const table_head *table, json_value *root, const otfcc_Options *options) { + if (!table) return; + loggedStep("head") { + json_value *head = json_object_new(15); + json_object_push(head, "version", json_double_new(otfcc_from_fixed(table->version))); + json_object_push(head, "fontRevision", + json_double_new(otfcc_from_fixed(table->fontRevision))); + json_object_push(head, "flags", otfcc_dump_flags(table->flags, headFlagsLabels)); + json_object_push(head, "unitsPerEm", json_integer_new(table->unitsPerEm)); + json_object_push(head, "created", json_integer_new(table->created)); + json_object_push(head, "modified", json_integer_new(table->modified)); + json_object_push(head, "xMin", json_integer_new(table->xMin)); + json_object_push(head, "xMax", json_integer_new(table->xMax)); + json_object_push(head, "yMin", json_integer_new(table->yMin)); + json_object_push(head, "yMax", json_integer_new(table->yMax)); + json_object_push(head, "macStyle", otfcc_dump_flags(table->macStyle, macStyleLabels)); + json_object_push(head, "lowestRecPPEM", json_integer_new(table->lowestRecPPEM)); + json_object_push(head, "fontDirectoryHint", json_integer_new(table->fontDirectoryHint)); + json_object_push(head, "indexToLocFormat", json_integer_new(table->indexToLocFormat)); + json_object_push(head, "glyphDataFormat", json_integer_new(table->glyphDataFormat)); + json_object_push(root, "head", head); + } +} + +table_head *otfcc_parseHead(const json_value *root, const otfcc_Options *options) { + table_head *head = table_iHead.create(); + json_value *table = NULL; + if ((table = json_obj_get_type(root, "head", json_object))) { + loggedStep("head") { + head->version = otfcc_to_fixed(json_obj_getnum_fallback(table, "version", 0)); + head->fontRevision = otfcc_to_fixed(json_obj_getnum_fallback(table, "fontRevision", 0)); + head->flags = otfcc_parse_flags(json_obj_get(table, "flags"), headFlagsLabels); + head->unitsPerEm = json_obj_getnum_fallback(table, "unitsPerEm", 0); + head->created = json_obj_getnum_fallback(table, "created", 0); + head->modified = json_obj_getnum_fallback(table, "modified", 0); + head->xMin = json_obj_getnum_fallback(table, "xMin", 0); + head->xMax = json_obj_getnum_fallback(table, "xMax", 0); + head->yMin = json_obj_getnum_fallback(table, "yMin", 0); + head->yMax = json_obj_getnum_fallback(table, "yMax", 0); + head->macStyle = otfcc_parse_flags(json_obj_get(table, "macStyle"), macStyleLabels); + head->lowestRecPPEM = json_obj_getnum_fallback(table, "lowestRecPPEM", 0); + head->fontDirectoryHint = json_obj_getnum_fallback(table, "fontDirectoryHint", 0); + head->indexToLocFormat = json_obj_getnum_fallback(table, "indexToLocFormat", 0); + head->glyphDataFormat = json_obj_getnum_fallback(table, "glyphDataFormat", 0); + } + } + return head; +} + +caryll_Buffer *otfcc_buildHead(const table_head *head, const otfcc_Options *options) { + if (!head) return NULL; + caryll_Buffer *buf = bufnew(); + bufwrite32b(buf, head->version); + bufwrite32b(buf, head->fontRevision); + bufwrite32b(buf, head->checkSumAdjustment); + bufwrite32b(buf, head->magicNumber); + bufwrite16b(buf, head->flags); + bufwrite16b(buf, head->unitsPerEm); + bufwrite64b(buf, head->created); + bufwrite64b(buf, head->modified); + bufwrite16b(buf, head->xMin); + bufwrite16b(buf, head->yMin); + bufwrite16b(buf, head->xMax); + bufwrite16b(buf, head->yMax); + bufwrite16b(buf, head->macStyle); + bufwrite16b(buf, head->lowestRecPPEM); + bufwrite16b(buf, head->fontDirectoryHint); + bufwrite16b(buf, head->indexToLocFormat); + bufwrite16b(buf, head->glyphDataFormat); + return buf; +} |