fix fontconv image orientation and add fg/bg color options
authorJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 8 Aug 2023 15:25:03 +0000 (18:25 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Tue, 8 Aug 2023 15:25:03 +0000 (18:25 +0300)
menu/tools/fontconv/fontconv.c

index 4ed71e2..988e229 100644 (file)
@@ -25,11 +25,13 @@ struct glyph glyphs[128];
 int num_glyphs;
 int baseline;
 unsigned char *glyphmap;
+float fgcolor[] = {1, 1, 1, 1}, bgcolor[] = {0, 0, 0, 0};
 
 static const char *usage_fmt = "Usage %s [options]\n"
        " -sans: sans-serif font\n"
        " -serif: serif font\n"
        " -size <n>: font size\n"
+       " -bg/-fg <hexcolor>: backdrop/font color\n"
        " -help: print usage and exit\n\n";
 
 int main(int argc, char **argv)
@@ -50,6 +52,19 @@ int main(int argc, char **argv)
                                        fprintf(stderr, "-size must be followed by the font size\n");
                                        return 1;
                                }
+                       } else if(strcmp(argv[i], "-fg") == 0 || strcmp(argv[i], "-bg") == 0) {
+                               unsigned int packed;
+                               char *endp;
+                               float *col;
+                               if(!argv[++i] || ((packed = strtol(argv[i], &endp, 16)), endp == argv[i])) {
+                                       fprintf(stderr, "%s must be followed by a hex/html packed color\n", argv[i - 1]);
+                                       return 1;
+                               }
+                               col = (argv[i - 1][1] == 'f') ? fgcolor : bgcolor;
+                               col[0] = ((packed >> 16) & 0xff) / 255.0f;
+                               col[1] = ((packed >> 8) & 0xff) / 255.0f;
+                               col[2] = (packed & 0xff) / 255.0f;
+
                        } else if(strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "-h") == 0) {
                                printf(usage_fmt, argv[0]);
                                return 0;
@@ -107,7 +122,9 @@ void display(void)
 {
        int i, x, y;
        struct glyph *g;
+       unsigned char *pixptr;
 
+       glClearColor(bgcolor[0], bgcolor[1], bgcolor[2], bgcolor[3]);
        glClear(GL_COLOR_BUFFER_BIT);
 
        glMatrixMode(GL_MODELVIEW);
@@ -118,6 +135,7 @@ void display(void)
 
        num_glyphs = 0;
 
+       glColor4f(fgcolor[0], fgcolor[1], fgcolor[2], fgcolor[3]);
        glRasterPos2i(x, y);
        for(i=32; i<128; i++) {
                int width = glutBitmapWidth(font, i);
@@ -144,7 +162,11 @@ void display(void)
                glutReshapeWindow(win_width, win_height / 2);
        }
 
-       glReadPixels(0, 0, win_width, win_height, GL_LUMINANCE, GL_UNSIGNED_BYTE, glyphmap);
+       pixptr = glyphmap;
+       for(i=0; i<win_height; i++) {
+               glReadPixels(0, win_height - i - 1, win_width, 1, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixptr);
+               pixptr += win_width;
+       }
 
        glutSwapBuffers();
 }