summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-writer.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-writer.c')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-writer.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-writer.c b/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-writer.c
new file mode 100644
index 00000000000..759fb0c75f8
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-writer.c
@@ -0,0 +1,60 @@
+/*
+ Compiler of CFF, subset and full conversion
+ * note that there is no optimization in current implement
+*/
+
+#include <math.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libcff.h"
+
+caryll_Buffer *cff_buildHeader(void) {
+ return bufninit(4, 1, 0, 4, 4);
+}
+
+void cff_mergeCS2Operator(caryll_Buffer *blob, int32_t val) {
+ if (val >= 0x100) {
+ bufnwrite8(blob, 2, val >> 8, val & 0xff);
+ } else {
+ bufnwrite8(blob, 1, val & 0xff);
+ }
+}
+void cff_mergeCS2Int(caryll_Buffer *blob, int32_t val) {
+ if (val >= -1131 && val <= -108) {
+ bufnwrite8(blob, 2, (uint8_t)((-108 - val) / 256 + 251), (uint8_t)((-108 - val) % 256));
+ } else if (val >= -107 && val <= 107) {
+ bufnwrite8(blob, 1, (uint8_t)(val + 139));
+ } else if (val >= 108 && val <= 1131) {
+ bufnwrite8(blob, 2, (uint8_t)((val - 108) / 256 + 247), (uint8_t)((val - 108) % 256));
+ } else {
+ if (val >= -32768 && val <= 32767) {
+ bufnwrite8(blob, 3, 28, (uint8_t)(val >> 8), (uint8_t)((val << 8) >> 8));
+ } else {
+ cff_mergeCS2Int(blob, 0);
+ }
+ }
+}
+static void mergeCS2Real(caryll_Buffer *blob, double val) {
+ int16_t integerPart = floor(val);
+ uint16_t fractionPart = (val - integerPart) * 65536.0;
+ bufnwrite8(blob, 5, 0xFF, integerPart >> 8, integerPart & 0xFF, fractionPart >> 8, fractionPart & 0xFF);
+}
+void cff_mergeCS2Operand(caryll_Buffer *blob, double val) {
+ double intpart;
+ if (modf(val, &intpart) == 0.0) {
+ cff_mergeCS2Int(blob, (int32_t)intpart);
+ } else {
+ mergeCS2Real(blob, val);
+ }
+}
+void cff_mergeCS2Special(caryll_Buffer *blob, uint8_t val) {
+ bufwrite8(blob, val);
+}
+
+caryll_Buffer *cff_buildOffset(int32_t val) {
+ return bufninit(5, 29, (val >> 24) & 0xff, (val >> 16) & 0xff, (val >> 8) & 0xff, val & 0xff);
+}