X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fcharts%2Fpiechart-cairo.c;h=6c43670806696888896b689de4f5350a8069a3f4;hb=f7607814fdf3a62b022138960869baaad46b6f4f;hp=9e55c56f46a0b8d83ef4b0cf2b9ad4489f1c8fec;hpb=fe8dc2171009e90d2335f159d05f7e6660e24780;p=pspp diff --git a/src/output/charts/piechart-cairo.c b/src/output/charts/piechart-cairo.c index 9e55c56f46..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; @@ -57,44 +57,57 @@ 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->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->data_top - geom->data_bottom), - 1.0 / 4.0 * (geom->data_right - geom->data_left)); - - 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);