X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcairo-chart.c;h=8886b2642d7cf7d0b665385918f0761cc8d2d050;hb=24c05c4eafa2fa462bae17b45c9f58d0fb2a09c7;hp=56b35290a6572a2098620cf12a4fd8270843f709;hpb=7ddd4ae15db78c8c31b51645ce215bc97929167a;p=pspp diff --git a/src/output/cairo-chart.c b/src/output/cairo-chart.c index 56b35290a6..8886b2642d 100644 --- a/src/output/cairo-chart.c +++ b/src/output/cairo-chart.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2004, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2004, 2009, 2010, 2011, 2014 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 @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -35,7 +34,6 @@ #include "output/cairo.h" #include "output/chart-item.h" -#include "gl/error.h" #include "gl/xalloc.h" #include "gl/xvasprintf.h" @@ -62,9 +60,7 @@ xrchart_geometry_init (cairo_t *cr, struct xrchart_geometry *geom, geom->dataset = NULL; geom->n_datasets = 0; - geom->fill_colour.red = 255; - geom->fill_colour.green = 0; - geom->fill_colour.blue = 0; + geom->fill_colour = data_colour[0]; cairo_set_line_width (cr, 1.0); @@ -102,19 +98,42 @@ pango_layout_get_baseline (PangoLayout *layout) } #endif - - +/* + These colours come from: + http://tango.freedesktop.org/static/cvs/tango-art-tools/palettes/Tango-Palette.gpl */ const struct xrchart_colour data_colour[XRCHART_N_COLOURS] = { - { 165, 42, 42 }, /* brown */ - { 255, 0, 0 }, /* red */ - { 255, 165, 0 }, /* orange */ - { 255, 255, 0 }, /* yellow */ - { 0, 255, 0 }, /* green */ - { 0, 0, 255 }, /* blue */ - { 238, 130, 238 }, /* violet */ - { 190, 190, 190 }, /* grey */ - { 255, 192, 203 }, /* pink */ + {252, 233, 79}, /* Butter 1 */ + {138, 226, 52}, /* Chameleon 1 */ + {252, 175, 62}, /* Orange 1 */ + {114, 159, 207}, /* Sky Blue 1 */ + {173, 127, 168}, /* Plum 1 */ + {233, 185, 110}, /* Chocolate 1 */ + {239, 41, 41}, /* Scarlet Red 1 */ + {238, 238, 236}, /* Aluminium 1 */ + + {237, 212, 0}, /* Butter 2 */ + {115, 210, 22}, /* Chameleon 2 */ + {245, 121, 0}, /* Orange 2 */ + {52, 101, 164}, /* Sky Blue 2 */ + {117, 80, 123}, /* Plum 2 */ + {193, 125, 17}, /* Chocolate 2 */ + {204, 0, 0}, /* Scarlet Red 2 */ + + {136, 138, 133}, /* Aluminium 4 */ + + {196, 160, 0}, /* Butter 3 */ + {78, 154, 6}, /* Chameleon 3 */ + {206, 92, 0}, /* Orange 3 */ + {32, 74, 135}, /* Sky Blue 3 */ + {92, 53, 102}, /* Plum 3 */ + {143, 89, 2}, /* Chocolate 3 */ + {164, 0, 0}, /* Scarlet Red 3 */ + {85, 87, 83}, /* Aluminium 5 */ + + {211, 215, 207}, /* Aluminium 2 */ + {186, 189, 182}, /* Aluminium 3 */ + {46, 52, 54}, /* Aluminium 6 */ }; void @@ -151,8 +170,8 @@ xrchart_draw_marker (cairo_t *cr, double x, double y, } 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; @@ -167,6 +186,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); + cairo_rotate (cr, angle); cairo_get_current_point (cr, &x, &y); cairo_translate (cr, x, y); cairo_move_to (cr, 0, 0); @@ -215,18 +235,28 @@ xrchart_label (cairo_t *cr, int horz_justify, int vert_justify, 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, + bool rotated, 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, ...) { @@ -238,7 +268,7 @@ draw_tick (cairo_t *cr, const struct xrchart_geometry *geom, 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); } @@ -247,6 +277,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, + bool rotated, double position, const char *s) { @@ -276,7 +307,12 @@ draw_tick_internal (cairo_t *cr, const struct xrchart_geometry *geom, 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) @@ -330,8 +366,9 @@ xrchart_write_scale (cairo_t *cr, struct xrchart_geometry *geom, for (s = 0 ; s < upper - lower; ++s) { double pos = (s + lower) * tick_interval; - draw_tick (cr, geom, orient, - s * tick_interval * geom->axis[orient].scale, "%g", pos); + draw_tick (cr, geom, orient, false, + s * tick_interval * geom->axis[orient].scale, "%.*g", + DBL_DIG + 1, pos); } } @@ -449,7 +486,7 @@ xrchart_datum (cairo_t *cr, const struct xrchart_geometry *geom, 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