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));
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);