summaryrefslogtreecommitdiff
path: root/tools/crtfont/crtfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/crtfont/crtfont.c')
-rw-r--r--tools/crtfont/crtfont.c305
1 files changed, 305 insertions, 0 deletions
diff --git a/tools/crtfont/crtfont.c b/tools/crtfont/crtfont.c
new file mode 100644
index 0000000..97e57fe
--- /dev/null
+++ b/tools/crtfont/crtfont.c
@@ -0,0 +1,305 @@
+/*
+ * GraphLCD tool crtfont
+ *
+ * crtfont.c - a tool to create *.fnt files for use with the GraphLCD
+ * graphics library
+ *
+ * based on graphlcd plugin 0.1.1 for the Video Disc Recorder
+ * (c) 2001-2004 Carsten Siebholz <c.siebholz AT t-online.de>
+ *
+ * This file is released under the GNU General Public License. Refer
+ * to the COPYING file distributed with this package.
+ *
+ * (c) 2004 Andreas Regel <andreas.regel AT powarman.de>
+ */
+
+#include <getopt.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glcdgraphics/bitmap.h>
+#include <glcdgraphics/font.h>
+
+static const char *prgname = "crtfont";
+static const char *version = "0.1.6";
+
+const int kMaxLineLength = 1024;
+
+enum ePicFormat
+{
+ undefined,
+ PBM
+};
+
+
+void usage(void);
+
+char * trimleft(char * str)
+{
+ char * s = str;
+ while (*s == ' ' || *s == '\t')
+ s++;
+ strcpy(str, s);
+ return str;
+}
+
+char * trimright(char * str)
+{
+ char * s = str + strlen(str) - 1;
+ while (s >= str && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r'))
+ *s-- = 0;
+ return str;
+}
+
+char * trim(char * str)
+{
+ return trimleft(trimright(str));
+}
+
+
+int main(int argc, char *argv[])
+{
+ ePicFormat picFormat = undefined;
+ GLCD::cFont font;
+ char * picName = NULL;
+ char * descName = NULL;
+ char * fontName = NULL;
+ FILE * descFile;
+ bool error = false;
+ GLCD::cBitmap * bitmap = NULL;
+ GLCD::cBitmap * tmpBitmap = NULL;
+ GLCD::cBitmap * charBitmap = NULL;
+ char line[kMaxLineLength];
+ int l = 0;
+ char * token;
+ int startOffset, endOffset;
+ int spaceWidth;
+ int version;
+ char * ptr;
+
+ static struct option long_options[] =
+ {
+ { "format", required_argument, NULL, 'f'},
+ { "bmpfile", required_argument, NULL, 'b'},
+ { "descfile", required_argument, NULL, 'd'},
+ { "outfile", required_argument, NULL, 'o'},
+ { NULL}
+ };
+
+ int c, option_index = 0;
+ while ((c = getopt_long(argc, argv, "f:b:d:o:", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'f':
+ if (strcasecmp(optarg, "PBM") == 0)
+ picFormat = PBM;
+ break;
+
+ case 'b':
+ picName = strdup(optarg);
+ break;
+
+ case 'd':
+ descName = strdup(optarg);
+ break;
+
+ case 'o':
+ fontName = strdup(optarg);
+ break;
+
+ default:
+ return 1;
+ }
+ }
+
+ if (picFormat == undefined)
+ {
+ fprintf(stderr, "ERROR: You have to specify the format (-f <format>)\n");
+ error = true;
+ }
+ if (!picName)
+ {
+ fprintf(stderr, "ERROR: You have to specify the bmpfile (-b bmpfile)\n");
+ error = true;
+ }
+ if (!descName)
+ {
+ fprintf(stderr, "ERROR: You have to specify the descfile (-d descfile)\n");
+ error = true;
+ }
+ if (!fontName)
+ {
+ fprintf(stderr, "ERROR: You have to specify the outfile (-o outfile)\n");
+ error = true;
+ }
+
+ if (error)
+ {
+ usage();
+ return 1;
+ }
+
+ descFile = fopen(descName,"r");
+ if (!descFile)
+ {
+ fprintf(stderr, "Cannot open file: %s\n",descName);
+ return 2;
+ }
+
+ // Load Picture
+ switch (picFormat)
+ {
+ case PBM:
+ bitmap = new GLCD::cBitmap(0, 0);
+ bitmap->LoadPBM(picName);
+ if (!bitmap)
+ {
+ fprintf(stderr, "Cannot open file: %s\n",picName);
+ return 2;
+ }
+ break;
+
+ default:
+ return 2;
+ }
+
+ if (!bitmap)
+ return 3;
+
+ spaceWidth = 0;
+
+ version = 0;
+ fgets(line, sizeof(line), descFile);
+ trim(line);
+ if (strstr(line, "version") != NULL)
+ {
+ ptr = strstr(line, ":");
+ version = atoi(ptr + 1);
+ }
+ if (version != 1)
+ {
+ fprintf(stderr, "Wrong description file format version (found %d, expected 1)!\n", version);
+ return 2;
+ }
+ while (!feof(descFile))
+ {
+ fgets(line, sizeof(line), descFile);
+ trim(line);
+ if (strstr(line, "fontheight") != NULL)
+ {
+ ptr = strstr(line, ":");
+ font.SetTotalHeight(atoi(ptr + 1));
+ }
+ else if (strstr(line, "fontascent") != NULL)
+ {
+ ptr = strstr(line, ":");
+ font.SetTotalAscent(atoi(ptr + 1));
+ }
+ else if (strstr(line, "lineheight") != NULL)
+ {
+ ptr = strstr(line, ":");
+ font.SetLineHeight(atoi(ptr + 1));
+ }
+ else if (strstr(line, "spacebetween") != NULL)
+ {
+ ptr = strstr(line, ":");
+ font.SetSpaceBetween(atoi(ptr + 1));
+ }
+ else if (strstr(line, "spacewidth") != NULL)
+ {
+ ptr = strstr(line, ":");
+ spaceWidth = atoi(ptr + 1);
+ }
+ else
+ {
+ token = strtok(line, " ");
+ if (token)
+ {
+ startOffset = atoi(token);
+
+ // get character
+ token = strtok(NULL, " ");
+ while (token)
+ {
+ uint16_t character;
+ if (strlen(token) == 1)
+ character = (uint8_t) token[0];
+ else
+ character = atoi(token);
+
+ // get EndOffset
+ token = strtok(NULL, " ");
+ endOffset = atoi(token);
+ tmpBitmap = bitmap->SubBitmap(startOffset, l * font.TotalHeight(), endOffset - 1, (l + 1) * font.TotalHeight() - 1);
+ if (spaceWidth > 0)
+ {
+ // calculate width of this character
+ int x;
+ int y;
+ int left = 255;
+ int right = 0;
+ for (y = 0; y < tmpBitmap->Height(); y++)
+ {
+ for (x = 0; x < tmpBitmap->Width(); x++)
+ {
+ if (tmpBitmap->GetPixel(x, y))
+ break;
+ }
+ if (x < tmpBitmap->Width() && x < left)
+ left = x;
+ for (x = tmpBitmap->Width() - 1; x >= 0; x--)
+ {
+ if (tmpBitmap->GetPixel(x, y))
+ break;
+ }
+ if (x >= 0 && x > right)
+ right = x;
+ }
+ if (left > right)
+ {
+ left = 0;
+ right = spaceWidth - 1;
+ }
+ charBitmap = tmpBitmap->SubBitmap(left, 0, right, font.TotalHeight() - 1);
+ font.SetCharacter(character, charBitmap);
+ delete tmpBitmap;
+ }
+ else
+ {
+ font.SetCharacter(character, tmpBitmap);
+ }
+ startOffset = endOffset;
+
+ // get next character
+ token = strtok(NULL, " ");
+ }
+ }
+ l++;
+ }
+ }
+ fclose(descFile);
+ delete bitmap;
+
+ if (font.SaveFNT(fontName))
+ fprintf(stdout,"Font '%s' created successfully\n", fontName);
+
+ return 0;
+}
+
+void usage(void)
+{
+ fprintf(stdout, "\n");
+ fprintf(stdout, "%s v%s\n", prgname, version);
+ fprintf(stdout, "%s is a tool to create *.fnt files that are used by the\n", prgname);
+ fprintf(stdout, " graphlcd plugin for VDR.\n\n");
+ fprintf(stdout, " Usage: %s -f <format> -b bmpfile -d descfile -o outfile\n\n", prgname);
+ fprintf(stdout, " -f --format specifies the format of the bitmap. Possible values are:\n");
+ fprintf(stdout, " PBM : file is an binary PBM file\n" );
+ fprintf(stdout, " -b --bmpfile specifies the name of the bitmap file (*.pbm)\n");
+ fprintf(stdout, " -d --descfile specifies the name of the description file (*.desc)\n");
+ fprintf(stdout, " -o --outfile specifies the name of the output file (*.fnt)\n");
+ fprintf(stdout, "\n" );
+ fprintf(stdout, " example: %s -f PBM -b f12.pbm -d f12.desc -o f12.fnt\n", prgname);
+}