summaryrefslogtreecommitdiff
path: root/gtk/gtkcanvas.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkcanvas.c')
-rw-r--r--gtk/gtkcanvas.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/gtk/gtkcanvas.c b/gtk/gtkcanvas.c
index e638cff9af..069e8eab99 100644
--- a/gtk/gtkcanvas.c
+++ b/gtk/gtkcanvas.c
@@ -256,7 +256,6 @@ gtk_canvas_allocate (GtkWidget *widget,
GtkCanvasItem *ci = gtk_canvas_items_get (&self->items, i);
GtkWidget *child = gtk_canvas_item_get_widget (ci);
const GtkCanvasBox *bounds;
- float origin_x, origin_y;
graphene_rect_t rect;
int x, y, w, h;
@@ -297,15 +296,27 @@ gtk_canvas_allocate (GtkWidget *widget,
w = -w;
if (rect.size.height < 0)
h = -h;
- gtk_canvas_box_get_origin (bounds, &origin_x, &origin_y);
- if (ABS (w) > ABS (rect.size.width))
- x = round (rect.origin.x + origin_x * (rect.size.width - w));
- else
- x = round (rect.origin.x);
- if (ABS (h) > ABS (rect.size.height))
- y = round (rect.origin.y + origin_y * (rect.size.height - h));
+ if (ABS (w) > ABS (rect.size.width) || ABS (h) > ABS (rect.size.height))
+ {
+ graphene_vec2_t origin;
+
+ if (!gtk_canvas_vector_eval (gtk_canvas_box_get_origin (bounds), &origin))
+ graphene_vec2_init_from_vec2 (&origin, graphene_vec2_zero ());
+
+ if (ABS (w) > ABS (rect.size.width))
+ x = round (rect.origin.x + graphene_vec2_get_x (&origin) * (rect.size.width - w));
+ else
+ x = round (rect.origin.x);
+ if (ABS (h) > ABS (rect.size.height))
+ y = round (rect.origin.y + graphene_vec2_get_y (&origin) * (rect.size.height - h));
+ else
+ y = round (rect.origin.y);
+ }
else
- y = round (rect.origin.y);
+ {
+ x = round (rect.origin.x);
+ y = round (rect.origin.y);
+ }
gtk_canvas_item_allocate (ci, &GRAPHENE_RECT_INIT (x, y, w, h));
success = TRUE;