X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=spritext.c;h=62e1d2f681539976672a8c3103c18bd414801604;hb=3c2d06be34f800ee5fee855bd2b9bb55f661fc8d;hp=ef7c9a2470608cabd2542061d25fa47de45fdfb4;hpb=96d28dc64ae59b5312fd32404561c2307bad8b50;p=spritext diff --git a/spritext.c b/spritext.c index ef7c9a2..62e1d2f 100644 --- a/spritext.c +++ b/spritext.c @@ -30,6 +30,83 @@ get_max_width (cairo_t *cr, char *characters); double get_max_height (cairo_t *cr, char *characters); +typedef struct { + char *family; + double size; + struct { + double red; + double green; + double blue; + } color; +} args_t; + +static void +parse_args (args_t *args) +{ + /* 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]; + char fontname[20]; + cgiFormStringNoNewlines("fontname", fontname, 20); + cgiFormInteger("fontsize", &fontsize, 50); + cgiFormStringNoNewlines("format", format, 5); + cgiFormStringNoNewlines("fillcolor", fillcolor, 20); + + 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; +#endif +} + +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; + + error = FT_Init_FreeType( &library ); + if ( error ) { + fprintf (stderr, "Fatal error initializing freetype.\n"); + exit (1); + } + + error = FT_New_Face( library, font_filename, + 0, + &ft_face ); + if ( error == FT_Err_Unknown_File_Format ) { + fprintf (stderr, "Unsupported font format: %s\n", font_filename); + exit (1); + } else if ( error ) { + fprintf (stderr, "Failed to open file: %s\n", font_filename); + exit (1); + } + + return ft_face; +} + int main (void) { @@ -51,27 +128,13 @@ main (void) }; int i; + args_t args; + FT_Face ft_face; + FT_UInt left_index, right_index; + FT_Bool use_kerning; + FT_Vector kerning; - /* 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; + parse_args (&args); #if USE_CGIC if (outputJson) @@ -82,24 +145,7 @@ main (void) } #endif - int error; - 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 ) - printf("error"); - - error = FT_New_Face( library,"/srv/rdworth.org/cgi-bin/Verdana.ttf", - 0, - &ft_face ); - if ( error == FT_Err_Unknown_File_Format ) - printf("File opened. Font format unsupported."); - else if ( error ) - printf("Could not be open or read or broken."); + ft_face = load_ft_face_for_family (args.family); use_kerning = FT_HAS_KERNING( ft_face ); @@ -121,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); @@ -149,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; @@ -205,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); @@ -291,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);