+
+ttf_table_t* ttf_eot_head(ttf_t*ttf)
+{
+ ttf_table_t*file = ttf_table_new(0);
+ writeU32(file, 0); //file size (filled in later)
+ writeU32(file, 0); //fontdatasize (filled in later)
+ writeU32(file, 0x01000200);
+ writeU32(file, 0); //flags
+ writeU8(file, ttf->os2->panose_FamilyType);
+ writeU8(file, ttf->os2->panose_SerifStyle);
+ writeU8(file, ttf->os2->panose_Weight);
+ writeU8(file, ttf->os2->panose_Proportion);
+ writeU8(file, ttf->os2->panose_Contrast);
+ writeU8(file, ttf->os2->panose_StrokeVariation);
+ writeU8(file, ttf->os2->panose_ArmStyle);
+ writeU8(file, ttf->os2->panose_Letterform);
+ writeU8(file, ttf->os2->panose_Midline);
+ writeU8(file, ttf->os2->panose_XHeight);
+ writeU8(file, 1); //charset (default)
+ writeU8(file, ttf->os2->fsSelection&1); //italic
+ writeU32_LE(file, ttf->os2->usWeightClass);
+ writeU16(file, 0); //fstype
+ writeU16(file, 0x4c50); //magic
+ writeU32_LE(file, ttf->os2->ulCharRange[0]);
+ writeU32_LE(file, ttf->os2->ulCharRange[1]);
+ writeU32_LE(file, ttf->os2->ulCharRange[2]);
+ writeU32_LE(file, ttf->os2->ulCharRange[3]);
+ writeU32_LE(file, ttf->os2->ulCodePageRange1);
+ writeU32_LE(file, ttf->os2->ulCodePageRange2);
+ writeU32(file, 0); //checksum adjust (filled in later)
+ writeU32(file, 0); //reserved[0]
+ writeU32(file, 0); //reserved[1]
+ writeU32(file, 0); //reserved[2]
+ writeU32(file, 0); //reserved[3]
+ writeU16(file, 0); //padding(1)
+
+ int i,t,len;
+
+ char* strings[] = {ttf->family_name, ttf->subfamily_name, ttf->version_string, ttf->full_name};
+ int nr = sizeof(strings)/sizeof(strings[0]);
+
+ for(i=0;i<nr;i++) {
+ char *string = strings[i];
+
+ //family name
+ len = strlen(string);
+ writeU16_LE(file, len*2);
+ for(t=0;t<len;t++) {
+ writeU8(file, 0);
+ writeU8(file, string[t]);
+ }
+ writeU16(file, 0); //zero byte pad
+ }
+
+ writeU16(file, 0); //zero byte pad
+
+ writeU16(file, 0); //padding(2)
+ return file;
+}
+
+void ttf_save_eot(ttf_t*ttf, const char*filename)
+{
+ ttf_table_t* eot = ttf_eot_head(ttf);
+ U32 checksum_adjust = 0;
+ ttf_table_t* t = ttf_write(ttf, &checksum_adjust);
+
+ U8*len_data = eot->data;
+ U32 full_len = eot->len + t->len;
+ len_data[0] = full_len>>0;
+ len_data[1] = full_len>>8;
+ len_data[2] = full_len>>16;
+ len_data[3] = full_len>>24;
+
+ U8*len_data2 = eot->data+4;
+ len_data2[0] = t->len>>0;
+ len_data2[1] = t->len>>8;
+ len_data2[2] = t->len>>16;
+ len_data2[3] = t->len>>24;
+
+ U8*checksum_data = eot->data + 60;
+ checksum_data[0] = checksum_adjust>>0;
+ checksum_data[1] = checksum_adjust>>8;
+ checksum_data[2] = checksum_adjust>>16;
+ checksum_data[3] = checksum_adjust>>24;
+
+ FILE*fi = fopen(filename, "wb");
+ if(!fi) {
+ perror(filename);
+ return;
+ }
+
+ fwrite(eot->data, eot->len, 1, fi);
+ fwrite(t->data, t->len, 1, fi);
+ fclose(fi);
+ ttf_table_delete(0, t);
+ ttf_table_delete(0, eot);
+}
+