X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=acre.c;h=e444e30557222e0ee73b7af7138a32a3f46213f9;hb=7d126a0ca948c293e4152c50bdb2a8a0ce48f1f9;hp=8ba639ebf24e5c86321a482c6b9e2482ce3aa6d6;hpb=2ede293f10cdbf9267f48823930950d31be83767;p=acre diff --git a/acre.c b/acre.c index 8ba639e..e444e30 100644 --- a/acre.c +++ b/acre.c @@ -160,11 +160,10 @@ acre_add_data (acre_t *acre, acre_data_t *data) #define ACRE_FONT_FAMILY "sans" #define ACRE_FONT_SIZE 12 -#define ACRE_TITLE_FONT_SIZE 32 +#define ACRE_TITLE_FONT_SIZE 20 #define ACRE_PAD (ACRE_FONT_SIZE) #define ACRE_TICK_MAJOR_SIZE 6 #define ACRE_TICK_MINOR_SIZE 3 -#define ACRE_TICK_MINOR_DIVISIONS 5 #define ACRE_X_TICK_VALUE_PAD 2 #define ACRE_Y_TICK_VALUE_PAD 4 @@ -335,7 +334,7 @@ _draw_title_and_labels (acre_t *acre) /* For a given axis range, compute a step size (in data space) to * generate a suitable number of ticks (5 or so). */ static double -_step_for_range (double range) +_step_for_range (double range, int *minor_divisions) { double step, scale_factor; @@ -351,15 +350,21 @@ _step_for_range (double range) * 10). The threshold values between these are computed * logarithmically. */ if (step < 3.535533905932738) { - if (step < 1.58113883008419) + if (step < 1.58113883008419) { step = 1.0; - else + *minor_divisions = 4; + } else { step = 2.5; + *minor_divisions = 5; + } } else { - if (step < 7.071067811865475) + if (step < 7.071067811865475) { step = 5.0; - else + *minor_divisions = 5; + } else { step = 10.0; + *minor_divisions = 4; + } } /* Un-normalize and we now have the data value that we want to @@ -372,14 +377,17 @@ _step_for_range (double range) * 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); - pixel_step = step * pixel_size / range / ACRE_TICK_MINOR_DIVISIONS; + step = _step_for_range (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. @@ -437,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, @@ -513,20 +538,21 @@ _draw_ticks (acre_t *acre, { cairo_t *cr = acre->cr; double t, step, sub_step; + int minor_divisions; cairo_save (cr); _set_transform_to_data_space (acre); - step = _step_for_range (axis_max - axis_min); - sub_step = step / ACRE_TICK_MINOR_DIVISIONS; + step = _step_for_range (axis_max - axis_min, &minor_divisions); + sub_step = step / minor_divisions; for (t = (floor (axis_min / sub_step) + 1) * sub_step; t <= axis_max; 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;