X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcharts%2Fpiechart-cairo.c;h=c63706792ea0aff9096fecda6a6f6a4bcf10d90a;hb=52afd109c4f1e4a524ff068c0389388592055455;hp=7b847f123ef43663b7e26a8660fd73b68671b85a;hpb=084a3ed2450295a9f1ebfd30b9a93f1e3dac7bf1;p=pspp diff --git a/src/output/charts/piechart-cairo.c b/src/output/charts/piechart-cairo.c index 7b847f123e..c63706792e 100644 --- a/src/output/charts/piechart-cairo.c +++ b/src/output/charts/piechart-cairo.c @@ -63,9 +63,6 @@ xrchart_draw_piechart (const struct chart_item *chart_item, cairo_t *cr, left_label = geom->axis[SCALE_ORDINATE].data_min + (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ORDINATE].data_min)/10.0; right_label = geom->axis[SCALE_ABSCISSA].data_max - (geom->axis[SCALE_ABSCISSA].data_max - geom->axis[SCALE_ORDINATE].data_min)/10.0; - 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)); @@ -75,26 +72,42 @@ xrchart_draw_piechart (const struct chart_item *chart_item, cairo_t *cr, 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);