diff options
author | Rasmus Andersson <rasmus@notion.se> | 2017-08-22 10:05:20 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@notion.se> | 2017-08-22 12:23:08 +0300 |
commit | 3b1fffade1473f20f2558733fbd218f4580fc7c3 (patch) | |
tree | ea4f80b43b08744d493bb86ab646444ec04ddc7f /misc/ttf2woff/ttf2woff.h | |
download | inter-3b1fffade1473f20f2558733fbd218f4580fc7c3.tar.xz |
Initial public commitv1.0
Diffstat (limited to 'misc/ttf2woff/ttf2woff.h')
-rw-r--r-- | misc/ttf2woff/ttf2woff.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/misc/ttf2woff/ttf2woff.h b/misc/ttf2woff/ttf2woff.h new file mode 100644 index 000000000..23facdd59 --- /dev/null +++ b/misc/ttf2woff/ttf2woff.h @@ -0,0 +1,94 @@ +#include <sys/types.h> +#include <string.h> + +#pragma clang diagnostic ignored "-Wshift-op-parentheses" +#pragma clang diagnostic ignored "-Wpointer-sign" + +#ifndef NO_ERRWARN +#include <err.h> +#else +void err(int,char*,...); +void errx(int,char*,...); +void warn(char*,...); +void warnx(char*,...); +#endif + +enum { + fmt_UNKNOWN=0, + fmt_TTF, + fmt_WOFF +}; + +extern struct flags { + unsigned otype:8; + unsigned stdout_used:1; + unsigned verbose:1; + unsigned mayoptim:1; + unsigned optimize:1; + unsigned dryrun:1; + unsigned inplace:1; + unsigned listonly:1; +} g; + +void echo(char *, ...); + +typedef unsigned char u8; +typedef unsigned int u32; + +static inline int g16(u8 *p) {return p[0]<<8 | p[1];} +static inline u32 g32(u8 *p) {return (u32)p[0]<<24 | p[1]<<16 | p[2]<<8 | p[3];} +static inline u8 *p16(u8 *p, int v) {p[0]=v>>8; p[1]=v; return p+2;} +static inline u8 *p32(u8 *p, u32 v) {p[0]=v>>24; p[1]=v>>16; p[2]=v>>8; p[3]=v; return p+4;} +static inline u8 *append(u8 *d, u8 *s, size_t n) {u8 *p=d+n; memcpy(d,s,n); return p;} + +struct buf { + u8 *ptr; + unsigned len; +}; + +struct table { + u32 tag; + unsigned modified:1; + unsigned free_buf:1; + struct buf buf; + u32 csum; + u32 pos; + char name[8]; + struct buf zbuf; +}; + +struct ttf { + u32 flavor; + int ntables; + unsigned modified:1; + unsigned modified_meta:1; // WOFF meta & priv + struct table *tables; // sorted by name + struct table **tab_pos; // sorted by file pos + struct buf woff_meta, woff_priv; +}; + +void alloc_tables(struct ttf *ttf); +void name_table(struct table *t); +u8 *put_ttf_header(u8 buf[12], struct ttf *ttf); +struct table *find_table(struct ttf *ttf, char tag[4]); +void optimize(struct ttf *ttf); + +void read_ttf(struct ttf *ttf, u8 *data, size_t length, unsigned offset); +void read_ttc(struct ttf *ttf, u8 *data, size_t length, int fontn); +void read_woff(struct ttf *ttf, u8 *data, size_t length); +void gen_woff(struct buf *out, struct ttf *ttf); +void gen_ttf(struct buf *out, struct ttf *ttf); + +#define BAD_FONT errx(2, "Bad font (%s:%d)",__FILE__,__LINE__) + +int zlib_compress(struct buf *out, struct buf *inp); +extern char *copression_by; + +#define _STR(X) #X +#define STR(X) _STR(X) + +#define REALLY_SMALLER(A,B) (((A)+3&~3)<((B)+3&~3)) + +void *my_alloc(size_t sz); +void *my_free(void *p); +void *my_realloc(void *p, size_t sz); |