#include #include #include "ppm.h" #include "nstring.h" #include "ppmdfont.h" static void generateHeader(struct ppmd_fontHeader const fontHeader) { fprintf(stdout, " {/* .header */\n"); fprintf(stdout, " {'p','p','m','d','f','o','n','t'},\n"); fprintf(stdout, " 0x%02x,\n", fontHeader.format); fprintf(stdout, " %u,\n", fontHeader.characterCount); fprintf(stdout, " %u\n", fontHeader.firstCodePoint); fprintf(stdout, " }\n"); } static void generateGlyphCommand(struct ppmd_glyphCommand const glyphCommand) { const char * verb; switch (glyphCommand.verb) { case CMD_NOOP: verb = "CMD_NOOP"; break; case CMD_DRAWLINE: verb = "CMD_DRAWLINE"; break; case CMD_MOVEPEN: verb = "CMD_MOVEPEN"; break; } fprintf(stdout, " {/* glyphCommand */ %s, %u, %u }\n", verb, glyphCommand.x, glyphCommand.y); } static void generateCommandTable(struct ppmd_glyph const glyph, const char * const variableName) { unsigned int commandNum; fprintf(stdout, "struct ppmd_glyphCommand const %s[%u] = {\n", variableName, glyph.header.commandCount); for (commandNum = 0; commandNum < glyph.header.commandCount; ++commandNum) { generateGlyphCommand(glyph.commandList[commandNum]); if (commandNum < glyph.header.commandCount-1) fprintf(stdout, " ,\n"); } } static void generateCommandTables(const struct ppmd_font * const fontP, const char * const glyphTableVariableName) { unsigned int relativeCodePoint; for (relativeCodePoint = 0; relativeCodePoint < fontP->header.characterCount; ++relativeCodePoint) { if (fontP->glyphTable[relativeCodePoint].header.commandCount > 0) { const char * commandTableVariableName; pm_asprintf(&commandTableVariableName, "%s_cmd_%u", glyphTableVariableName, fontP->header.firstCodePoint + relativeCodePoint); generateCommandTable(fontP->glyphTable[relativeCodePoint], commandTableVariableName); pm_strfree(commandTableVariableName); fprintf(stdout, "};\n"); fprintf(stdout, "\n"); } } } static void generateGlyph( struct ppmd_glyph const glyph, const char * const commandTableVariableName) { fprintf(stdout, " { /* glyph */\n"); fprintf(stdout, " { /* header */ %u, %u, %u}\n", glyph.header.commandCount, glyph.header.skipBefore, glyph.header.skipAfter ); fprintf(stdout, " ,\n"); if (glyph.header.commandCount == 0) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %s\n", commandTableVariableName); fprintf(stdout, " }\n"); } static void generateGlyphTable(const struct ppmd_font * const fontP, const char * const variableName) { unsigned int relativeCodePoint; generateCommandTables(fontP, variableName); fprintf(stdout, "struct ppmd_glyph const %s[%u] = {\n", variableName, fontP->header.characterCount); for (relativeCodePoint = 0; relativeCodePoint < fontP->header.characterCount; ++relativeCodePoint) { const char * commandTableVariableName; pm_asprintf(&commandTableVariableName, "%s_cmd_%u", variableName, fontP->header.firstCodePoint + relativeCodePoint); generateGlyph(fontP->glyphTable[relativeCodePoint], commandTableVariableName); pm_strfree(commandTableVariableName); if (relativeCodePoint < fontP->header.characterCount - 1) fprintf(stdout, " ,\n"); } fprintf(stdout, "};\n"); fprintf(stdout, "\n"); } static void generateFont(const struct ppmd_font * const fontP, const char * const fontVariableName, const char * const glyphTableVariableName) { fprintf(stdout, "struct ppmd_font const %s = {\n", fontVariableName); generateHeader(fontP->header); fprintf(stdout, " ,\n"); fprintf(stdout, " /* .glyphTable: */ %s\n", glyphTableVariableName); fprintf(stdout, "};\n"); } int main(int argc, char **argv) { const char fontVariableName[] = "ppmd_standardfont"; const struct ppmd_font * fontP; const char * glyphTableVariableName; ppm_init(&argc, argv); ppmd_read_font(stdin, &fontP); fprintf(stdout, "/* THIS FILE WAS GENERATED BY 'ppmdcfont' from a " "ppmdfont file. */\n"); fprintf(stdout, "\n"); fprintf(stdout, "#include \"ppmdfont.h\"\n\n"); pm_asprintf(&glyphTableVariableName, "%s_glyphTable", fontVariableName); generateGlyphTable(fontP, glyphTableVariableName); fprintf(stdout, "\n"); generateFont(fontP, fontVariableName, glyphTableVariableName); pm_strfree(glyphTableVariableName); ppmd_free_font(fontP); return 0; }