projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge 'master' into 'psppsheet'.
[pspp]
/
src
/
output
/
cairo-chart.c
diff --git
a/src/output/cairo-chart.c
b/src/output/cairo-chart.c
index 81c770354cea82380ba4fc1128431bd662d77618..78f5fabab7249ae2fdfff448be9891f120cb40f1 100644
(file)
--- a/
src/output/cairo-chart.c
+++ b/
src/output/cairo-chart.c
@@
-46,13
+46,14
@@
void
xrchart_geometry_init (cairo_t *cr, struct xrchart_geometry *geom,
double width, double length)
{
xrchart_geometry_init (cairo_t *cr, struct xrchart_geometry *geom,
double width, double length)
{
- /* Set default chartetry. */
+ /* Set default chart
geom
etry. */
geom->axis[SCALE_ORDINATE].data_max = 0.900 * length;
geom->axis[SCALE_ORDINATE].data_max = 0.900 * length;
- geom->axis[SCALE_ABSCISSA].data_max = 0.800 * width;
geom->axis[SCALE_ORDINATE].data_min = 0.120 * length;
geom->axis[SCALE_ORDINATE].data_min = 0.120 * length;
+
geom->axis[SCALE_ABSCISSA].data_min = 0.150 * width;
geom->axis[SCALE_ABSCISSA].data_min = 0.150 * width;
- geom->abscissa_top = 0.070 * length;
- geom->ordinate_right = 0.120 * width;
+ geom->axis[SCALE_ABSCISSA].data_max = 0.800 * width;
+ geom->abscissa_bottom = 0.070 * length;
+ geom->ordinate_left = 0.050 * width;
geom->title_bottom = 0.920 * length;
geom->legend_left = 0.810 * width;
geom->legend_right = width;
geom->title_bottom = 0.920 * length;
geom->legend_left = 0.810 * width;
geom->legend_right = width;
@@
-150,8
+151,8
@@
xrchart_draw_marker (cairo_t *cr, double x, double y,
}
void
}
void
-xrchart_label (cairo_t *cr, int horz_justify, int vert_justify,
-
double font_size, const char *string
)
+xrchart_label
_rotate
(cairo_t *cr, int horz_justify, int vert_justify,
+
double font_size, const char *string, double angle
)
{
PangoFontDescription *desc;
PangoLayout *layout;
{
PangoFontDescription *desc;
PangoLayout *layout;
@@
-166,6
+167,7
@@
xrchart_label (cairo_t *cr, int horz_justify, int vert_justify,
pango_font_description_set_absolute_size (desc, font_size * PANGO_SCALE);
cairo_save (cr);
pango_font_description_set_absolute_size (desc, font_size * PANGO_SCALE);
cairo_save (cr);
+ cairo_rotate (cr, angle);
cairo_get_current_point (cr, &x, &y);
cairo_translate (cr, x, y);
cairo_move_to (cr, 0, 0);
cairo_get_current_point (cr, &x, &y);
cairo_translate (cr, x, y);
cairo_move_to (cr, 0, 0);
@@
-214,18
+216,28
@@
xrchart_label (cairo_t *cr, int horz_justify, int vert_justify,
pango_font_description_free (desc);
}
pango_font_description_free (desc);
}
+void
+xrchart_label (cairo_t *cr, int horz_justify, int vert_justify,
+ double font_size, const char *string)
+{
+ xrchart_label_rotate (cr, horz_justify, vert_justify, font_size, string, 0);
+}
+
+
/* Draw a tick mark at position
If label is non null, then print it at the tick mark
*/
static void
draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom,
enum tick_orientation orientation,
/* Draw a tick mark at position
If label is non null, then print it at the tick mark
*/
static void
draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom,
enum tick_orientation orientation,
+ bool rotated,
double position,
const char *s);
void
draw_tick (cairo_t *cr, const struct xrchart_geometry *geom,
enum tick_orientation orientation,
double position,
const char *s);
void
draw_tick (cairo_t *cr, const struct xrchart_geometry *geom,
enum tick_orientation orientation,
+ bool rotated,
double position,
const char *label, ...)
{
double position,
const char *label, ...)
{
@@
-237,7
+249,7
@@
draw_tick (cairo_t *cr, const struct xrchart_geometry *geom,
if (fabs (position) < DBL_EPSILON)
position = 0;
if (fabs (position) < DBL_EPSILON)
position = 0;
- draw_tick_internal (cr, geom, orientation, position, s);
+ draw_tick_internal (cr, geom, orientation,
rotated,
position, s);
free (s);
va_end (ap);
}
free (s);
va_end (ap);
}
@@
-246,6
+258,7
@@
draw_tick (cairo_t *cr, const struct xrchart_geometry *geom,
static void
draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom,
enum tick_orientation orientation,
static void
draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom,
enum tick_orientation orientation,
+ bool rotated,
double position,
const char *s)
{
double position,
const char *s)
{
@@
-275,7
+288,12
@@
draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom,
cairo_move_to (cr, x, y);
if (orientation == SCALE_ABSCISSA)
cairo_move_to (cr, x, y);
if (orientation == SCALE_ABSCISSA)
- xrchart_label (cr, 'c', 't', geom->font_size, s);
+ {
+ if ( rotated)
+ xrchart_label_rotate (cr, 'l', 'c', geom->font_size, s, -G_PI_4);
+ else
+ xrchart_label (cr, 'c', 't', geom->font_size, s);
+ }
else if (orientation == SCALE_ORDINATE)
{
if (fabs (position) < DBL_EPSILON)
else if (orientation == SCALE_ORDINATE)
{
if (fabs (position) < DBL_EPSILON)
@@
-307,7
+325,7
@@
xrchart_write_title (cairo_t *cr, const struct xrchart_geometry *geom,
}
}
-/* Set the scale for the ordinate */
+
static void
xrchart_write_scale (cairo_t *cr, struct xrchart_geometry *geom,
double smin, double smax, int ticks, enum tick_orientation orient)
static void
xrchart_write_scale (cairo_t *cr, struct xrchart_geometry *geom,
double smin, double smax, int ticks, enum tick_orientation orient)
@@
-317,20
+335,24
@@
xrchart_write_scale (cairo_t *cr, struct xrchart_geometry *geom,
const double tick_interval =
chart_rounded_tick ((smax - smin) / (double) ticks);
const double tick_interval =
chart_rounded_tick ((smax - smin) / (double) ticks);
- geom->axis[orient].max = ceil (smax / tick_interval) * tick_interval;
- geom->axis[orient].min = floor (smin / tick_interval) * tick_interval;
+ int upper = ceil (smax / tick_interval);
+ int lower = floor (smin / tick_interval);
+
+ geom->axis[orient].max = tick_interval * upper;
+ geom->axis[orient].min = tick_interval * lower;
geom->axis[orient].scale = (fabs (geom->axis[orient].data_max - geom->axis[orient].data_min)
/ fabs (geom->axis[orient].max - geom->axis[orient].min));
geom->axis[orient].scale = (fabs (geom->axis[orient].data_max - geom->axis[orient].data_min)
/ fabs (geom->axis[orient].max - geom->axis[orient].min));
- for (s = 0 ; s <
(geom->axis[orient].max - geom->axis[orient].min) / tick_interval
; ++s)
+ for (s = 0 ; s <
upper - lower
; ++s)
{
{
- double pos =
s * tick_interval + geom->axis[orient].min;
- draw_tick (cr, geom, orient,
+ double pos =
(s + lower) * tick_interval;
+ draw_tick (cr, geom, orient,
false,
s * tick_interval * geom->axis[orient].scale, "%g", pos);
}
}
s * tick_interval * geom->axis[orient].scale, "%g", pos);
}
}
+/* Set the scale for the ordinate */
void
xrchart_write_yscale (cairo_t *cr, struct xrchart_geometry *geom,
double smin, double smax, int ticks)
void
xrchart_write_yscale (cairo_t *cr, struct xrchart_geometry *geom,
double smin, double smax, int ticks)
@@
-352,7
+374,7
@@
void
xrchart_write_xlabel (cairo_t *cr, const struct xrchart_geometry *geom,
const char *label)
{
xrchart_write_xlabel (cairo_t *cr, const struct xrchart_geometry *geom,
const char *label)
{
- cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->abscissa_
top
);
+ cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_min, geom->abscissa_
bottom
);
xrchart_label (cr, 'l', 't', geom->font_size, label);
}
xrchart_label (cr, 'l', 't', geom->font_size, label);
}
@@
-362,9
+384,9
@@
xrchart_write_ylabel (cairo_t *cr, const struct xrchart_geometry *geom,
const char *label)
{
cairo_save (cr);
const char *label)
{
cairo_save (cr);
- cairo_translate (cr, -geom->axis[SCALE_ORDINATE].data_min, -geom->ordinate_right);
- cairo_move_to (cr, 0, 0);
+ cairo_translate (cr, geom->ordinate_left, geom->axis[SCALE_ORDINATE].data_min);
cairo_rotate (cr, M_PI / 2.0);
cairo_rotate (cr, M_PI / 2.0);
+
xrchart_label (cr, 'l', 'x', geom->font_size, label);
cairo_restore (cr);
}
xrchart_label (cr, 'l', 'x', geom->font_size, label);
cairo_restore (cr);
}