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=9e55c56f46a0b8d83ef4b0cf2b9ad4489f1c8fec;hpb=fe8dc2171009e90d2335f159d05f7e6660e24780;p=pspp diff --git a/src/output/charts/piechart-cairo.c b/src/output/charts/piechart-cairo.c index 9e55c56f46..c63706792e 100644 --- a/src/output/charts/piechart-cairo.c +++ b/src/output/charts/piechart-cairo.c @@ -57,17 +57,14 @@ xrchart_draw_piechart (const struct chart_item *chart_item, cairo_t *cr, double angle; int i; - centre_x = (geom->data_right + geom->data_left) / 2.0 ; - centre_y = (geom->data_top + geom->data_bottom) / 2.0 ; + centre_x = (geom->axis[SCALE_ABSCISSA].data_max + geom->axis[SCALE_ORDINATE].data_min) / 2.0 ; + centre_y = (geom->axis[SCALE_ORDINATE].data_max + geom->axis[SCALE_ORDINATE].data_min) / 2.0 ; - left_label = geom->data_left + (geom->data_right - geom->data_left)/10.0; - right_label = geom->data_right - (geom->data_right - geom->data_left)/10.0; + 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->data_top - geom->data_bottom), - 1.0 / 4.0 * (geom->data_right - geom->data_left)); - - radius = MIN (5.0 / 12.0 * (geom->data_top - geom->data_bottom), - 1.0 / 4.0 * (geom->data_right - geom->data_left)); + 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)); @@ -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);