X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcairo.c;h=7165a50fd675382670721bd2e621d944b699507c;hb=24c5f7c629e68801492d7ca1766953a2a954a820;hp=89013c2a0c65f5c5b58f1ea53001f4ff0305e431;hpb=a50c92abb67c3086a56c754cfb14a8873eaee6eb;p=pspp diff --git a/src/output/cairo.c b/src/output/cairo.c index 89013c2a0c..7165a50fd6 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -53,7 +53,6 @@ #include #include -#include "gl/error.h" #include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" @@ -66,8 +65,7 @@ #define V TABLE_VERT /* Measurements as we present to the rest of PSPP. */ -#define XR_POINT PANGO_SCALE -#define XR_INCH (XR_POINT * 72) +#define XR_POINT 1000 /* Conversions to and from points. */ static double @@ -132,8 +130,8 @@ struct xr_driver int line_space; /* Space between lines. */ int line_width; /* Width of lines. */ - double bg_red, bg_green, bg_blue; /* Background color */ - double fg_red, fg_green, fg_blue; /* Foreground color */ + struct xr_color bg; /* Background color */ + struct xr_color fg; /* Foreground color */ /* Internal state. */ struct render_params *params; @@ -186,10 +184,10 @@ opt (struct output_driver *d, struct string_map *options, const char *key, Future implementations might allow things like "yellow" and "sky-blue-ultra-brown" */ -static void +void parse_color (struct output_driver *d, struct string_map *options, - const char *key, const char *default_value, - double *dred, double *dgreen, double *dblue) + const char *key, const char *default_value, + struct xr_color *color) { int red, green, blue; char *string = parse_string (opt (d, options, key, default_value)); @@ -207,9 +205,9 @@ parse_color (struct output_driver *d, struct string_map *options, free (string); /* Convert 16 bit ints to float */ - *dred = red / (double) 0xFFFF; - *dgreen = green / (double) 0xFFFF; - *dblue = blue / (double) 0xFFFF; + color->red = red / (double) 0xFFFF; + color->green = green / (double) 0xFFFF; + color->blue = blue / (double) 0xFFFF; } static PangoFontDescription * @@ -225,7 +223,7 @@ parse_font (struct output_driver *d, struct string_map *options, desc = pango_font_description_from_string (string); if (desc == NULL) { - error (0, 0, _("`%s': bad font specification"), string); + msg (MW, _("`%s': bad font specification"), string); /* Fall back to DEFAULT_VALUE, which had better be a valid font description. */ @@ -268,13 +266,13 @@ apply_options (struct xr_driver *xr, struct string_map *o) xr->fonts[XR_FONT_EMPHASIS].desc = parse_font (d, o, "emph-font", "serif italic", font_points); - xr->line_gutter = XR_POINT; + xr->line_gutter = parse_dimension (opt (d, o, "gutter", "3pt")); xr->line_space = XR_POINT; xr->line_width = XR_POINT / 2; xr->page_number = 0; - parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &xr->bg_red, &xr->bg_green, &xr->bg_blue); - parse_color (d, o, "foreground-color", "#000000000000", &xr->fg_red, &xr->fg_green, &xr->fg_blue); + parse_color (d, o, "background-color", "#FFFFFFFFFFFF", &xr->bg); + parse_color (d, o, "foreground-color", "#000000000000", &xr->fg); parse_paper_size (opt (d, o, "paper-size", ""), &paper_width, &paper_length); xr->left_margin = parse_dimension (opt (d, o, "left-margin", ".5in")); @@ -349,7 +347,7 @@ xr_set_cairo (struct xr_driver *xr, cairo_t *cairo) } } - cairo_set_source_rgb (xr->cairo, xr->fg_red, xr->fg_green, xr->fg_blue); + cairo_set_source_rgb (xr->cairo, xr->fg.red, xr->fg.green, xr->fg.blue); return true; } @@ -380,7 +378,7 @@ xr_create (const char *file_name, enum settings_output_devices device_type, status = cairo_surface_status (surface); if (status != CAIRO_STATUS_SUCCESS) { - error (0, 0, _("error opening output file `%s': %s"), + msg (ME, _("error opening output file `%s': %s"), file_name, cairo_status_to_string (status)); cairo_surface_destroy (surface); goto error; @@ -397,7 +395,7 @@ xr_create (const char *file_name, enum settings_output_devices device_type, if (xr->width / xr->char_width < MIN_WIDTH) { - error (0, 0, _("The defined page is not wide enough to hold at least %d " + msg (ME, _("The defined page is not wide enough to hold at least %d " "characters in the default font. In fact, there's only " "room for %d characters."), MIN_WIDTH, @@ -407,7 +405,7 @@ xr_create (const char *file_name, enum settings_output_devices device_type, if (xr->length / xr->char_height < MIN_LENGTH) { - error (0, 0, _("The defined page is not long enough to hold at least %d " + msg (ME, _("The defined page is not long enough to hold at least %d " "lines in the default font. In fact, there's only " "room for %d lines."), MIN_LENGTH, @@ -458,7 +456,7 @@ xr_destroy (struct output_driver *driver) cairo_surface_finish (cairo_get_target (xr->cairo)); status = cairo_status (xr->cairo); if (status != CAIRO_STATUS_SUCCESS) - error (0, 0, _("error drawing output for %s driver: %s"), + msg (ME, _("error drawing output for %s driver: %s"), output_driver_get_name (driver), cairo_status_to_string (status)); cairo_destroy (xr->cairo); @@ -524,6 +522,8 @@ xr_submit (struct output_driver *driver, const struct output_item *output_item) { struct xr_driver *xr = xr_driver_cast (driver); + output_driver_track_current_command (output_item, &xr->command_name); + xr_driver_output_item (xr, output_item); while (xr_driver_need_new_page (xr)) { @@ -551,7 +551,7 @@ xr_driver_next_page (struct xr_driver *xr, cairo_t *cairo) if (cairo != NULL) { cairo_save (cairo); - cairo_set_source_rgb (cairo, xr->bg_red, xr->bg_green, xr->bg_blue); + cairo_set_source_rgb (cairo, xr->bg.red, xr->bg.green, xr->bg.blue); cairo_rectangle (cairo, 0, 0, xr->width, xr->length); cairo_fill (cairo); cairo_restore (cairo); @@ -868,16 +868,7 @@ xr_layout_cell (struct xr_driver *xr, const struct table_cell *cell, cairo_restore (xr->cairo); } - if (width != NULL || height != NULL) - { - int w, h; - - pango_layout_get_size (font->layout, &w, &h); - if (width != NULL) - *width = w; - if (height != NULL) - *height = h; - } + pango_layout_get_size (font->layout, width, height); } static void @@ -1014,8 +1005,8 @@ xr_rendering_measure (struct xr_rendering *r, int *w, int *h) { int w0 = render_page_get_size (r->page, H); int w1 = r->title_width; - *w = MAX (w0, w1) / 1024; - *h = (render_page_get_size (r->page, V) + r->title_height) / 1024; + *w = MAX (w0, w1) / XR_POINT; + *h = (render_page_get_size (r->page, V) + r->title_height) / XR_POINT; } else { @@ -1047,8 +1038,9 @@ xr_rendering_draw (struct xr_rendering *r, cairo_t *cr, } xr->y = r->title_height; - render_page_draw_region (r->page, x * 1024, (y * 1024) - r->title_height, - w * 1024, h * 1024); + render_page_draw_region (r->page, + x * XR_POINT, (y * XR_POINT) - r->title_height, + w * XR_POINT, h * XR_POINT); } else xr_draw_chart (to_chart_item (r->item), cr, @@ -1088,7 +1080,10 @@ xr_draw_chart (const struct chart_item *chart_item, cairo_t *cr, char * xr_draw_png_chart (const struct chart_item *item, - const char *file_name_template, int number) + const char *file_name_template, int number, + const struct xr_color *fg, + const struct xr_color *bg + ) { const int width = 640; const int length = 480; @@ -1109,13 +1104,16 @@ xr_draw_png_chart (const struct chart_item *item, surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, length); cr = cairo_create (surface); - cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_source_rgb (cr, bg->red, bg->green, bg->blue); + cairo_paint (cr); + + cairo_set_source_rgb (cr, fg->red, fg->green, fg->blue); xr_draw_chart (item, cr, 0.0, 0.0, width, length); status = cairo_surface_write_to_png (surface, file_name); if (status != CAIRO_STATUS_SUCCESS) - error (0, 0, _("error writing output file `%s': %s"), + msg (ME, _("error writing output file `%s': %s"), file_name, cairo_status_to_string (status)); cairo_destroy (cr);