X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcharts%2Fpiechart-cairo.c;h=6c43670806696888896b689de4f5350a8069a3f4;hb=8642df034e82487ec7ff476fbfbacbd5b65eb88a;hp=7b847f123ef43663b7e26a8660fd73b68671b85a;hpb=084a3ed2450295a9f1ebfd30b9a93f1e3dac7bf1;p=pspp diff --git a/src/output/charts/piechart-cairo.c b/src/output/charts/piechart-cairo.c index 7b847f123e..6c43670806 100644 --- a/src/output/charts/piechart-cairo.c +++ b/src/output/charts/piechart-cairo.c @@ -46,10 +46,10 @@ draw_segment(cairo_t *cr, } void -xrchart_draw_piechart (const struct chart_item *chart_item, cairo_t *cr, +xrchart_draw_piechart (const struct chart *chart, cairo_t *cr, struct xrchart_geometry *geom) { - const struct piechart *pie = to_piechart (chart_item); + const struct piechart *pie = to_piechart (chart); double total_magnitude; double left_label, right_label; double centre_x, centre_y; @@ -66,35 +66,48 @@ xrchart_draw_piechart (const struct chart_item *chart_item, cairo_t *cr, radius = MIN (5.0 / 12.0 * (geom->axis[SCALE_ORDINATE].data_max - geom->axis[SCALE_ORDINATE].data_min), 1.0 / 4.0 * (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ORDINATE].data_min)); - radius = MIN (5.0 / 12.0 * (geom->axis[SCALE_ORDINATE].data_max - geom->axis[SCALE_ORDINATE].data_min), - 1.0 / 4.0 * (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ORDINATE].data_min)); - - xrchart_write_title (cr, geom, "%s", chart_item_get_title (chart_item)); + xrchart_write_title (cr, geom, "%s", chart_get_title (chart)); total_magnitude = 0.0; for (i = 0; i < pie->n_slices; i++) total_magnitude += pie->slices[i].magnitude; + + /* Draw the segments */ angle = 0.0; - for (i = 0; i < pie->n_slices ; ++i ) + for (i = 0; i < pie->n_slices ; ++i) { const double segment_angle = pie->slices[i].magnitude / total_magnitude * 2 * M_PI ; - const double label_x = centre_x + - radius * cos (angle + segment_angle/2.0); - - const double label_y = centre_y + - radius * sin (angle + segment_angle/2.0); - /* Fill the segment */ draw_segment (cr, centre_x, centre_y, radius, angle, segment_angle, &data_colour[i % XRCHART_N_COLOURS]); - /* Now add the labels */ - if ( label_x < centre_x ) + angle += segment_angle; + } + + + /* Now add the labels. + Don't put this in the loop above; the labels must + be put in last, otherwise the segment fill could + obscure them. + */ + angle = 0.0; + for (i = 0; i < pie->n_slices ; ++i) + { + const double segment_angle = + pie->slices[i].magnitude / total_magnitude * 2 * M_PI ; + + const double label_x = centre_x + + radius * cos (angle + segment_angle/2.0); + + const double label_y = centre_y + + radius * sin (angle + segment_angle/2.0); + + if (label_x < centre_x) { cairo_move_to (cr, label_x, label_y); cairo_line_to (cr, left_label, label_y);