Macros for the common TTX pattern <foo value='bar'/>

That makes things a little less verbose.
This commit is contained in:
Ben Harris 2024-11-02 14:41:34 +00:00
parent d4d2223429
commit 030d9c36f9

View 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()); */