diff options
author | Benjamin Otte <otte@redhat.com> | 2016-11-15 06:19:16 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2016-11-15 17:49:19 +0100 |
commit | c0aa065ac119c3280f0e886caff88258b767bb39 (patch) | |
tree | 148ffed6a738db0045125e54b2150214ff70d4d5 /gtk/gtkimage.c | |
parent | 92e6b3a000835e51ff2c40fac53f0979938ec47f (diff) | |
download | gtk+-c0aa065ac119c3280f0e886caff88258b767bb39.tar.gz |
snapshot: Convert GtkImage and GtkIconHelper
Adds a bunch of new APIs to render textures with theming.
FIXME: Cannot draw shadows for textures.
Diffstat (limited to 'gtk/gtkimage.c')
-rw-r--r-- | gtk/gtkimage.c | 99 |
1 files changed, 49 insertions, 50 deletions
diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c index f7abcfcb94..ffb5f81d6d 100644 --- a/gtk/gtkimage.c +++ b/gtk/gtkimage.c @@ -142,8 +142,8 @@ struct _GtkImagePrivate #define DEFAULT_ICON_SIZE GTK_ICON_SIZE_BUTTON -static GskRenderNode *gtk_image_get_render_node (GtkWidget *widget, - GskRenderer *renderer); +static void gtk_image_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot); static void gtk_image_size_allocate (GtkWidget *widget, GtkAllocation*allocation); static void gtk_image_unmap (GtkWidget *widget); @@ -163,6 +163,13 @@ static void gtk_image_get_content_size (GtkCssGadget *gadget, gint *minimum_baseline, gint *natural_baseline, gpointer unused); +static gboolean gtk_image_render_contents (GtkCssGadget *gadget, + GtkSnapshot *snapshot, + int x, + int y, + int width, + int height, + gpointer data); static void gtk_image_style_updated (GtkWidget *widget); static void gtk_image_finalize (GObject *object); @@ -211,7 +218,7 @@ gtk_image_class_init (GtkImageClass *class) gobject_class->finalize = gtk_image_finalize; widget_class = GTK_WIDGET_CLASS (class); - widget_class->get_render_node = gtk_image_get_render_node; + widget_class->snapshot = gtk_image_snapshot; widget_class->measure = gtk_image_measure; widget_class->size_allocate = gtk_image_size_allocate; widget_class->unmap = gtk_image_unmap; @@ -367,8 +374,9 @@ gtk_image_init (GtkImage *image) gtk_image_get_content_size, NULL, NULL, - NULL, + gtk_image_render_contents, NULL, NULL); + } static void @@ -1403,69 +1411,60 @@ gtk_image_get_content_size (GtkCssGadget *gadget, } -static GskRenderNode * -gtk_image_get_render_node (GtkWidget *widget, - GskRenderer *renderer) +static void +gtk_image_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) { - GtkImage *image = GTK_IMAGE (widget); - GtkImagePrivate *priv = image->priv; - gint w, h, baseline; - gint x, y, width, height; - GskRenderNode *res; - GskRenderNode *node; - GtkAllocation alloc, clip; - cairo_t *cr; - - res = gtk_css_gadget_get_render_node (priv->gadget, renderer, FALSE); - - if (res == NULL) - return NULL; - - if (gtk_image_get_storage_type (image) == GTK_IMAGE_ANIMATION) - { - node = gtk_widget_create_render_node (widget, renderer, "Image Content"); + gtk_css_gadget_snapshot (GTK_IMAGE (widget)->priv->gadget, + snapshot); +} - gtk_widget_get_clip (widget, &clip); - _gtk_widget_get_allocation (widget, &alloc); +static gboolean +gtk_image_render_contents (GtkCssGadget *gadget, + GtkSnapshot *snapshot, + int x, + int y, + int width, + int height, + gpointer data) +{ + GtkWidget *widget; + GtkImage *image; + GtkImagePrivate *priv; + gint w, h, baseline; - cr = gsk_render_node_get_draw_context (node, renderer); - cairo_translate (cr, alloc.x - clip.x, alloc.y - clip.y); - x = 0; - y = 0; - width = alloc.width; - height = alloc.height; + widget = gtk_css_gadget_get_owner (gadget); + image = GTK_IMAGE (widget); + priv = image->priv; - _gtk_icon_helper_get_size (priv->icon_helper, &w, &h); + _gtk_icon_helper_get_size (priv->icon_helper, &w, &h); - baseline = gtk_widget_get_allocated_baseline (widget); + baseline = gtk_widget_get_allocated_baseline (widget); - if (baseline == -1) - y += floor(height - h) / 2; - else - y += CLAMP (baseline - h * gtk_image_get_baseline_align (image), 0, height - h); + if (baseline == -1) + y += floor(height - h) / 2; + else + y += CLAMP (baseline - h * gtk_image_get_baseline_align (image), 0, height - h); - x += (width - w) / 2; + x += (width - w) / 2; + gtk_snapshot_translate_2d (snapshot, x, y); + if (gtk_image_get_storage_type (image) == GTK_IMAGE_ANIMATION) + { GtkStyleContext *context = gtk_widget_get_style_context (widget); GdkPixbuf *pixbuf = get_animation_frame (image); - gtk_render_icon (context, cr, pixbuf, x, y); + gtk_snapshot_render_icon (snapshot, context, pixbuf, x, y); + g_object_unref (pixbuf); - - cairo_destroy (cr); } else { - node = gtk_icon_helper_get_render_node (priv->icon_helper, renderer); - } - - if (node != NULL) - { - gsk_render_node_append_child (res, node); - gsk_render_node_unref (node); + gtk_icon_helper_snapshot (priv->icon_helper, snapshot); } + gtk_snapshot_translate_2d (snapshot, -x, -y); - return res; + return FALSE; } static void |