+void name_parse(memreader_t*r, ttf_t*ttf)
+{
+ U16 format = readU16(r);
+ U16 count = readU16(r);
+ U16 offset = readU16(r);
+
+ int t;
+ for(t=0;t<count;t++) {
+ U16 platform = readU16(r);
+ U16 encoding = readU16(r);
+ U16 language = readU16(r);
+ U16 name_id = readU16(r);
+ U16 len = readU16(r);
+ U16 offset_2 = readU16(r);
+ if(name_id==4) {
+ if(ttf->name)
+ free(ttf->name);
+ ttf->name = strdup_n(&r->mem[offset+offset_2], len);
+ }
+ }
+}
+void name_write(ttf_t*ttf, ttf_table_t*table)
+{
+ writeU16(table, 0); //format
+ writeU16(table, 1); //count
+ int offset = 18;
+ writeU16(table, offset); //offset
+
+ writeU16(table, 1); //platform id
+ writeU16(table, 0); //encoding id
+ writeU16(table, 0); //language
+ writeU16(table, 4); //4: full name
+ int len = strlen(ttf->name);
+ writeU16(table, len);
+ writeU16(table, table->len+2 - offset);
+ int t;
+ for(t=0;t<len;t++) {
+ writeU8(table, ttf->name[t]);
+ }
+}
+void name_delete(ttf_t*ttf)
+{
+ if(ttf->name)
+ 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);
+}