mirror of
https://github.com/rsms/inter.git
synced 2024-12-25 16:44:27 +03:00
64 lines
1.3 KiB
C
64 lines
1.3 KiB
C
/*
|
|
* 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;
|
|
}
|