X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=acre.c;h=3ddf14382a880a7db7edebff34512040e34fb1e3;hb=573652f264c7fc92e985d118b1f3dc64a5c6c9fc;hp=e91248c77e92c4a5d960d9b41d27db3ad5b8f376;hpb=3a0fcbced3dfbdaef697f47219e5308df0210c5a;p=acre diff --git a/acre.c b/acre.c index e91248c..3ddf143 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, @@ -533,7 +552,7 @@ _draw_ticks (acre_t *acre, t += sub_step) { int tick_size; - if (fabs((t / step) - (int) (t / step)) < 0.5 * (sub_step / step)) + if (fabs((t / step) - round (t / step)) < 0.5 * (sub_step / step)) tick_size = ACRE_TICK_MAJOR_SIZE; else tick_size = ACRE_TICK_MINOR_SIZE;