]> git.cworth.org Git - spritext/blobdiff - spritext.c
Move font loading into its own function
[spritext] / spritext.c
index 1405c48c4ce1d166a2220d42501c4c13abf7bf3a..62e1d2f681539976672a8c3103c18bd414801604 100644 (file)
@@ -30,65 +30,62 @@ get_max_width (cairo_t *cr, char *characters);
 double
 get_max_height (cairo_t *cr, char *characters);
 
-int
-main (void)
+typedef struct {
+    char *family;
+    double size;
+    struct {
+       double red;
+       double green;
+       double blue;
+    } color;
+} args_t;
+
+static void
+parse_args (args_t *args)
 {
-    const char font_filename[] = "/srv/rdworth.org/cgi-bin/Verdana.ttf";
-    char outputJson = FALSE;
-
-    char characters[] = {
-       '!', '"', '#', '$', '%', '&','\'', '(',
-       ')', '*', '+', ',', '-', '.', '/', '0',
-       '1', '2', '3', '4', '5', '6', '7', '8',
-       '9', ':', ';', '<', '=', '>', '?', '@',
-       'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
-       'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
-       'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
-       'Y', 'Z', '[','\\', ']', '^', '_', '`',
-       'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
-       'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
-       'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
-       'y', 'z', '{', '|', '}', '~'
-    };
-
-    int i;
-
+    /* First some defaults */
+    args->family = "Vera";
+    args->size = 20;
+    args->color.red = 0.0;
+    args->color.green = 0.0;
+    args->color.blue = 0.0;
+
+    /* XXX: Next, we should override the defaults based on
+     * command-line arguments. */
+
+    /* XXX: Finally, we'll want to allow CGI-based arguments as
+     * well. */
+#if USE_CGIG
     /* QueryString */
     int fontsize;
     char format[5];
     char fillcolor[20];
-
-#if USE_CGIG
     char fontname[20];
     cgiFormStringNoNewlines("fontname", fontname, 20);
     cgiFormInteger("fontsize", &fontsize, 50);
     cgiFormStringNoNewlines("format", format, 5);
     cgiFormStringNoNewlines("fillcolor", fillcolor, 20);
-#endif
 
     int fillcolor_red;
     int fillcolor_green;
     int fillcolor_blue;
     sscanf (fillcolor, " rgb : %d , %d , %d ", &fillcolor_red, &fillcolor_green, &fillcolor_blue);
-
     if ( format[0] == 'j' && format[1] == 's' && format[2] == 'o' && format[3] == 'n' )
        outputJson = TRUE;
-
-#if USE_CGIC
-    if (outputJson)
-    {
-       cgiHeaderContentType("application/json");
-    } else {
-       cgiHeaderContentType("image/png");
-    }
 #endif
+}
 
-    int error;  
+static FT_Face
+load_ft_face_for_family (const char *family)
+{
+    /* XXX: Instead of a hard-coded filename here, we should really be
+     * taking family and using fontconfig to map that to a
+     * filename. */
+    const char font_filename[] = "./Vera.ttf";
+
+    int error;
+    FT_Face     ft_face;
     FT_Library         library;
-    FT_Face    ft_face;
-    FT_Bool     use_kerning;
-    FT_UInt     left_index, right_index;
-    FT_Vector   kerning;
 
     error = FT_Init_FreeType( &library );
     if ( error ) {
@@ -107,6 +104,49 @@ main (void)
        exit (1);
     }
 
+    return ft_face;
+}
+
+int
+main (void)
+{
+    char outputJson = FALSE;
+
+    char characters[] = {
+       '!', '"', '#', '$', '%', '&','\'', '(',
+       ')', '*', '+', ',', '-', '.', '/', '0',
+       '1', '2', '3', '4', '5', '6', '7', '8',
+       '9', ':', ';', '<', '=', '>', '?', '@',
+       'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+       'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+       'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+       'Y', 'Z', '[','\\', ']', '^', '_', '`',
+       'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
+       'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
+       'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
+       'y', 'z', '{', '|', '}', '~'
+    };
+
+    int i;
+    args_t args;
+    FT_Face ft_face;
+    FT_UInt     left_index, right_index;
+    FT_Bool     use_kerning;
+    FT_Vector   kerning;
+
+    parse_args (&args);
+
+#if USE_CGIC
+    if (outputJson)
+    {
+       cgiHeaderContentType("application/json");
+    } else {
+       cgiHeaderContentType("image/png");
+    }
+#endif
+
+    ft_face = load_ft_face_for_family (args.family);
+
     use_kerning = FT_HAS_KERNING( ft_face );
 
     /* Compute max-width and max-height */
@@ -127,7 +167,7 @@ main (void)
     cr_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
     cairo_set_font_face (cr, cr_face);
 
-    cairo_set_font_size (cr, fontsize);
+    cairo_set_font_size (cr, args.size);
 
     cairo_set_line_width (cr, 1.0);
 
@@ -155,7 +195,7 @@ main (void)
     cr_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
     cairo_set_font_face (cr, cr_face);
 
-    cairo_set_font_size (cr, fontsize);
+    cairo_set_font_size (cr, args.size);
 
     cairo_text_extents_t extents;
     double x = 0.0;
@@ -211,10 +251,10 @@ main (void)
   
        cairo_move_to (cr, x, y);
        cairo_set_source_rgb (cr, 0., 0., 0.); // black
-       if ( 0 <= fillcolor_red && fillcolor_red <= 255.0
-            && 0 <= fillcolor_green && fillcolor_green <= 255.0
-            && 0 <= fillcolor_blue && fillcolor_blue <= 255.0 )
-           cairo_set_source_rgb (cr, fillcolor_red / 255.0, fillcolor_green / 255.0, fillcolor_blue / 255.0);
+       cairo_set_source_rgb (cr,
+                             args.color.red,
+                             args.color.green,
+                             args.color.blue);
        cairo_text_path (cr, string);
        cairo_fill (cr);
 
@@ -297,6 +337,9 @@ cairo_pattern_destroy (gradient);
     }
 #endif
 
+    cairo_surface_write_to_png (surface, "spritext-output.png");
+    printf ("Result written to spritext-output.png\n");
+
     cairo_destroy (cr);
 
     cairo_surface_destroy (surface);