From 5897f1f7f868e2fdfa51fc8e3bb9e02d49171b2b Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Tue, 27 Jan 2009 07:34:23 -0800 Subject: [PATCH] Remove code duplication for X and Y ticks I knew this code was repeated, and fortunately it wasn't as hard to share it as I thought it might be. Adding minor-tick rendering will be much easier now that this is shared. --- acre.c | 144 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 70 insertions(+), 74 deletions(-) diff --git a/acre.c b/acre.c index cec8a2f..a01dbe5 100644 --- a/acre.c +++ b/acre.c @@ -502,95 +502,91 @@ _draw_data (acre_t *acre) cairo_restore (cr); } +typedef enum _ticks { ACRE_TICKS_X, ACRE_TICKS_Y } acre_ticks_t; + static void -_draw_frame_and_ticks (acre_t *acre) +_draw_ticks (acre_t *acre, + double axis_min, double axis_max, + acre_ticks_t ticks) { cairo_t *cr = acre->cr; - double step, x, y; + double i, step; cairo_save (cr); - cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + _set_transform_to_data_space (acre); - /* First the ticks within data space. */ - cairo_save (cr); - { - _set_transform_to_data_space (acre); + step = _step_for_range (axis_max - axis_min); + i = (floor (axis_min / step) + 1) * step; - step = _step_for_range (acre->x_axis.max -acre->x_axis.min); - x = (floor (acre->x_axis.min / step) + 1) * step; - while (x <= acre->x_axis.max) { - cairo_move_to (cr, x, acre->y_axis.min); - cairo_save (cr); - { - /* tick */ - cairo_save (cr); - { - cairo_identity_matrix (cr); - cairo_rel_line_to (cr, 0, 0.5); - cairo_rel_line_to (cr, 0, -ACRE_TICK_SIZE-0.5); - cairo_set_line_width (cr, 1.0); - cairo_stroke (cr); - } - cairo_restore (cr); - - /* label */ - cairo_save (cr); - { - PangoLayout *layout; - int width, height; - layout = _create_layout_printf (acre, "%g", x); - cairo_move_to (cr, x, acre->y_axis.min); - cairo_identity_matrix (cr); - pango_layout_get_pixel_size (layout, &width, &height); - cairo_rel_move_to (cr, -width / 2, ACRE_X_TICK_VALUE_PAD); - _show_layout (cr, layout); - } - cairo_restore (cr); + while (i <= axis_max) { + if (ticks == ACRE_TICKS_X) + cairo_move_to (cr, i, acre->y_axis.min); + else + cairo_move_to (cr, acre->x_axis.min, i); + + /* tick */ + cairo_save (cr); + { + cairo_identity_matrix (cr); + if (ticks == ACRE_TICKS_X) { + cairo_rel_line_to (cr, 0, 0.5); + cairo_rel_line_to (cr, 0, -ACRE_TICK_SIZE-0.5); + } else { + cairo_rel_line_to (cr, -0.5, 0); + cairo_rel_line_to (cr, ACRE_TICK_SIZE+0.5, 0); } - cairo_restore (cr); - x += step; + cairo_set_line_width (cr, 1.0); + cairo_stroke (cr); } + cairo_restore (cr); - step = _step_for_range (acre->y_axis.max -acre->y_axis.min); - y = (floor (acre->y_axis.min / step) + 1) * step; - while (y <= acre->y_axis.max) { - cairo_move_to (cr, acre->x_axis.min, y); - cairo_save (cr); - { - /* tick */ - cairo_save (cr); - { - cairo_identity_matrix (cr); - cairo_rel_line_to (cr, -0.5, 0); - cairo_rel_line_to (cr, ACRE_TICK_SIZE+0.5, 0); - cairo_set_line_width (cr, 1.0); - cairo_stroke (cr); - } - cairo_restore (cr); - - /* label */ - cairo_save (cr); - { - PangoLayout *layout; - int width, height; - layout = _create_layout_printf (acre, "%g", y); - cairo_move_to (cr, acre->x_axis.min, y); - cairo_identity_matrix (cr); - pango_layout_get_pixel_size (layout, &width, &height); - cairo_rel_move_to (cr, -width - ACRE_Y_TICK_VALUE_PAD, - -height/2); - _show_layout (cr, layout); - } - cairo_restore (cr); - } - cairo_restore (cr); - y += step; + /* label */ + cairo_save (cr); + { + PangoLayout *layout; + int width, height; + + layout = _create_layout_printf (acre, "%g", i); + + if (ticks == ACRE_TICKS_X) + cairo_move_to (cr, i, acre->y_axis.min); + else + cairo_move_to (cr, acre->x_axis.min, i); + + cairo_identity_matrix (cr); + pango_layout_get_pixel_size (layout, &width, &height); + + if (ticks == ACRE_TICKS_X) + cairo_rel_move_to (cr, -width / 2, ACRE_X_TICK_VALUE_PAD); + else + cairo_rel_move_to (cr, -width - ACRE_Y_TICK_VALUE_PAD, + -height/2); + + _show_layout (cr, layout); } + cairo_restore (cr); + + i += step; } + cairo_restore (cr); +} + +static void +_draw_frame_and_ticks (acre_t *acre) +{ + cairo_t *cr = acre->cr; + + cairo_save (cr); + + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + + /* ticks */ + _draw_ticks (acre, acre->x_axis.min, acre->x_axis.max, ACRE_TICKS_X); + _draw_ticks (acre, acre->y_axis.min, acre->y_axis.max, ACRE_TICKS_Y); - /* Then the frame drawn in pixel space. */ + /* frame */ cairo_rectangle (cr, acre->chart.x - 0.5, acre->chart.y - 0.5, acre->chart.width + 1.0, acre->chart.height + 1.0); -- 2.43.0