summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-fdselect.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-fdselect.c')
-rw-r--r--Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-fdselect.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-fdselect.c b/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-fdselect.c
new file mode 100644
index 00000000000..ea1546d38ff
--- /dev/null
+++ b/Build/source/texk/web2c/mfluadir/otfcc/lib/libcff/cff-fdselect.c
@@ -0,0 +1,81 @@
+#include "cff-fdselect.h"
+
+void cff_close_FDSelect(cff_FDSelect fds) {
+ switch (fds.t) {
+ case cff_FDSELECT_FORMAT0:
+ if (fds.f0.fds != NULL) FREE(fds.f0.fds);
+ break;
+ case cff_FDSELECT_FORMAT3:
+ if (fds.f3.range3 != NULL) FREE(fds.f3.range3);
+ break;
+ case cff_FDSELECT_UNSPECED:
+ break;
+ }
+}
+
+caryll_Buffer *cff_build_FDSelect(cff_FDSelect fd) {
+ switch (fd.t) {
+ case cff_FDSELECT_UNSPECED: {
+ return bufnew();
+ }
+ case cff_FDSELECT_FORMAT0: {
+ caryll_Buffer *blob = bufnew();
+ blob->size = 1 + fd.s;
+ NEW(blob->data, blob->size);
+ for (uint16_t j = 0; j < fd.s; j++) {
+ blob->data[j] = fd.f0.fds[j];
+ }
+ return blob;
+ }
+ case cff_FDSELECT_FORMAT3: {
+ caryll_Buffer *blob = bufnew();
+ blob->size = 5 + fd.f3.nranges * 3;
+ NEW(blob->data, blob->size);
+ blob->data[0] = 3;
+ blob->data[1] = fd.f3.nranges / 256;
+ blob->data[2] = fd.f3.nranges % 256;
+ for (int i = 0; i < fd.f3.nranges; i++)
+ blob->data[3 + 3 * i] = fd.f3.range3[i].first / 256,
+ blob->data[4 + 3 * i] = fd.f3.range3[i].first % 256,
+ blob->data[5 + 3 * i] = fd.f3.range3[i].fd;
+ blob->data[blob->size - 2] = fd.f3.sentinel / 256;
+ blob->data[blob->size - 1] = fd.f3.sentinel % 256;
+ return blob;
+ }
+ default: { return NULL; }
+ }
+}
+
+void cff_extract_FDSelect(uint8_t *data, int32_t offset, uint16_t nchars, cff_FDSelect *fdselect) {
+ switch (data[offset]) {
+ case 0: {
+ fdselect->t = cff_FDSELECT_FORMAT0;
+ fdselect->f0.format = 0;
+ fdselect->s = nchars;
+ NEW(fdselect->f0.fds, nchars);
+
+ for (uint32_t i = 0; i < nchars; i++) {
+ fdselect->f0.fds[i] = gu1(data, offset + 1 + i);
+ }
+ break;
+ }
+ case 3: {
+ fdselect->t = cff_FDSELECT_FORMAT3;
+ fdselect->f3.format = 3;
+ fdselect->f3.nranges = gu2(data, offset + 1);
+ NEW(fdselect->f3.range3, fdselect->f3.nranges);
+
+ for (uint32_t i = 0; i < fdselect->f3.nranges; i++) {
+ fdselect->f3.range3[i].first = gu2(data, offset + 3 + i * 3);
+ fdselect->f3.range3[i].fd = gu1(data, offset + 5 + i * 3);
+ }
+
+ fdselect->f3.sentinel = gu2(data, offset + (fdselect->f3.nranges + 1) * 3);
+ break;
+ }
+ default: {
+ fdselect->t = cff_FDSELECT_UNSPECED;
+ break;
+ }
+ }
+}