chiark / gitweb /
Macros for the common TTX pattern <foo value='bar'/>
authorBen Harris <bjh21@bjh21.me.uk>
Sat, 2 Nov 2024 14:41:34 +0000 (14:41 +0000)
committerBen Harris <bjh21@bjh21.me.uk>
Thu, 14 Nov 2024 22:27:18 +0000 (22:27 +0000)
That makes things a little less verbose.

bedstead.c

index 74064df97d844a1c9f5b2d60fba48386f479f6aa..e3a69b88125db1dd6c66527176ac9cce17776df1 100644 (file)
@@ -2849,111 +2849,106 @@ main(int argc, char **argv)
                        extraglyphs++;
        printf("<?xml version='1.0'?>\n");
        printf("<ttFont sfntVersion='OTTO'>\n");
+/* Convenient macros for TTX values. */
+#define TTXF(key, format, ...) \
+    printf("  <" #key " value='" format "'/>\n", __VA_ARGS__)
+#define TTXI(key, i) TTXF(key, "%ld", (long)(i))
+#define TTXS(key, s) TTXF(key, "%s", (s))
        printf(" <head>\n");
-       printf("  <tableVersion value='1.0'/>\n");
-       printf("  <fontRevision value='%s'/>\n", VERSION);
-       printf("  <checkSumAdjustment value='0'/>\n");
-       printf("  <magicNumber value='0x5f0f3cf5'/>\n");
+       TTXS(tableVersion, "1.0");
+       TTXS(fontRevision, VERSION);
+       TTXI(checkSumAdjustment, 0);
+       TTXI(magicNumber, 0x5f0f3cf5);
        /*
         * Flags:
         *  Baseline and left sidebearing point at (0,0)
         *  Force ppem to integer
         */
-       printf("  <flags value='00000000 00001011'/>\n");
-       printf("  <unitsPerEm value='%d'/>\n", (int)(YSIZE * YPIX));
+       TTXS(flags, "00000000 00001011");
+       TTXI(unitsPerEm, YSIZE * YPIX);
        if ((timestr = time_for_ttx()) == NULL) return 1;
-       printf("  <created value='%s'/>\n", timestr);
-       printf("  <modified value='%s'/>\n", timestr);
-       printf("  <xMin value='%d'/>\n", 0);
-       printf("  <yMin value='%d'/>\n", (int)(-DESCENT * YPIX));
-       printf("  <xMax value='%d'/>\n", (int)(XSIZE * XPIX));
-       printf("  <yMax value='%d'/>\n", (int)(ASCENT * YPIX));
-       printf("  <macStyle value='00000000 0%c%c000%c'/>\n",
+       TTXS(created, timestr);
+       TTXS(modified, timestr);
+       TTXI(xMin, 0);
+       TTXI(yMin, -DESCENT * YPIX);
+       TTXI(xMax, XSIZE * XPIX);
+       TTXI(yMax, ASCENT * YPIX);
+       TTXF(macStyle, "00000000 0%c%c000%c",
               width->ttfwidth > 5 ? '1' : '0', /* Expanded? */
               width->ttfwidth < 5 ? '1' : '0', /* Condensed? */
               weight->ttfweight > 500 ? '1' : '0'); /* Bold? */
-       printf("  <lowestRecPPEM value='%d'/>\n", (int)YSIZE);
-       printf("  <fontDirectionHint value='0'/>\n"); /* Fully bi-di. */
-       printf("  <indexToLocFormat value='0'/>\n");
-       printf("  <glyphDataFormat value='0'/>\n");
+       TTXI(lowestRecPPEM, YSIZE);
+       TTXI(fontDirectionHint, 0); /* Fully bi-di. */
+       TTXI(indexToLocFormat, 0);
+       TTXI(glyphDataFormat, 0);
        printf(" </head>\n");
 
        printf(" <hhea>\n");
-       printf("  <tableVersion value='0x00010000'/>\n");
-       printf("  <ascent value='%d'/>\n", (int)(ASCENT * YPIX));
-       printf("  <descent value='%d'/>\n", (int)(-DESCENT * YPIX));
-       printf("  <lineGap value='0'/>\n");
-       printf("  <advanceWidthMax value='%d'/>\n", (int)(XSIZE * XPIX));
-       printf("  <minLeftSideBearing value='0'/>\n");
-       printf("  <minRightSideBearing value='0'/>\n");
-       printf("  <xMaxExtent value='%d'/>\n", (int)(XSIZE * XPIX));
-       printf("  <caretSlopeRise value='1'/><caretSlopeRun value='0'/>\n");
-       printf("  <caretOffset value='0'/>\n");
-       printf("  <reserved0 value='0'/><reserved1 value='0'/>\n");
-       printf("  <reserved2 value='0'/><reserved3 value='0'/>\n");
-       printf("  <metricDataFormat value='0'/>\n");
-       printf("  <numberOfHMetrics value='2'/>\n");
+       TTXS(tableVersion, "0x00010000");
+       TTXI(ascent, ASCENT * YPIX);
+       TTXI(descent, -DESCENT * YPIX);
+       TTXI(lineGap, 0);
+       TTXI(advanceWidthMax, XSIZE * XPIX);
+       TTXI(minLeftSideBearing, 0);
+       TTXI(minRightSideBearing, 0);
+       TTXI(xMaxExtent, XSIZE * XPIX);
+       TTXI(caretSlopeRise, 1); TTXI(caretSlopeRun, 0);
+       TTXI(caretOffset, 0);
+       TTXI(reserved0, 0); TTXI(reserved1, 0);
+       TTXI(reserved2, 0); TTXI(reserved3, 0);
+       TTXI(metricDataFormat, 0);
+       TTXI(numberOfHMetrics, 2);
        printf(" </hhea>\n");
 
        printf(" <maxp>\n");
-       printf("  <tableVersion value='0x5000'/>\n");
-       printf("  <numGlyphs value='%d'/>\n", (int)nglyphs);
+       TTXS(tableVersion, "0x5000");
+       TTXI(numGlyphs, nglyphs);
        printf(" </maxp>\n");
 
        printf(" <OS_2>\n");
-       printf("  <version value='4'/>\n");
-       printf("  <xAvgCharWidth value='%d'/>\n", (int)(XSIZE * XPIX));
-       printf("  <usWeightClass value='%d'/>\n", weight->ttfweight);
-       printf("  <usWidthClass value='%d'/>\n", width->ttfwidth);
-       printf("  <fsType value='00000000 00000000'/>\n");
+       TTXI(version, 4);
+       TTXI(xAvgCharWidth, XSIZE * XPIX);
+       TTXI(usWeightClass, weight->ttfweight);
+       TTXI(usWidthClass, width->ttfwidth);
+       TTXS(fsType, "00000000 00000000");
        /* Sub/Superscript are three by five pixels */
-       printf("  <ySubscriptXSize value='%d'/>\n",
-              (int)(YSIZE * YPIX * 3 / (XSIZE - 1)));
-       printf("  <ySubscriptYSize value='%d'/>\n",
-              (int)(YSIZE * YPIX * 5 / (YSIZE - 3)));
-       printf("  <ySubscriptXOffset value='0'/>\n");
-       printf("  <ySubscriptYOffset value='%d'/>\n", (int)(2 * YPIX));
-       printf("  <ySuperscriptXSize value='%d'/>\n",
-              (int)(YSIZE * YPIX * 3 / (XSIZE - 1)));
-       printf("  <ySuperscriptYSize value='%d'/>\n",
-              (int)(YSIZE * YPIX * 5 / (YSIZE - 3)));
-       printf("  <ySuperscriptXOffset value='0'/>\n");
-       printf("  <ySuperscriptYOffset value='%d'/>\n", (int)(2 * YPIX));
-       printf("  <yStrikeoutSize value='%d'/>\n", (int)(YPIX));
-       printf("  <yStrikeoutPosition value='%d'/>\n", (int)(3 * YPIX));
-       printf("  <sFamilyClass value='%d'/>\n", 0x080a);
+       TTXI(ySubscriptXSize, YSIZE * YPIX * 3 / (XSIZE - 1));
+       TTXI(ySubscriptYSize, YSIZE * YPIX * 5 / (YSIZE - 3));
+       TTXI(ySubscriptXOffset, 0);
+       TTXI(ySubscriptYOffset, 2 * YPIX);
+       TTXI(ySuperscriptXSize, YSIZE * YPIX * 3 / (XSIZE - 1));
+       TTXI(ySuperscriptYSize, YSIZE * YPIX * 5 / (YSIZE - 3));
+       TTXI(ySuperscriptXOffset, 0);
+       TTXI(ySuperscriptYOffset, 2 * YPIX);
+       TTXI(yStrikeoutSize, YPIX);
+       TTXI(yStrikeoutPosition, 3 * YPIX);
+       TTXI(sFamilyClass, 0x080a);
        dopanose();
        /* XXX These were generated by FontForge and should be checked. */
-       printf("  <ulUnicodeRange1 "
-              "value='10100000 00000000 00001010 10111111'/>\n");
-       printf("  <ulUnicodeRange2 "
-              "value='01010010 00000000 11111001 11111011'/>\n");
-       printf("  <ulUnicodeRange3 "
-              "value='00000011 00000000 00000000 00110000'/>\n");
-       printf("  <ulUnicodeRange4 "
-              "value='00000000 00000000 00000010 00000000'/>\n");
-       printf("  <achVendID value='PfEd'/>\n");
-       printf("  <fsSelection value='00000001 1%c%c00000'/>\n",
+       TTXS(ulUnicodeRange1, "10100000 00000000 00001010 10111111");
+       TTXS(ulUnicodeRange2, "01010010 00000000 11111001 11111011");
+       TTXS(ulUnicodeRange3, "00000011 00000000 00000000 00110000");
+       TTXS(ulUnicodeRange4, "00000000 00000000 00000010 00000000");
+       TTXS(achVendID, "PfEd");
+       TTXF(fsSelection, "00000001 1%c%c00000",
               /* Fixed: use typo metrics; WWS */
               weight->ttfweight == 500 && width->ttfwidth == 5 ? '1' : '0',
               weight->ttfweight > 500 ? '1' : '0'); /* Bold? */
-       printf("  <usFirstCharIndex value='32'/>\n");
-       printf("  <usLastCharIndex value='65535'/>\n");
-       printf("  <sTypoAscender value='%d'/>\n", (int)(ASCENT * YPIX));
-       printf("  <sTypoDescender value='%d'/>\n", (int)(-DESCENT * YPIX));
-       printf("  <sTypoLineGap value='0'/>\n");
-       printf("  <usWinAscent value='%d'/>\n", (int)(ASCENT * YPIX));
-       printf("  <usWinDescent value='%d'/>\n", (int)(DESCENT * YPIX));
+       TTXI(usFirstCharIndex, 32);
+       TTXI(usLastCharIndex, 65535);
+       TTXI(sTypoAscender, ASCENT * YPIX);
+       TTXI(sTypoDescender, -DESCENT * YPIX);
+       TTXI(sTypoLineGap, 0);
+       TTXI(usWinAscent, ASCENT * YPIX);
+       TTXI(usWinDescent, DESCENT * YPIX);
        /* XXX These were generated by FontForge and should be checked. */
-       printf("  <ulCodePageRange1 "
-              "value='01100000 00000000 00000000 00111111'/>\n");
-       printf("  <ulCodePageRange2 "
-              "value='11010111 11110111 00000000 00000000'/>\n");
-       printf("  <sxHeight value='%d'/>\n", (int)(XHEIGHT * YPIX));
-       printf("  <sCapHeight value='%d'/>\n", (int)(CAPHEIGHT * YPIX));
-       printf("  <usDefaultChar value='0'/>\n");
-       printf("  <usBreakChar value='32'/>\n");
-       printf("  <usMaxContext value='1'/>\n"); /* No pair subs. */
+       TTXS(ulCodePageRange1, "01100000 00000000 00000000 00111111");
+       TTXS(ulCodePageRange2, "11010111 11110111 00000000 00000000");
+       TTXI(sxHeight, XHEIGHT * YPIX);
+       TTXI(sCapHeight, CAPHEIGHT * YPIX);
+       TTXI(usDefaultChar, 0);
+       TTXI(usBreakChar, 32);
+       TTXI(usMaxContext, 1); /* No pair subs. */
        printf(" </OS_2>\n");
        /* printf("FontName: %s\n", fullname_to_fontname(get_fullname())); */
        /* printf("FullName: %s\n", get_fullname()); */