make Session::get_remote_nth_stripable() ignore hidden stripables unless asked.
[ardour.git] / gtk2_ardour / canvas-simpleline.c
index d1990752b073970eacd7f07ed9dd4246c664a4c9..efff5034f95f4ca7070b8b337dec98e8404aca99 100644 (file)
@@ -177,13 +177,9 @@ gnome_canvas_simpleline_init (GnomeCanvasSimpleLine *simpleline)
 static void
 gnome_canvas_simpleline_destroy (GtkObject *object)
 {
-       GnomeCanvasSimpleLine *line;
-
        g_return_if_fail (object != NULL);
        g_return_if_fail (GNOME_IS_CANVAS_SIMPLELINE (object));
 
-       line = GNOME_CANVAS_SIMPLELINE (object);
-
        if (GTK_OBJECT_CLASS (parent_class)->destroy)
                (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
 }
@@ -223,7 +219,7 @@ gnome_canvas_simpleline_set_property (GObject      *object,
        case PROP_Y1:
                 d = g_value_get_double (value);
                if (simpleline->y1 != d) {
-                       simpleline->y1 = d; 
+                       simpleline->y1 = d;
                        bounds_changed = TRUE;
                }
                break;
@@ -304,8 +300,62 @@ gnome_canvas_simpleline_update (GnomeCanvasItem *item, double *affine, ArtSVP *c
        if (parent_class->update)
                (* parent_class->update) (item, affine, clip_path, flags);
 
+        /* redraw old location */
+
+        gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
+
+        /* get current bounding box in parent-relative world coordinates */
+
         gnome_canvas_simpleline_bounds (item, &x1, &y1, &x2, &y2);
-       gnome_canvas_update_bbox (item, x1, y1, x2, y2);
+
+        /* convert parent-relative item coordinates to world coordinates */
+
+        gnome_canvas_item_i2w (item, &x1, &y1);
+        gnome_canvas_item_i2w (item, &x2, &y2);
+
+        /* don't suffer from rounding errors */
+
+        x1 = floor (x1);
+        y1 = floor (y1);
+        x2 = ceil (x2);
+        y2 = ceil (y2);
+
+        /* force non-zero dimensionality for both axes */
+
+        if (x1 == x2) {
+                x2 += 1.0;
+        }
+
+        if (y1 == y2) {
+                y2 += 1.0;
+        }
+
+        /* reset item bounding box (canvas coordinates, so integral. but stored in doubles) */
+
+        gnome_canvas_w2c_d (GNOME_CANVAS(item->canvas), x1, y1, &item->x1, &item->y1);
+        gnome_canvas_w2c_d (GNOME_CANVAS(item->canvas), x2, y2, &item->x2, &item->y2);
+
+        /* redraw new location */
+
+        gnome_canvas_request_redraw (item->canvas, item->x1, item->y1, item->x2, item->y2);
+
+        /* store actual line coords as canvas coordinates for use in render() */
+
+        x1 = simpleline->x1;
+        y1 = simpleline->y1;
+        x2 = simpleline->x2;
+        y2 = simpleline->y2;
+        /* convert to world */
+        gnome_canvas_item_i2w (item, &x1, &y1);
+        gnome_canvas_item_i2w (item, &x2, &y2);
+        /* avoid rounding errors */
+        x1 = (int) floor (item->x1);
+        y1 = (int) floor (item->y1);
+        x2 = (int) ceil (item->x2);
+        y2 = (int) ceil (item->y2);
+        /* convert to canvas coordinates, integral, stored in integers */
+        gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x1, y1, &simpleline->cx1, &simpleline->cy1);
+        gnome_canvas_w2c (GNOME_CANVAS(item->canvas), x2, y2, &simpleline->cx2, &simpleline->cy2);
 }
 
 static void
@@ -318,36 +368,32 @@ gnome_canvas_simpleline_render (GnomeCanvasItem *item,
 
        simpleline = GNOME_CANVAS_SIMPLELINE (item);
 
-       x1 = rint (simpleline->x1);
-       x2 = rint (simpleline->x2);
-        y1 = (int) rint (simpleline->y1);
+       x1 = simpleline->cx1;
+       x2 = simpleline->cx2;
+        y1 = simpleline->cy1;
 
        if (buf->is_bg) {
                gnome_canvas_buf_ensure_buf (buf);
                buf->is_bg = FALSE;
        }
-        
+
         if (simpleline->x1 != simpleline->x2) {
                 PAINT_HORIZA(buf, simpleline->r, simpleline->g, simpleline->b, simpleline->a,
                              x1, x2, y1);
         } else {
-                y2 = (int) rint (simpleline->y2);
-                PAINT_VERTA(buf, simpleline->r, simpleline->g, simpleline->b, simpleline->a,
-                            x1, y1, y2);
-                
+                y2 = simpleline->cy2;
+                PAINT_VERTA (buf, simpleline->r, simpleline->g, simpleline->b, simpleline->a,
+                             x1, y1, y2);
+
         }
 }
 
 static void
-gnome_canvas_simpleline_draw (GnomeCanvasItem *item,
-                              GdkDrawable *drawable,
+gnome_canvas_simpleline_draw (GnomeCanvasItem* canvas,
+                              GdkDrawabledrawable,
                               int x, int y,
                               int width, int height)
 {
-       GnomeCanvasSimpleLine *simpleline;
-
-       simpleline = GNOME_CANVAS_SIMPLELINE (item);
-
         /* XXX not implemented */
 }
 
@@ -356,19 +402,10 @@ gnome_canvas_simpleline_bounds (GnomeCanvasItem *item, double *x1, double *y1, d
 {
        GnomeCanvasSimpleLine *simpleline = GNOME_CANVAS_SIMPLELINE (item);
 
-        if (simpleline->x1 != simpleline->x2) {
-                /* horizontal */
-                *x1 = floor (simpleline->x1);
-                *y1 = floor (simpleline->y1);
-                *x2 = ceil (simpleline->x2);
-                *y2 = ceil (simpleline->y1 + 1);
-        } else {
-                /* vertical */
-                *x1 = floor (simpleline->x1);
-                *y1 = floor (simpleline->y1);
-                *x2 = ceil (simpleline->x1 + 1);
-                *y2 = ceil (simpleline->y2);
-        }
+        *x1 = simpleline->x1;
+        *y1 = simpleline->y1;
+        *x2 = simpleline->x1;
+        *y2 = simpleline->y2;
 }
 
 static double
@@ -377,12 +414,9 @@ gnome_canvas_simpleline_point (GnomeCanvasItem *item, double x, double y, int cx
        (void) cx;
        (void) cy;
 
-       GnomeCanvasSimpleLine *simpleline;
        double x1, y1, x2, y2;
        double dx, dy;
 
-       simpleline = GNOME_CANVAS_SIMPLELINE (item);
-
        *actual_item = item;
 
        /* Find the bounds for the line */