summaryrefslogtreecommitdiff
path: root/misc/ttf2woff/genttf.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/ttf2woff/genttf.c')
-rw-r--r--misc/ttf2woff/genttf.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/misc/ttf2woff/genttf.c b/misc/ttf2woff/genttf.c
new file mode 100644
index 000000000..ad87be45b
--- /dev/null
+++ b/misc/ttf2woff/genttf.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2013 Jan Bobrowski <jb@wizard.ae.krakow.pl>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <assert.h>
+#include "ttf2woff.h"
+
+u8 *put_ttf_header(u8 buf[12], struct ttf *ttf)
+{
+ u8 *p = buf;
+ int n = ttf->ntables;
+ p = p32(p, ttf->flavor);
+ p = p16(p, n);
+ while(n & n-1) n &= n-1;
+ p = p16(p, n<<4);
+ p = p16(p, ffs(n)-1);
+ p = p16(p, ttf->ntables-n << 4);
+ return p;
+}
+
+void gen_ttf(struct buf *out, struct ttf *ttf)
+{
+ unsigned sfnt_size;
+ u8 *buf, *p;
+ int i;
+
+ sfnt_size = 12 + 16*ttf->ntables;
+ for(i=0; i<ttf->ntables; i++) {
+ struct table *t = ttf->tab_pos[i];
+ t->pos = sfnt_size; // remember offset in output file
+ sfnt_size += t->buf.len+3 & ~3;
+ }
+
+ buf = my_alloc(sfnt_size);
+ p = put_ttf_header(buf, ttf);
+
+ for(i=0; i<ttf->ntables; i++) {
+ struct table *t = &ttf->tables[i];
+ p = p32(p, t->tag);
+ p = p32(p, t->csum);
+ p = p32(p, t->pos);
+ p = p32(p, t->buf.len);
+ }
+
+ for(i=0; i<ttf->ntables; i++) {
+ struct table *t = ttf->tab_pos[i];
+ unsigned sz = t->buf.len;
+ p = append(p, t->buf.ptr, sz);
+ while(sz&3) *p++=0, sz++;
+ }
+
+ assert(p == buf+sfnt_size);
+
+ out->ptr = buf;
+ out->len = sfnt_size;
+}