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