X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcharts%2Fbarchart-cairo.c;h=4663471e566e9c81b22ac0fb9d3bc3435d4e5a39;hb=eeb5800b97c3d4e768fb3f7cbdabf54b3bd162b4;hp=397715ff386d38884ce4ca9838ec39a1bb648c74;hpb=0df9cdd3df66caf4353128feff3008289cda8115;p=pspp diff --git a/src/output/charts/barchart-cairo.c b/src/output/charts/barchart-cairo.c index 397715ff38..4663471e56 100644 --- a/src/output/charts/barchart-cairo.c +++ b/src/output/charts/barchart-cairo.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2015 Free Software Foundation, Inc. + Copyright (C) 2015, 2016 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 @@ -43,10 +43,10 @@ abscissa_label (const struct barchart *bc, cairo_t *cr, size_t hash = value_hash (prev, bc->widths[0], 0); HMAP_FOR_EACH_WITH_HASH (foo, struct category, node, hash, &bc->primaries) { - if (value_equal (&foo->val, prev, bc->widths[0])) + if (value_equal (&foo->val, prev, bc->widths[0])) break; } - + draw_tick (cr, geom, SCALE_ABSCISSA, false, x_pos - (width * n_last_cat) / 2.0, "%s", ds_cstr (&foo->label)); @@ -56,18 +56,20 @@ abscissa_label (const struct barchart *bc, cairo_t *cr, void -xrchart_draw_barchart (const struct chart_item *chart_item, cairo_t *cr, +xrchart_draw_barchart (const struct chart *chart, cairo_t *cr, struct xrchart_geometry *geom) { - struct barchart *bc = to_barchart (chart_item); + struct barchart *bc = to_barchart (chart); int i; xrchart_write_title (cr, geom, _("Bar Chart")); xrchart_write_ylabel (cr, geom, bc->ylabel); - xrchart_write_xlabel (cr, geom, chart_item_get_title (chart_item)); + xrchart_write_xlabel (cr, geom, chart_get_title (chart)); - xrchart_write_yscale (cr, geom, 0, bc->largest); + if (! xrchart_write_yscale (cr, geom, 0, + bc->percent ? bc->largest * 100.0 / bc->total_count : bc->largest)) + return; const double abscale = geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ABSCISSA].data_min; const double width = abscale / (double) (bc->n_nzcats + bc->n_pcats); @@ -79,7 +81,7 @@ xrchart_draw_barchart (const struct chart_item *chart_item, cairo_t *cr, { const int blob_size = 13; const int height = blob_size * (hmap_count (&bc->secondaries) * 2); - + cairo_rectangle (cr, geom->axis[SCALE_ABSCISSA].data_max + 10, geom->axis[SCALE_ORDINATE].data_max - height, @@ -92,10 +94,10 @@ xrchart_draw_barchart (const struct chart_item *chart_item, cairo_t *cr, { const struct category *foo = bc->ss[i]; - cairo_move_to (cr, + cairo_move_to (cr, geom->axis[SCALE_ABSCISSA].data_max + (1.5 * blob_size) + 20, geom->axis[SCALE_ORDINATE].data_max - ypos); - + xrchart_label (cr, 'l', 'b', geom->font_size, ds_cstr (&foo->label)); cairo_rectangle (cr, @@ -111,7 +113,7 @@ xrchart_draw_barchart (const struct chart_item *chart_item, cairo_t *cr, cairo_fill_preserve (cr); cairo_restore (cr); - + cairo_stroke (cr); ypos += blob_size * 2; @@ -122,6 +124,8 @@ xrchart_draw_barchart (const struct chart_item *chart_item, cairo_t *cr, for (i = 0; i < bc->n_nzcats; i++) { double height = geom->axis[SCALE_ORDINATE].scale * bc->cats[i]->count; + if (bc->percent) + height *= 100.0 / bc->total_count ; if (prev && !value_equal (prev, &bc->cats[i]->values[0], bc->widths[0])) {