chiark / gitweb /
Generate 'cmap' table for TTX
authorBen Harris <bjh21@bjh21.me.uk>
Sat, 2 Nov 2024 16:35:34 +0000 (16:35 +0000)
committerBen Harris <bjh21@bjh21.me.uk>
Thu, 14 Nov 2024 22:27:18 +0000 (22:27 +0000)
TTX currently refuses to compile it, but I suspect that's because the
font still has no glyphs.

bedstead.c

index 632e3635c8ac09afad17712f2ac4c988ffefc52e..fee42d8af2e92111b6529f3bd44c782bea37a54e 100644 (file)
@@ -198,6 +198,7 @@ static void domosaic(unsigned code, bool sep);
 static void domosaic4(unsigned code, bool sep);
 static void doalias(char const *alias_of);
 static void dopanose(void);
+static void docmap(int pid, int eid, int format);
 static void glyph_complement(void);
 static void bdf_gen(int size);
 
@@ -2993,6 +2994,13 @@ main(int argc, char **argv)
        NAME(0x114, "4-cell separated graphics");
        NAME(0x116, "6-cell separated graphics");
        printf(" </name>\n");
+
+       printf(" <cmap>\n");
+       docmap(0, 3, 4);   /* Unicode 2.0+, BMP only */
+       docmap(0, 4, 12);  /* Unicode 2.0+, full repertoire */
+       docmap(3, 1, 4);   /* Windows Unicode, BMP only */
+       docmap(3, 10, 12); /* Windows Unicode, full repertoire */
+       printf(" </cmap>\n");
        /* printf("FontName: %s\n", fullname_to_fontname(get_fullname())); */
        /* printf("FullName: %s\n", get_fullname()); */
        /* printf("FamilyName: Bedstead\n"); */
@@ -3249,6 +3257,28 @@ dopanose(void)
               panose[5], panose[6], panose[7], panose[8], panose[9]);
 }
 
+static void
+docmap(int pid, int eid, int format)
+{
+       int i;
+       long limit = 0x10000;
+
+       printf("  <cmap_format_%d platformID='%d' platEncID='%d' language='0'",
+              format, pid, eid);
+       if (format == 12) {
+               limit = 0x110000;
+               /* TTX will recalculate these, but insists we give them. */
+               printf(" format='12' reserved='0' length='0' nGroups='0'");
+       }
+       printf(">\n");
+       for (i = 0; i < nglyphs; i++)
+               if (glyphs[i].unicode >= 0 &&
+                   glyphs[i].unicode < limit)
+                       printf("    <map code='0x%lx' name='%s'/>\n",
+                              (long)glyphs[i].unicode, glyphs[i].name);
+       printf("  </cmap_format_%d>\n", format);
+}
+
 static void
 dopalt(struct glyph const *g)
 {