From 314b82f0ec6ba67330038df4cca739eda08270b4 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 6 Dec 2020 22:06:57 -0800 Subject: [PATCH] cairo: Move chart code into cairo-chart. --- src/output/ascii.c | 2 +- src/output/cairo-chart.c | 129 +++++++++++++++++++++++++++++++++++++++ src/output/cairo-chart.h | 14 +++++ src/output/cairo-fsm.c | 32 ---------- src/output/cairo.c | 126 -------------------------------------- src/output/cairo.h | 9 --- src/output/html.c | 2 +- src/output/tex.c | 2 +- 8 files changed, 146 insertions(+), 170 deletions(-) diff --git a/src/output/ascii.c b/src/output/ascii.c index d9dcd0b92e..1b18f85f4e 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -47,7 +47,7 @@ #include "libpspp/u8-line.h" #include "libpspp/version.h" #include "output/ascii.h" -#include "output/cairo.h" +#include "output/cairo-chart.h" #include "output/chart-item-provider.h" #include "output/driver-provider.h" #include "output/message-item.h" diff --git a/src/output/cairo-chart.c b/src/output/cairo-chart.c index 00eb98f5f9..809da37c2a 100644 --- a/src/output/cairo-chart.c +++ b/src/output/cairo-chart.c @@ -20,6 +20,7 @@ #include "output/cairo-chart.h" #include "math/chart-geometry.h" +#include #include #include #include @@ -31,9 +32,20 @@ #include #include "libpspp/assertion.h" +#include "libpspp/message.h" #include "math/chart-geometry.h" #include "output/cairo.h" #include "output/chart-item.h" +#include "output/charts/barchart.h" +#include "output/charts/boxplot.h" +#include "output/charts/np-plot.h" +#include "output/charts/piechart.h" +#include "output/charts/plot-hist.h" +#include "output/charts/roc-chart.h" +#include "output/charts/scatterplot.h" +#include "output/charts/scree.h" +#include "output/charts/spreadlevel-plot.h" +#include "output/table.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" @@ -608,4 +620,121 @@ xrchart_line(cairo_t *cr, const struct xrchart_geometry *geom, cairo_line_to (cr, x2, y2); cairo_stroke (cr); } + +void +xr_draw_chart (const struct chart_item *chart_item, cairo_t *cr, + double width, double height) +{ + struct xrchart_geometry geom; + + cairo_save (cr); + cairo_translate (cr, 0, height); + cairo_scale (cr, 1.0, -1.0); + xrchart_geometry_init (cr, &geom, width, height); + if (is_boxplot (chart_item)) + xrchart_draw_boxplot (chart_item, cr, &geom); + else if (is_histogram_chart (chart_item)) + xrchart_draw_histogram (chart_item, cr, &geom); + else if (is_np_plot_chart (chart_item)) + xrchart_draw_np_plot (chart_item, cr, &geom); + else if (is_piechart (chart_item)) + xrchart_draw_piechart (chart_item, cr, &geom); + else if (is_barchart (chart_item)) + xrchart_draw_barchart (chart_item, cr, &geom); + else if (is_roc_chart (chart_item)) + xrchart_draw_roc (chart_item, cr, &geom); + else if (is_scree (chart_item)) + xrchart_draw_scree (chart_item, cr, &geom); + else if (is_spreadlevel_plot_chart (chart_item)) + xrchart_draw_spreadlevel (chart_item, cr, &geom); + else if (is_scatterplot_chart (chart_item)) + xrchart_draw_scatterplot (chart_item, cr, &geom); + else + NOT_REACHED (); + xrchart_geometry_free (cr, &geom); + + cairo_restore (cr); +} + +char * +xr_draw_png_chart (const struct chart_item *item, + const char *file_name_template, int number, + const struct cell_color *fg, + const struct cell_color *bg) +{ + const int width = 640; + const int length = 480; + + cairo_surface_t *surface; + cairo_status_t status; + const char *number_pos; + char *file_name; + cairo_t *cr; + + number_pos = strchr (file_name_template, '#'); + if (number_pos != NULL) + file_name = xasprintf ("%.*s%d%s.png", (int) (number_pos - file_name_template), + file_name_template, number, number_pos + 1); + else + file_name = xasprintf ("%s.png", file_name_template); + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, length); + cr = cairo_create (surface); + + cairo_set_source_rgb (cr, bg->r / 255.0, bg->g / 255.0, bg->b / 255.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, fg->r / 255.0, fg->g / 255.0, fg->b / 255.0); + + xr_draw_chart (item, cr, width, length); + + status = cairo_surface_write_to_png (surface, file_name); + if (status != CAIRO_STATUS_SUCCESS) + msg (ME, _("error writing output file `%s': %s"), + file_name, cairo_status_to_string (status)); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + return file_name; +} + + +char * +xr_draw_eps_chart (const struct chart_item *item, + const char *file_name_template, int number, + const struct cell_color *fg, + const struct cell_color *bg) +{ + const int width = 640; + const int length = 480; + + cairo_surface_t *surface; + const char *number_pos; + char *file_name; + cairo_t *cr; + + number_pos = strchr (file_name_template, '#'); + if (number_pos != NULL) + file_name = xasprintf ("%.*s%d%s.eps", (int) (number_pos - file_name_template), + file_name_template, number, number_pos + 1); + else + file_name = xasprintf ("%s.eps", file_name_template); + + surface = cairo_ps_surface_create (file_name, width, length); + cairo_ps_surface_set_eps (surface, true); + cr = cairo_create (surface); + + cairo_set_source_rgb (cr, bg->r / 255.0, bg->g / 255.0, bg->b / 255.0); + cairo_paint (cr); + + cairo_set_source_rgb (cr, fg->r / 255.0, fg->g / 255.0, fg->b / 255.0); + + xr_draw_chart (item, cr, width, length); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + return file_name; +} diff --git a/src/output/cairo-chart.h b/src/output/cairo-chart.h index 68f2978283..bbcc606d31 100644 --- a/src/output/cairo-chart.h +++ b/src/output/cairo-chart.h @@ -23,6 +23,7 @@ #include "libpspp/compiler.h" struct chart_item; +struct cell_color; struct xrchart_colour { @@ -177,4 +178,17 @@ void xrchart_draw_spreadlevel (const struct chart_item *, cairo_t *, void xrchart_draw_scatterplot (const struct chart_item *, cairo_t *, struct xrchart_geometry *); +void xr_draw_chart (const struct chart_item *, cairo_t *, + double width, double height); + +char *xr_draw_png_chart (const struct chart_item *, + const char *file_name_template, int number, + const struct cell_color *fg, + const struct cell_color *bg); + +char *xr_draw_eps_chart (const struct chart_item *item, + const char *file_name_template, int number, + const struct cell_color *fg, + const struct cell_color *bg); + #endif /* output/cairo-chart.h */ diff --git a/src/output/cairo-fsm.c b/src/output/cairo-fsm.c index 0769f47c01..73231dba4e 100644 --- a/src/output/cairo-fsm.c +++ b/src/output/cairo-fsm.c @@ -1188,38 +1188,6 @@ xr_fsm_draw_table (struct xr_fsm *fsm, int space) return used; } -static void -xr_draw_chart (const struct chart_item *chart_item, cairo_t *cr, - double width, double height) -{ - struct xrchart_geometry geom; - - cairo_translate (cr, 0, height); - cairo_scale (cr, 1.0, -1.0); - xrchart_geometry_init (cr, &geom, width, height); - if (is_boxplot (chart_item)) - xrchart_draw_boxplot (chart_item, cr, &geom); - else if (is_histogram_chart (chart_item)) - xrchart_draw_histogram (chart_item, cr, &geom); - else if (is_np_plot_chart (chart_item)) - xrchart_draw_np_plot (chart_item, cr, &geom); - else if (is_piechart (chart_item)) - xrchart_draw_piechart (chart_item, cr, &geom); - else if (is_barchart (chart_item)) - xrchart_draw_barchart (chart_item, cr, &geom); - else if (is_roc_chart (chart_item)) - xrchart_draw_roc (chart_item, cr, &geom); - else if (is_scree (chart_item)) - xrchart_draw_scree (chart_item, cr, &geom); - else if (is_spreadlevel_plot_chart (chart_item)) - xrchart_draw_spreadlevel (chart_item, cr, &geom); - else if (is_scatterplot_chart (chart_item)) - xrchart_draw_scatterplot (chart_item, cr, &geom); - else - NOT_REACHED (); - xrchart_geometry_free (cr, &geom); -} - static int xr_fsm_draw_chart (struct xr_fsm *fsm, int space) { diff --git a/src/output/cairo.c b/src/output/cairo.c index 558f9e56a5..db0de7fe39 100644 --- a/src/output/cairo.c +++ b/src/output/cairo.c @@ -31,15 +31,6 @@ #include "output/cairo-chart.h" #include "output/cairo-fsm.h" #include "output/chart-item-provider.h" -#include "output/charts/boxplot.h" -#include "output/charts/np-plot.h" -#include "output/charts/piechart.h" -#include "output/charts/barchart.h" -#include "output/charts/plot-hist.h" -#include "output/charts/roc-chart.h" -#include "output/charts/spreadlevel-plot.h" -#include "output/charts/scree.h" -#include "output/charts/scatterplot.h" #include "output/driver-provider.h" #include "output/group-item.h" #include "output/message-item.h" @@ -754,120 +745,3 @@ xr_driver_destroy (struct xr_driver *xr) output_driver_destroy (&xr->driver); } } -static void -xr_draw_chart (const struct chart_item *chart_item, cairo_t *cr, - double x, double y, double width, double height) -{ - struct xrchart_geometry geom; - - cairo_save (cr); - cairo_translate (cr, x, y + height); - cairo_scale (cr, 1.0, -1.0); - xrchart_geometry_init (cr, &geom, width, height); - if (is_boxplot (chart_item)) - xrchart_draw_boxplot (chart_item, cr, &geom); - else if (is_histogram_chart (chart_item)) - xrchart_draw_histogram (chart_item, cr, &geom); - else if (is_np_plot_chart (chart_item)) - xrchart_draw_np_plot (chart_item, cr, &geom); - else if (is_piechart (chart_item)) - xrchart_draw_piechart (chart_item, cr, &geom); - else if (is_barchart (chart_item)) - xrchart_draw_barchart (chart_item, cr, &geom); - else if (is_roc_chart (chart_item)) - xrchart_draw_roc (chart_item, cr, &geom); - else if (is_scree (chart_item)) - xrchart_draw_scree (chart_item, cr, &geom); - else if (is_spreadlevel_plot_chart (chart_item)) - xrchart_draw_spreadlevel (chart_item, cr, &geom); - else if (is_scatterplot_chart (chart_item)) - xrchart_draw_scatterplot (chart_item, cr, &geom); - else - NOT_REACHED (); - xrchart_geometry_free (cr, &geom); - - cairo_restore (cr); -} - -char * -xr_draw_png_chart (const struct chart_item *item, - const char *file_name_template, int number, - const struct cell_color *fg, - const struct cell_color *bg) -{ - const int width = 640; - const int length = 480; - - cairo_surface_t *surface; - cairo_status_t status; - const char *number_pos; - char *file_name; - cairo_t *cr; - - number_pos = strchr (file_name_template, '#'); - if (number_pos != NULL) - file_name = xasprintf ("%.*s%d%s.png", (int) (number_pos - file_name_template), - file_name_template, number, number_pos + 1); - else - file_name = xasprintf ("%s.png", file_name_template); - - surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, length); - cr = cairo_create (surface); - - cairo_set_source_rgb (cr, bg->r / 255.0, bg->g / 255.0, bg->b / 255.0); - cairo_paint (cr); - - cairo_set_source_rgb (cr, fg->r / 255.0, fg->g / 255.0, fg->b / 255.0); - - 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) - msg (ME, _("error writing output file `%s': %s"), - file_name, cairo_status_to_string (status)); - - cairo_destroy (cr); - cairo_surface_destroy (surface); - - return file_name; -} - - -char * -xr_draw_eps_chart (const struct chart_item *item, - const char *file_name_template, int number, - const struct cell_color *fg, - const struct cell_color *bg) -{ - const int width = 640; - const int length = 480; - - cairo_surface_t *surface; - const char *number_pos; - char *file_name; - cairo_t *cr; - - number_pos = strchr (file_name_template, '#'); - if (number_pos != NULL) - file_name = xasprintf ("%.*s%d%s.eps", (int) (number_pos - file_name_template), - file_name_template, number, number_pos + 1); - else - file_name = xasprintf ("%s.eps", file_name_template); - - surface = cairo_ps_surface_create (file_name, width, length); - cairo_ps_surface_set_eps (surface, true); - cr = cairo_create (surface); - - cairo_set_source_rgb (cr, bg->r / 255.0, bg->g / 255.0, bg->b / 255.0); - cairo_paint (cr); - - cairo_set_source_rgb (cr, fg->r / 255.0, fg->g / 255.0, fg->b / 255.0); - - xr_draw_chart (item, cr, 0.0, 0.0, width, length); - - cairo_destroy (cr); - cairo_surface_destroy (surface); - - return file_name; -} - diff --git a/src/output/cairo.h b/src/output/cairo.h index 6a0170038c..50bbc372fe 100644 --- a/src/output/cairo.h +++ b/src/output/cairo.h @@ -72,15 +72,6 @@ bool xr_driver_need_new_page (const struct xr_driver *); bool xr_driver_is_page_blank (const struct xr_driver *); /* Render charts with Cairo. */ -char *xr_draw_png_chart (const struct chart_item *, - const char *file_name_template, int number, - const struct cell_color *fg, - const struct cell_color *bg); - -char *xr_draw_eps_chart (const struct chart_item *item, - const char *file_name_template, int number, - const struct cell_color *fg, - const struct cell_color *bg); #endif /* HAVE_CAIRO */ diff --git a/src/output/html.c b/src/output/html.c index 9498561a54..f8ce21ce5d 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -33,7 +33,7 @@ #include "libpspp/i18n.h" #include "libpspp/message.h" #include "libpspp/version.h" -#include "output/cairo.h" +#include "output/cairo-chart.h" #include "output/chart-item.h" #include "output/driver-provider.h" #include "output/message-item.h" diff --git a/src/output/tex.c b/src/output/tex.c index 01a5a2816c..722549097b 100644 --- a/src/output/tex.c +++ b/src/output/tex.c @@ -36,7 +36,7 @@ #include "libpspp/message.h" #include "libpspp/temp-file.h" #include "libpspp/version.h" -#include "output/cairo.h" +#include "output/cairo-chart.h" #include "output/chart-item.h" #include "output/driver-provider.h" #include "output/message-item.h" -- 2.30.2