summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkcolorbutton.c2
-rw-r--r--gtk/gtkcolorswatch.c2
-rw-r--r--gtk/gtkiconview.c2
-rw-r--r--gtk/gtkrendernodepaintable.c45
-rw-r--r--gtk/gtkrendernodepaintableprivate.h3
-rw-r--r--gtk/gtksnapshot.c18
-rw-r--r--gtk/gtksnapshot.h6
-rw-r--r--gtk/gtktextutil.c4
-rw-r--r--gtk/gtktreeview.c2
9 files changed, 50 insertions, 34 deletions
diff --git a/gtk/gtkcolorbutton.c b/gtk/gtkcolorbutton.c
index 9fe9736a1e..d533866434 100644
--- a/gtk/gtkcolorbutton.c
+++ b/gtk/gtkcolorbutton.c
@@ -330,7 +330,7 @@ set_color_icon (GdkDragContext *context,
rgba,
&GRAPHENE_RECT_INIT(0, 0, 48, 32),
"ColorDragColor");
- paintable = gtk_snapshot_free_to_paintable (snapshot);
+ paintable = gtk_snapshot_free_to_paintable (snapshot, NULL);
gtk_drag_set_icon_paintable (context, paintable, 0, 0);
g_object_unref (paintable);
diff --git a/gtk/gtkcolorswatch.c b/gtk/gtkcolorswatch.c
index acd3298f7a..4872f4b667 100644
--- a/gtk/gtkcolorswatch.c
+++ b/gtk/gtkcolorswatch.c
@@ -175,7 +175,7 @@ drag_set_color_icon (GdkDragContext *context,
color,
&GRAPHENE_RECT_INIT(0, 0, 48, 32),
"ColorDragColor");
- paintable = gtk_snapshot_free_to_paintable (snapshot);
+ paintable = gtk_snapshot_free_to_paintable (snapshot, NULL);
gtk_drag_set_icon_paintable (context, paintable, 4, 4);
g_object_unref (paintable);
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index b9987b294a..cbe65e5a3b 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -6711,7 +6711,7 @@ gtk_icon_view_create_drag_icon (GtkIconView *icon_view,
icon_view->priv->item_padding,
icon_view->priv->item_padding,
FALSE);
- paintable = gtk_snapshot_free_to_paintable (snapshot);
+ paintable = gtk_snapshot_free_to_paintable (snapshot, NULL);
return paintable;
}
diff --git a/gtk/gtkrendernodepaintable.c b/gtk/gtkrendernodepaintable.c
index 18c36a7a8c..5ec8160946 100644
--- a/gtk/gtkrendernodepaintable.c
+++ b/gtk/gtkrendernodepaintable.c
@@ -28,6 +28,7 @@ struct _GtkRenderNodePaintable
GObject parent_instance;
GskRenderNode *node;
+ graphene_rect_t bounds;
};
struct _GtkRenderNodePaintableClass
@@ -42,29 +43,34 @@ gtk_render_node_paintable_paintable_snapshot (GdkPaintable *paintable,
double height)
{
GtkRenderNodePaintable *self = GTK_RENDER_NODE_PAINTABLE (paintable);
- graphene_rect_t node_bounds;
+ gboolean needs_transform;
- gsk_render_node_get_bounds (self->node, &node_bounds);
+ needs_transform = self->bounds.size.width != width ||
+ self->bounds.size.height != height;
- if (node_bounds.origin.x + node_bounds.size.width != width ||
- node_bounds.origin.y + node_bounds.size.height != height)
+ if (needs_transform)
{
graphene_matrix_t transform;
graphene_matrix_init_scale (&transform,
- width / (node_bounds.origin.x + node_bounds.size.width),
- height / (node_bounds.origin.y + node_bounds.size.height),
+ width / (self->bounds.size.width),
+ height / (self->bounds.size.height),
1.0);
gtk_snapshot_push_transform (snapshot,
&transform,
"RenderNodeScaleToFit");
- gtk_snapshot_append_node (snapshot, self->node);
- gtk_snapshot_pop (snapshot);
- }
- else
- {
- gtk_snapshot_append_node (snapshot, self->node);
}
+
+ gtk_snapshot_push_clip (snapshot, &self->bounds, "RenderNodePaintableClip");
+ gtk_snapshot_offset (snapshot, self->bounds.origin.x, self->bounds.origin.y);
+
+ gtk_snapshot_append_node (snapshot, self->node);
+
+ gtk_snapshot_offset (snapshot, -self->bounds.origin.x, -self->bounds.origin.y);
+ gtk_snapshot_pop (snapshot);
+
+ if (needs_transform)
+ gtk_snapshot_pop (snapshot);
}
static GdkPaintableFlags
@@ -77,22 +83,16 @@ static int
gtk_render_node_paintable_paintable_get_intrinsic_width (GdkPaintable *paintable)
{
GtkRenderNodePaintable *self = GTK_RENDER_NODE_PAINTABLE (paintable);
- graphene_rect_t node_bounds;
- gsk_render_node_get_bounds (self->node, &node_bounds);
-
- return node_bounds.origin.x + node_bounds.size.width;
+ return self->bounds.size.width;
}
static int
gtk_render_node_paintable_paintable_get_intrinsic_height (GdkPaintable *paintable)
{
GtkRenderNodePaintable *self = GTK_RENDER_NODE_PAINTABLE (paintable);
- graphene_rect_t node_bounds;
-
- gsk_render_node_get_bounds (self->node, &node_bounds);
- return node_bounds.origin.y + node_bounds.size.height;
+ return self->bounds.size.height;
}
static void
@@ -132,15 +132,18 @@ gtk_render_node_paintable_init (GtkRenderNodePaintable *self)
}
GdkPaintable *
-gtk_render_node_paintable_new (GskRenderNode *node)
+gtk_render_node_paintable_new (GskRenderNode *node,
+ const graphene_rect_t *bounds)
{
GtkRenderNodePaintable *self;
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
+ g_return_val_if_fail (bounds != NULL, NULL);
self = g_object_new (GTK_TYPE_RENDER_NODE_PAINTABLE, NULL);
self->node = gsk_render_node_ref (node);
+ self->bounds = *bounds;
return GDK_PAINTABLE (self);
}
diff --git a/gtk/gtkrendernodepaintableprivate.h b/gtk/gtkrendernodepaintableprivate.h
index 1eba80ec3f..305eecffb6 100644
--- a/gtk/gtkrendernodepaintableprivate.h
+++ b/gtk/gtkrendernodepaintableprivate.h
@@ -28,7 +28,8 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GtkRenderNodePaintable, gtk_render_node_paintable, GTK, RENDER_NODE_PAINTABLE, GObject)
-GdkPaintable * gtk_render_node_paintable_new (GskRenderNode *node);
+GdkPaintable * gtk_render_node_paintable_new (GskRenderNode *node,
+ const graphene_rect_t *bounds);
G_END_DECLS
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index 14514a9689..c383364275 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -277,6 +277,8 @@ gtk_snapshot_free_to_node (GtkSnapshot *snapshot)
/**
* gtk_snapshot_free_to_paintable: (skip)
* @snapshot: (transfer full): a #GtkSnapshot
+ * @size: (allow-none): The size of the resulting paintable
+ * or %NULL to use the bounds of the snapshot
*
* Returns a paintable for the node that was
* constructed by @snapshot and frees @snapshot.
@@ -284,11 +286,12 @@ gtk_snapshot_free_to_node (GtkSnapshot *snapshot)
* Returns: (transfer full): a newly-created #GdkPaintable
*/
GdkPaintable *
-gtk_snapshot_free_to_paintable (GtkSnapshot *snapshot)
+gtk_snapshot_free_to_paintable (GtkSnapshot *snapshot,
+ const graphene_size_t *size)
{
GdkPaintable *result;
- result = gtk_snapshot_to_paintable (snapshot);
+ result = gtk_snapshot_to_paintable (snapshot, size);
g_object_unref (snapshot);
return result;
@@ -1286,6 +1289,8 @@ gtk_snapshot_to_node (GtkSnapshot *snapshot)
/**
* gtk_snapshot_to_paintable:
* @snapshot: a #GtkSnapshot
+ * @size: (allow-none): The size of the resulting paintable
+ * or %NULL to use the bounds of the snapshot
*
* Returns a paintable encapsulating the render node
* that was constructed by @snapshot. After calling
@@ -1296,13 +1301,18 @@ gtk_snapshot_to_node (GtkSnapshot *snapshot)
* Returns: (transfer full): a new #GdkPaintable
*/
GdkPaintable *
-gtk_snapshot_to_paintable (GtkSnapshot *snapshot)
+gtk_snapshot_to_paintable (GtkSnapshot *snapshot,
+ const graphene_size_t *size)
{
GskRenderNode *node;
GdkPaintable *paintable;
+ graphene_rect_t bounds;
node = gtk_snapshot_to_node (snapshot);
- paintable = gtk_render_node_paintable_new (node);
+ gsk_render_node_get_bounds (node, &bounds);
+ bounds.origin.x = 0;
+ bounds.origin.y = 0;
+ paintable = gtk_render_node_paintable_new (node, &bounds);
gsk_render_node_unref (node);
return paintable;
diff --git a/gtk/gtksnapshot.h b/gtk/gtksnapshot.h
index 14cb20470d..7647a6b092 100644
--- a/gtk/gtksnapshot.h
+++ b/gtk/gtksnapshot.h
@@ -58,12 +58,14 @@ GtkSnapshot * gtk_snapshot_new (gboolean
GDK_AVAILABLE_IN_ALL
GskRenderNode * gtk_snapshot_free_to_node (GtkSnapshot *snapshot);
GDK_AVAILABLE_IN_ALL
-GdkPaintable * gtk_snapshot_free_to_paintable (GtkSnapshot *snapshot);
+GdkPaintable * gtk_snapshot_free_to_paintable (GtkSnapshot *snapshot,
+ const graphene_size_t *size);
GDK_AVAILABLE_IN_ALL
GskRenderNode * gtk_snapshot_to_node (GtkSnapshot *snapshot);
GDK_AVAILABLE_IN_ALL
-GdkPaintable * gtk_snapshot_to_paintable (GtkSnapshot *snapshot);
+GdkPaintable * gtk_snapshot_to_paintable (GtkSnapshot *snapshot,
+ const graphene_size_t *size);
GDK_AVAILABLE_IN_ALL
gboolean gtk_snapshot_get_record_names (GtkSnapshot *snapshot);
diff --git a/gtk/gtktextutil.c b/gtk/gtktextutil.c
index 2507da9a84..a636c0ce19 100644
--- a/gtk/gtktextutil.c
+++ b/gtk/gtktextutil.c
@@ -233,7 +233,7 @@ gtk_text_util_create_drag_icon (GtkWidget *widget,
&color);
gtk_snapshot_append_layout (snapshot, layout, &color, "TextDragIcon");
- paintable = gtk_snapshot_free_to_paintable (snapshot);
+ paintable = gtk_snapshot_free_to_paintable (snapshot, NULL);
g_object_unref (layout);
return paintable;
@@ -343,7 +343,7 @@ gtk_text_util_create_rich_drag_icon (GtkWidget *widget,
g_object_unref (layout);
g_object_unref (new_buffer);
- paintable = gtk_snapshot_free_to_paintable (snapshot);
+ paintable = gtk_snapshot_free_to_paintable (snapshot, &(graphene_size_t) { layout_width, layout_height });
return paintable;
}
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 64ddbcc2d9..cbdbb40c3e 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -13944,7 +13944,7 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView *tree_view,
gtk_treeview_snapshot_border (snapshot,
&GRAPHENE_RECT_INIT(0, 0, bin_window_width + 2, background_area.height + 2));
- paintable = gtk_snapshot_free_to_paintable (snapshot);
+ paintable = gtk_snapshot_free_to_paintable (snapshot, NULL);
return paintable;
}