diff options
-rw-r--r-- | gtk/gtkmagnifier.c | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/gtk/gtkmagnifier.c b/gtk/gtkmagnifier.c index 4827d63f9b..90f4bccd44 100644 --- a/gtk/gtkmagnifier.c +++ b/gtk/gtkmagnifier.c @@ -18,6 +18,8 @@ #include "config.h" #include "gtk/gtk.h" #include "gtkmagnifierprivate.h" +#include "gtkwidgetprivate.h" +#include "gtksnapshotprivate.h" #include "gtkintl.h" enum { @@ -95,42 +97,42 @@ _gtk_magnifier_get_property (GObject *object, } } -static gboolean -_gtk_magnifier_draw (GtkWidget *widget, - cairo_t *cr) +static void +gtk_magnifier_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) { - GtkAllocation allocation, inspected_alloc; - GtkMagnifier *magnifier; - GtkMagnifierPrivate *priv; - gdouble x, y; - - magnifier = GTK_MAGNIFIER (widget); - priv = _gtk_magnifier_get_instance_private (magnifier); + GtkMagnifier *magnifier = GTK_MAGNIFIER (widget); + GtkMagnifierPrivate *priv = _gtk_magnifier_get_instance_private (magnifier); + GtkSnapshot inspected_snapshot; + GskRenderNode *inspected_node; + graphene_matrix_t transform; if (priv->inspected == NULL) - return FALSE; + return; if (!gtk_widget_is_visible (priv->inspected)) - return FALSE; + return; - gtk_widget_get_allocation (widget, &allocation); - gtk_widget_get_allocation (priv->inspected, &inspected_alloc); + g_signal_handler_block (priv->inspected, priv->draw_handler); - if (!priv->resize) - cairo_translate (cr, allocation.width / 2, allocation.height / 2); + gtk_snapshot_init (&inspected_snapshot, + gtk_snapshot_get_renderer (snapshot), + snapshot->record_names, + NULL, + "MagnifierSnapshot"); - x = CLAMP (priv->x, 0, inspected_alloc.width); - y = CLAMP (priv->y, 0, inspected_alloc.height); + gtk_widget_snapshot (priv->inspected, &inspected_snapshot); + inspected_node = gtk_snapshot_finish (&inspected_snapshot); - cairo_save (cr); - cairo_scale (cr, priv->magnification, priv->magnification); - cairo_translate (cr, -x, -y); - g_signal_handler_block (priv->inspected, priv->draw_handler); - gtk_widget_draw (priv->inspected, cr); - g_signal_handler_unblock (priv->inspected, priv->draw_handler); - cairo_restore (cr); + graphene_matrix_init_identity (&transform); + graphene_matrix_scale (&transform, priv->magnification, priv->magnification, 1); + + gtk_snapshot_push_transform (snapshot, &transform, "Magnifier transform"); + gtk_snapshot_append_node (snapshot, inspected_node); + gtk_snapshot_pop (snapshot); - return TRUE; + + g_signal_handler_unblock (priv->inspected, priv->draw_handler); } static void @@ -160,7 +162,6 @@ gtk_magnifier_measure (GtkWidget *widget, *natural = size; } - static void resize_handler (GtkWidget *widget, GtkAllocation *alloc, @@ -204,6 +205,7 @@ draw_handler (GtkWidget *widget, GtkWidget *magnifier) { gtk_widget_queue_draw (magnifier); + return FALSE; } @@ -271,7 +273,7 @@ _gtk_magnifier_class_init (GtkMagnifierClass *klass) object_class->get_property = _gtk_magnifier_get_property; widget_class->destroy = _gtk_magnifier_destroy; - widget_class->draw = _gtk_magnifier_draw; + widget_class->snapshot = gtk_magnifier_snapshot; widget_class->measure = gtk_magnifier_measure; widget_class->map = gtk_magnifier_map; widget_class->unmap = gtk_magnifier_unmap; |