From: Carl Worth Date: Tue, 27 Jan 2009 17:57:35 +0000 (-0800) Subject: Adjust axis ranges so data doesn't collide with ticks. X-Git-Url: https://git.cworth.org/git?p=acre;a=commitdiff_plain;h=9f7a70910ddcb7e29103a293e2ae6f056adcf45a Adjust axis ranges so data doesn't collide with ticks. There. I think I'm done making the ticks and frame look nice now. I'm totally happy with the result. --- diff --git a/acre.c b/acre.c index e91248c..1ca0505 100644 --- a/acre.c +++ b/acre.c @@ -377,15 +377,17 @@ _step_for_range (double range, int *minor_divisions) * nice-looking pixel-snapped ticks we want to expand the range * slightly. */ static void -_expand_range_for_width (double *axis_min, double *axis_max, int pixel_size) +_expand_range_for_width (double *axis_min, double *axis_max, int pixel_range) { - double range, new_range, step, pixel_step; + double range, new_range, step, step_minor, pixel_step; int minor_divisions; range = *axis_max - *axis_min; step = _step_for_range (range, &minor_divisions); - pixel_step = step * pixel_size / range / minor_divisions; + step_minor = step / minor_divisions; + + pixel_step = step_minor * (pixel_range / range); /* We expand the range by the ratio of the pixel step to the floor * of the pixel_step. @@ -443,7 +445,24 @@ _compute_axis_ranges (acre_t *acre) } } - /* Next, increase the axis ranges just enough so that the step + /* Next, we want to ensure that the data never collides with the + * ticks. So we expand each axis on its minimum side as needed. */ + cairo_save (cr); + { + double x, y; + + _set_transform_to_data_space (acre); + + x = ACRE_TICK_MAJOR_SIZE + 2.0; + y = ACRE_TICK_MAJOR_SIZE + 2.0; + cairo_device_to_user_distance (cr, &x, &y); + + acre->x_axis.min -= x; + acre->y_axis.min += y; + } + cairo_restore (cr); + + /* Then, increase the axis ranges just enough so that the step * sizes for the ticks will be integers. */ _expand_range_for_width (&acre->x_axis.min,