ttf->glyphs = rfx_calloc(num_glyphs*sizeof(ttfglyph_t));
double scale = 1.0;
int max_unicode = font->max_unicode;
+ int remap_pos=0;
for(t=0;t<font->num_glyphs;t++) {
gfxglyph_t*src = &font->glyphs[t];
ttfglyph_t*dest = &ttf->glyphs[t+offset];
}
dest->advance = src->advance*scale;
- if(src->unicode > max_unicode)
- max_unicode = src->unicode;
+
+ int u = font->glyphs[t].unicode;
+ if(u<32 || (u>=0xe000 && u<0xf900)) {
+ u = 0xe000 + remap_pos++;
+ }
+ if(u > max_unicode)
+ max_unicode = u;
}
ttf->unicode_size = max_unicode+1;
ttf->unicode = rfx_calloc(sizeof(unicode_t)*ttf->unicode_size);
- int remap_pos=0;
+ remap_pos=0;
for(t=0;t<font->num_glyphs;t++) {
gfxglyph_t*src = &font->glyphs[t];
int u = font->glyphs[t].unicode;
if(u<32 || (u>=0xe000 && u<0xf900)) {
u = 0xe000 + remap_pos++;
}
- if(u>=0)
+ if(u>=0 && u<ttf->unicode_size)
ttf->unicode[u] = t+offset;
}
int u;
#include <memory.h>
#include "log.h"
#include "os.h"
+#include "q.h"
#include "mem.h"
#include "ttf.h"
U16 name_id = readU16(r);
U16 len = readU16(r);
U16 offset_2 = readU16(r);
- /*printf("%d %d %d %d at %d, %d bytes:", platform, encoding, language, name_id, offset+offset_2, len);
- int s;
- for(s=0;s<len;s++) {
- printf("%c", r->mem[offset+offset_2+s]);
+ if(name_id==4) {
+ if(ttf->name)
+ free(ttf->name);
+ ttf->name = strdup_n(&r->mem[offset+offset_2], len);
}
- printf("\n");*/
}
}
void name_write(ttf_t*ttf, ttf_table_t*table)
free(ttf->name);
}
+static table_post_t*post_new(ttf_t*ttf)
+{
+ table_post_t*post = rfx_calloc(sizeof(table_post_t));
+ return post;
+}
+void post_parse(memreader_t*r, ttf_t*ttf)
+{
+ table_post_t*post = ttf->post = rfx_calloc(sizeof(table_post_t));
+ U16 format = readU16(r);
+ post->italic_angle = readU16(r);
+ post->underline_position = readU16(r);
+ post->underline_thickness = readU16(r);
+ U16 is_monospaced = readU16(r);
+ readU16(r); // min mem 42
+ readU16(r);
+ readU16(r); // min mem 1
+ readU16(r);
+}
+void post_write(ttf_t*ttf, ttf_table_t*table)
+{
+ table_post_t*post = ttf->post;
+ writeU32(table, 0x00030000);
+ writeU32(table, post->italic_angle);
+ writeU16(table, post->underline_position);
+ writeU16(table, post->underline_thickness);
+ writeU32(table, 0); //is monospaced TODO
+ writeU32(table, 0); //min mem 42
+ writeU32(table, 0);
+ writeU32(table, 0); //min mem 1
+ writeU32(table, 0);
+}
+void post_delete(ttf_t*ttf)
+{
+ if(ttf->post)
+ free(ttf->post);
+}
+
static int ttf_parse_tables(ttf_t*ttf)
{
ttf_table_t*table;
ttf_table_delete(ttf, table);
}
+ table = ttf_find_table(ttf, TAG_POST);
+ if(table) {
+ INIT_READ(m, table->data, table->len, 0);
+ post_parse(&m, ttf);
+ ttf_table_delete(ttf, table);
+ }
+
return 1;
}
static void ttf_collapse_tables(ttf_t*ttf)
name_write(ttf, table);
name_delete(ttf);
}
+ if(ttf->post) {
+ table = ttf_addtable(ttf, TAG_POST);
+ post_write(ttf, table);
+ post_delete(ttf);
+ }
table = ttf_addtable(ttf, TAG_HEAD);
head_write(ttf, table, loca_size);
ttf->hea = hea_new(ttf);
if(!ttf->os2)
ttf->os2 = os2_new(ttf);
+ if(!ttf->post)
+ ttf->post = post_new(ttf);
}
ttf_table_t* ttf_write(ttf_t*ttf)
{
maxp_dump(ttf);
glyf_dump(ttf);
}
-void ttf_destroy(ttf_t*ttf)
+void ttf_destroy_tables(ttf_t*ttf)
{
ttf_table_t*table = ttf->tables;
while(table) {
free(table);
table = next;
}
+ ttf->tables = 0;
+}
+void ttf_reduce(ttf_t*ttf)
+{
+ ttf_destroy_tables(ttf);
+}
+void ttf_destroy(ttf_t*ttf)
+{
+ ttf_destroy_tables(ttf);
maxp_delete(ttf);
os2_delete(ttf);
head_delete(ttf);
hea_delete(ttf);
glyf_delete(ttf);
+ post_delete(ttf);
free(ttf);
}
//msg("<notice> Loading %s", filename);
memfile_t*m = memfile_open(filename);
ttf_t*ttf = ttf_load(m->data, m->len);
+ ttf_reduce(ttf);
ttf->name = strdup("testfont");
if(!ttf) return 1;
memfile_close(m);
//ttf_dump(ttf);
//printf("os2 version: %04x (%d), maxp size: %d\n",
// ttf->os2->version, ttf->os2->size, ttf->maxp->size);
- ttf_save(ttf, "output.ttf");
+ ttf_save(ttf, "testfont.ttf");
ttf_destroy(ttf);
return 0;