Corrected bug in chart rendering which caused the ordinate label to never get displayed
[pspp] / src / output / cairo.c
index 72cf51c3660eaaf006d2298c0d6636db355dc20c..6229311aa75003988fdc2ae39bcec48a253c370a 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2011, 2012 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
@@ -32,6 +32,7 @@
 #include "output/charts/piechart.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/driver-provider.h"
 #include "output/message-item.h"
@@ -184,7 +185,7 @@ opt (struct output_driver *d, struct string_map *options, const char *key,
    Currently, the input string must be of the form "#RRRRGGGGBBBB"
    Future implementations might allow things like "yellow" and
    "sky-blue-ultra-brown"
- */
+*/
 static void
 parse_color (struct output_driver *d, struct string_map *options,
              const char *key, const char *default_value,
@@ -240,20 +241,15 @@ parse_font (struct output_driver *d, struct string_map *options,
   return desc;
 }
 
-static struct xr_driver *
-xr_allocate (const char *name, int device_type, struct string_map *o)
+
+static void
+apply_options (struct xr_driver *xr, struct string_map *o)
 {
-  int paper_width, paper_length;
-  struct output_driver *d;
-  struct xr_driver *xr;
-  int font_points;
+  struct output_driver *d = &xr->driver;
 
-  xr = xzalloc (sizeof *xr);
-  d = &xr->driver;
-  output_driver_init (d, &cairo_driver_class, name, device_type);
+  int paper_width, paper_length;
 
-  font_points = parse_int (opt (d, o, "font-size", "10000"),
-                           1000, 1000000);
+  int font_points = parse_int (opt (d, o, "font-size", "10000"), 1000, 1000000);
   xr->fonts[XR_FONT_FIXED].desc = parse_font (d, o, "fixed-font", "monospace",
                                               font_points);
   xr->fonts[XR_FONT_PROPORTIONAL].desc = parse_font (d, o, "prop-font",
@@ -277,6 +273,17 @@ xr_allocate (const char *name, int device_type, struct string_map *o)
 
   xr->width = paper_width - xr->left_margin - xr->right_margin;
   xr->length = paper_length - xr->top_margin - xr->bottom_margin;
+}
+
+static struct xr_driver *
+xr_allocate (const char *name, int device_type, struct string_map *o)
+{
+  struct xr_driver *xr = xzalloc (sizeof *xr);
+  struct output_driver *d = &xr->driver;
+
+  output_driver_init (d, &cairo_driver_class, name, device_type);
+
+  apply_options (xr, o);
 
   return xr;
 }
@@ -934,6 +941,8 @@ struct xr_rendering
 #define CHART_WIDTH 500
 #define CHART_HEIGHT 375
 
+
+
 struct xr_driver *
 xr_driver_create (cairo_t *cairo, struct string_map *options)
 {
@@ -971,6 +980,13 @@ xr_rendering_create_text (struct xr_driver *xr, const char *text, cairo_t *cr)
   return r;
 }
 
+void 
+xr_rendering_apply_options (struct xr_rendering *xr, struct string_map *o)
+{
+  if (is_table_item (xr->item))
+    apply_options (xr->xr, o);
+}
+
 struct xr_rendering *
 xr_rendering_create (struct xr_driver *xr, const struct output_item *item,
                      cairo_t *cr)
@@ -1076,6 +1092,8 @@ xr_draw_chart (const struct chart_item *chart_item, cairo_t *cr,
     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
     NOT_REACHED ();
   xrchart_geometry_free (cr, &geom);