/* PSPP - a program for statistical analysis.
- Copyright (C) 2004, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2009, 2010, 2011, 2014, 2015 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
#include <config.h>
#include "output/cairo-chart.h"
+#include "math/decimal.h"
+#include "math/chart-geometry.h"
#include <assert.h>
#include <cairo/cairo.h>
PangoLayout *layout;
double x, y;
- desc = pango_font_description_from_string ("sans serif");
+ desc = pango_font_description_from_string ("Sans");
if (desc == NULL)
{
cairo_new_path (cr);
static void
xrchart_write_scale (cairo_t *cr, struct xrchart_geometry *geom,
- double smin, double smax, int ticks, enum tick_orientation orient)
+ double smin, double smax, enum tick_orientation orient)
{
int s;
+ int ticks;
- const double tick_interval =
- chart_rounded_tick ((smax - smin) / (double) ticks);
+ struct decimal dinterval;
+ struct decimal dlower;
+ struct decimal dupper;
- int upper = ceil (smax / tick_interval);
- int lower = floor (smin / tick_interval);
+ chart_get_scale (smax, smin, &dlower, &dinterval, &ticks);
- geom->axis[orient].max = tick_interval * upper;
- geom->axis[orient].min = tick_interval * lower;
+ dupper = dinterval;
+ decimal_int_multiply (&dupper, ticks);
+ decimal_add (&dupper, &dlower);
+ double tick_interval = decimal_to_double (&dinterval);
+
+ geom->axis[orient].max = decimal_to_double (&dupper);
+ geom->axis[orient].min = decimal_to_double (&dlower);
+
geom->axis[orient].scale = (fabs (geom->axis[orient].data_max - geom->axis[orient].data_min)
- / fabs (geom->axis[orient].max - geom->axis[orient].min));
+ / fabs (geom->axis[orient].max - geom->axis[orient].min));
+
+ struct decimal pos = dlower;
- for (s = 0 ; s < upper - lower; ++s)
+ for (s = 0 ; s < ticks; ++s)
{
- double pos = (s + lower) * tick_interval;
+ char *str = decimal_to_string (&pos);
draw_tick (cr, geom, orient, false,
- s * tick_interval * geom->axis[orient].scale, "%g", pos);
+ s * tick_interval * geom->axis[orient].scale,
+ "%s", str);
+ free (str);
+
+ decimal_add (&pos, &dinterval);
}
}
/* Set the scale for the ordinate */
void
xrchart_write_yscale (cairo_t *cr, struct xrchart_geometry *geom,
- double smin, double smax, int ticks)
+ double smin, double smax)
{
- xrchart_write_scale (cr, geom, smin, smax, ticks, SCALE_ORDINATE);
+ xrchart_write_scale (cr, geom, smin, smax, SCALE_ORDINATE);
}
/* Set the scale for the abscissa */
void
xrchart_write_xscale (cairo_t *cr, struct xrchart_geometry *geom,
- double smin, double smax, int ticks)
+ double smin, double smax)
{
- xrchart_write_scale (cr, geom, smin, smax, ticks, SCALE_ABSCISSA);
+ xrchart_write_scale (cr, geom, smin, smax, SCALE_ABSCISSA);
}
double x_pos = (x - geom->axis[SCALE_ABSCISSA].min) * geom->axis[SCALE_ABSCISSA].scale + geom->axis[SCALE_ABSCISSA].data_min;
double y_pos = (y - geom->axis[SCALE_ORDINATE].min) * geom->axis[SCALE_ORDINATE].scale + geom->axis[SCALE_ORDINATE].data_min;
- xrchart_draw_marker (cr, x_pos, y_pos, XRMARKER_SQUARE, 15);
+ xrchart_draw_marker (cr, x_pos, y_pos, XRMARKER_CIRCLE, 10);
}
void
cairo_line_to (cr, x2, y2);
cairo_stroke (cr);
}
+
+void
+xrchart_text_extents (cairo_t *cr, const struct xrchart_geometry *geom,
+ const char *utf8,
+ double *width, double *height)
+{
+ PangoFontDescription *desc;
+ PangoLayout *layout;
+ int width_pango;
+ int height_pango;
+
+ desc = pango_font_description_from_string ("Sans");
+ if (desc == NULL)
+ return;
+ pango_font_description_set_absolute_size (desc, geom->font_size * PANGO_SCALE);
+ layout = pango_cairo_create_layout (cr);
+ pango_layout_set_font_description (layout, desc);
+ pango_layout_set_text (layout, utf8, -1);
+ pango_layout_get_size (layout, &width_pango, &height_pango);
+ *width = (double) width_pango / PANGO_SCALE;
+ *height = (double) height_pango / PANGO_SCALE;
+ g_object_unref (layout);
+ pango_font_description_free (desc);
+}