From: Carl Worth <cworth@cworth.org>
Date: Tue, 27 Jan 2009 15:34:23 +0000 (-0800)
Subject: Remove code duplication for X and Y ticks
X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=5897f1f7f868e2fdfa51fc8e3bb9e02d49171b2b;p=acre

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.
---

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