summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/table/hhea.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/table/hhea.c')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/table/hhea.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/table/hhea.c b/Build/source/texk/web2c/mfluadir/otfcc/lib/table/hhea.c
new file mode 100644
index 00000000000..87806448de0
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/table/hhea.c
@@ -0,0 +1,108 @@
+#include "hhea.h"
+
+#include "support/util.h"
+
+static INLINE void initHhea(table_hhea *hhea) {
+ memset(hhea, 0, sizeof(*hhea));
+ hhea->version = 0x10000;
+}
+static INLINE void disposeHhea(MOVE table_hhea *hhea) {
+ // trivial
+}
+caryll_standardRefType(table_hhea, table_iHhea, initHhea, disposeHhea);
+
+table_hhea *otfcc_readHhea(const otfcc_Packet packet, const otfcc_Options *options) {
+ FOR_TABLE(OTFCC_CHR('h','h','e','a'), table) {
+ font_file_pointer data = table.data;
+ uint32_t length = table.length;
+
+ if (length < 36) {
+ logWarning("table 'hhea' corrupted.\n");
+ } else {
+ table_hhea *hhea;
+ NEW(hhea);
+ hhea->version = read_32s(data);
+ hhea->ascender = read_16u(data + 4);
+ hhea->descender = read_16u(data + 6);
+ hhea->lineGap = read_16u(data + 8);
+ hhea->advanceWidthMax = read_16u(data + 10);
+ hhea->minLeftSideBearing = read_16u(data + 12);
+ hhea->minRightSideBearing = read_16u(data + 14);
+ hhea->xMaxExtent = read_16u(data + 16);
+ hhea->caretSlopeRise = read_16u(data + 18);
+ hhea->caretSlopeRun = read_16u(data + 20);
+ hhea->caretOffset = read_16u(data + 22);
+ hhea->reserved[0] = read_16u(data + 24);
+ hhea->reserved[1] = read_16u(data + 26);
+ hhea->reserved[2] = read_16u(data + 28);
+ hhea->reserved[3] = read_16u(data + 30);
+ hhea->metricDataFormat = read_16u(data + 32);
+ hhea->numberOfMetrics = read_16u(data + 34);
+ return hhea;
+ }
+ }
+ return NULL;
+}
+
+void otfcc_dumpHhea(const table_hhea *table, json_value *root, const otfcc_Options *options) {
+ if (!table) return;
+ loggedStep("hhea") {
+ json_value *hhea = json_object_new(13);
+ json_object_push(hhea, "version", json_double_new(otfcc_from_fixed(table->version)));
+ json_object_push(hhea, "ascender", json_integer_new(table->ascender));
+ json_object_push(hhea, "descender", json_integer_new(table->descender));
+ json_object_push(hhea, "lineGap", json_integer_new(table->lineGap));
+ json_object_push(hhea, "advanceWidthMax", json_integer_new(table->advanceWidthMax));
+ json_object_push(hhea, "minLeftSideBearing", json_integer_new(table->minLeftSideBearing));
+ json_object_push(hhea, "minRightSideBearing", json_integer_new(table->minRightSideBearing));
+ json_object_push(hhea, "xMaxExtent", json_integer_new(table->xMaxExtent));
+ json_object_push(hhea, "caretSlopeRise", json_integer_new(table->caretSlopeRise));
+ json_object_push(hhea, "caretSlopeRun", json_integer_new(table->caretSlopeRun));
+ json_object_push(hhea, "caretOffset", json_integer_new(table->caretOffset));
+ json_object_push(root, "hhea", hhea);
+ }
+}
+
+table_hhea *otfcc_parseHhea(const json_value *root, const otfcc_Options *options) {
+ table_hhea *hhea = table_iHhea.create();
+ json_value *table = NULL;
+ if ((table = json_obj_get_type(root, "hhea", json_object))) {
+ loggedStep("hhea") {
+ hhea->version = otfcc_to_fixed(json_obj_getnum_fallback(table, "version", 0));
+ hhea->ascender = json_obj_getnum_fallback(table, "ascender", 0);
+ hhea->descender = json_obj_getnum_fallback(table, "descender", 0);
+ hhea->lineGap = json_obj_getnum_fallback(table, "lineGap", 0);
+ hhea->advanceWidthMax = json_obj_getnum_fallback(table, "advanceWidthMax", 0);
+ hhea->minLeftSideBearing = json_obj_getnum_fallback(table, "minLeftSideBearing", 0);
+ hhea->minRightSideBearing = json_obj_getnum_fallback(table, "minRightSideBearing", 0);
+ hhea->xMaxExtent = json_obj_getnum_fallback(table, "xMaxExtent", 0);
+ hhea->caretSlopeRise = json_obj_getnum_fallback(table, "caretSlopeRise", 0);
+ hhea->caretSlopeRun = json_obj_getnum_fallback(table, "caretSlopeRun", 0);
+ hhea->caretOffset = json_obj_getnum_fallback(table, "caretOffset", 0);
+ }
+ }
+ return hhea;
+}
+
+caryll_Buffer *otfcc_buildHhea(const table_hhea *hhea, const otfcc_Options *options) {
+ if (!hhea) return NULL;
+ caryll_Buffer *buf = bufnew();
+ bufwrite32b(buf, hhea->version);
+ bufwrite16b(buf, hhea->ascender);
+ bufwrite16b(buf, hhea->descender);
+ bufwrite16b(buf, hhea->lineGap);
+ bufwrite16b(buf, hhea->advanceWidthMax);
+ bufwrite16b(buf, hhea->minLeftSideBearing);
+ bufwrite16b(buf, hhea->minRightSideBearing);
+ bufwrite16b(buf, hhea->xMaxExtent);
+ bufwrite16b(buf, hhea->caretSlopeRise);
+ bufwrite16b(buf, hhea->caretSlopeRun);
+ bufwrite16b(buf, hhea->caretOffset);
+ bufwrite16b(buf, hhea->reserved[0]);
+ bufwrite16b(buf, hhea->reserved[1]);
+ bufwrite16b(buf, hhea->reserved[2]);
+ bufwrite16b(buf, hhea->reserved[3]);
+ bufwrite16b(buf, 0);
+ bufwrite16b(buf, hhea->numberOfMetrics);
+ return buf;
+}