From e7c7932d7202eb15683c589a7c6529b93aa1ab3e Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Aug 2016 01:05:14 -0400 Subject: [PATCH] Fix fallback render nodes We were allocating a surface thats big enough for the clip, and we were setting the transform for that, but then GtkContainer was overriding the transform with the one for the allocation. Also, we were drawing at the clip position, not the allocation position. --- gtk/gtkwidget.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index f2ae75bef0..8946c35c20 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -15849,10 +15849,12 @@ gtk_widget_get_render_node (GtkWidget *widget, graphene_point3d_t tmp; graphene_rect_t bounds; GtkAllocation clip; + GtkAllocation alloc; gtk_widget_get_clip (widget, &clip); + gtk_widget_get_allocation (widget, &alloc); graphene_rect_init (&bounds, 0, 0, clip.width, clip.height); - graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, clip.x, clip.y, 0.f)); + graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, alloc.x, alloc.y, 0.f)); /* Compatibility mode: if the widget does not have a render node, we draw * using gtk_widget_draw() on a temporary node @@ -15862,6 +15864,7 @@ gtk_widget_get_render_node (GtkWidget *widget, GskRenderNode *tmp; cairo_t *cr; char *str; + graphene_point3d_t p; str = g_strconcat ("Fallback<", G_OBJECT_TYPE_NAME (widget), ">", NULL); @@ -15870,6 +15873,8 @@ gtk_widget_get_render_node (GtkWidget *widget, gsk_render_node_set_bounds (tmp, &bounds); gsk_render_node_set_transform (tmp, &m); cr = gsk_render_node_get_draw_context (tmp); + cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y); + gsk_render_node_set_offset (tmp, graphene_point3d_init (&p, clip.x - alloc.x, clip.y - alloc.y, 0.f)); gtk_widget_draw (widget, cr);