-void
-xr_rendering_draw (struct xr_rendering *r, cairo_t *cr)
-{
- if (r->chart == NULL)
- {
- struct xr_driver *xr = r->xr;
-
- xr_set_cairo (xr, cr);
- xr->y = 0;
- render_page_draw (r->page);
- }
- else
- xr_draw_chart (r->chart, cr, 0, 0, CHART_WIDTH, CHART_HEIGHT);
-}
-
-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_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
- 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 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", (int) (number_pos - file_name_template),
- file_name_template, number, number_pos + 1);
- else
- file_name = xstrdup (file_name_template);
-
- surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, length);
- cr = cairo_create (surface);
-
- cairo_save (cr);
- cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
- cairo_rectangle (cr, 0, 0, width, length);
- cairo_fill (cr);
- cairo_restore (cr);
-
- cairo_set_source_rgb (cr, 0.0, 0.0, 0.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)
- error (0, 0, _("error writing output file \"%s\": %s"),
- file_name, cairo_status_to_string (status));
-
- cairo_destroy (cr);
- cairo_surface_destroy (surface);
-
- return file_name;
-}
-\f
-struct xr_table_state
- {
- struct xr_render_fsm fsm;
- struct table_item *table_item;
- struct render_break x_break;
- struct render_break y_break;
- int caption_height;
- };
-
-static bool
-xr_table_render (struct xr_render_fsm *fsm, struct xr_driver *xr)
-{
- struct xr_table_state *ts = UP_CAST (fsm, struct xr_table_state, fsm);
-
- for (;;)
- {
- struct render_page *y_slice;
- int space;
-
- while (!render_break_has_next (&ts->y_break))
- {
- struct render_page *x_slice;
-
- render_break_destroy (&ts->y_break);
- if (!render_break_has_next (&ts->x_break))
- return false;
-
- x_slice = render_break_next (&ts->x_break, xr->width);
- render_break_init (&ts->y_break, x_slice, V);
- }
-
- space = xr->length - xr->y;
- if (render_break_next_size (&ts->y_break) > space)
- {
- assert (xr->y > 0);
- return true;
- }
-
- y_slice = render_break_next (&ts->y_break, space);
- if (ts->caption_height)
- {
- if (xr->cairo)
- {
- struct table_cell cell;
- int bb[TABLE_N_AXES][2];
-
- xr_init_caption_cell (table_item_get_caption (ts->table_item),
- &cell);
- bb[H][0] = 0;
- bb[H][1] = xr->width;
- bb[V][0] = 0;
- bb[V][1] = ts->caption_height;
- xr_draw_cell (xr, &cell, bb, bb);
- }
- xr->y += ts->caption_height;
- ts->caption_height = 0;
- }
-
- if (xr->cairo)
- render_page_draw (y_slice);
- xr->y += render_page_get_size (y_slice, V);
- render_page_unref (y_slice);
- }