[gtk+/gtk-3-14] image: Optimize non-resize changes
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-3-14] image: Optimize non-resize changes
- Date: Mon, 23 Mar 2015 03:33:09 +0000 (UTC)
commit 78475606c9b311580eef126ff3d88fe0f751293a
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jan 30 23:32:50 2015 -0500
image: Optimize non-resize changes
When the image content is changed, only queue a resize
if the size is actually changing, otherwise just a
redraw. Suggested by Owen in
https://bugzilla.gnome.org/show_bug.cgi?id=613833
gtk/gtkimage.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 90 insertions(+), 17 deletions(-)
---
diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c
index 80b514d..fd1c4c7 100644
--- a/gtk/gtkimage.c
+++ b/gtk/gtkimage.c
@@ -149,6 +149,9 @@ static gint gtk_image_draw (GtkWidget *widget,
static void gtk_image_unmap (GtkWidget *widget);
static void gtk_image_realize (GtkWidget *widget);
static void gtk_image_unrealize (GtkWidget *widget);
+static void gtk_image_get_preferred_size (GtkImage *image,
+ gint *width_out,
+ gint *height_out);
static void gtk_image_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural);
@@ -927,8 +930,8 @@ gtk_image_set_from_file (GtkImage *image,
priv = image->priv;
g_object_freeze_notify (G_OBJECT (image));
-
- gtk_image_clear (image);
+
+ gtk_image_reset (image);
if (filename == NULL)
{
@@ -941,9 +944,7 @@ gtk_image_set_from_file (GtkImage *image,
if (anim == NULL)
{
- gtk_image_set_from_icon_name (image,
- "image-missing",
- DEFAULT_ICON_SIZE);
+ gtk_image_set_from_icon_name (image, "image-missing", DEFAULT_ICON_SIZE);
g_object_thaw_notify (G_OBJECT (image));
return;
}
@@ -964,7 +965,21 @@ gtk_image_set_from_file (GtkImage *image,
g_object_unref (anim);
priv->filename = g_strdup (filename);
-
+
+ if (gtk_widget_get_visible (GTK_WIDGET (image)))
+ {
+ gint width, height;
+
+ gtk_image_get_preferred_size (image, &width, &height);
+ if (width != gtk_widget_get_allocated_width (GTK_WIDGET (image)) ||
+ height != gtk_widget_get_allocated_height (GTK_WIDGET (image)))
+ gtk_widget_queue_resize (GTK_WIDGET (image));
+ else
+ gtk_widget_queue_draw (GTK_WIDGET (image));
+ }
+
+ g_object_notify (G_OBJECT (image), "file");
+
g_object_thaw_notify (G_OBJECT (image));
}
@@ -1001,9 +1016,7 @@ gtk_image_set_from_resource (GtkImage *image,
if (animation == NULL)
{
- gtk_image_set_from_icon_name (image,
- "image-missing",
- DEFAULT_ICON_SIZE);
+ gtk_image_set_from_icon_name (image, "image-missing", DEFAULT_ICON_SIZE);
g_object_thaw_notify (G_OBJECT (image));
return;
}
@@ -1039,18 +1052,29 @@ gtk_image_set_from_pixbuf (GtkImage *image,
GtkImagePrivate *priv;
g_return_if_fail (GTK_IS_IMAGE (image));
- g_return_if_fail (pixbuf == NULL ||
- GDK_IS_PIXBUF (pixbuf));
+ g_return_if_fail (pixbuf == NULL || GDK_IS_PIXBUF (pixbuf));
priv = image->priv;
g_object_freeze_notify (G_OBJECT (image));
-
- gtk_image_clear (image);
+
+ gtk_image_reset (image);
if (pixbuf != NULL)
_gtk_icon_helper_set_pixbuf (priv->icon_helper, pixbuf);
+ if (gtk_widget_get_visible (GTK_WIDGET (image)))
+ {
+ gint width, height;
+
+ gtk_image_get_preferred_size (image, &width, &height);
+ if (width != gtk_widget_get_allocated_width (GTK_WIDGET (image)) ||
+ height != gtk_widget_get_allocated_height (GTK_WIDGET (image)))
+ gtk_widget_queue_resize (GTK_WIDGET (image));
+ else
+ gtk_widget_queue_draw (GTK_WIDGET (image));
+ }
+
g_object_notify (G_OBJECT (image), "pixbuf");
g_object_thaw_notify (G_OBJECT (image));
@@ -1164,7 +1188,7 @@ gtk_image_set_from_animation (GtkImage *image,
if (animation)
g_object_ref (animation);
- gtk_image_clear (image);
+ gtk_image_reset (image);
if (animation != NULL)
{
@@ -1172,6 +1196,18 @@ gtk_image_set_from_animation (GtkImage *image,
g_object_unref (animation);
}
+ if (gtk_widget_get_visible (GTK_WIDGET (image)))
+ {
+ gint width, height;
+
+ gtk_image_get_preferred_size (image, &width, &height);
+ if (width != gtk_widget_get_allocated_width (GTK_WIDGET (image)) ||
+ height != gtk_widget_get_allocated_height (GTK_WIDGET (image)))
+ gtk_widget_queue_resize (GTK_WIDGET (image));
+ else
+ gtk_widget_queue_draw (GTK_WIDGET (image));
+ }
+
g_object_notify (G_OBJECT (image), "pixbuf-animation");
g_object_thaw_notify (G_OBJECT (image));
@@ -1202,7 +1238,8 @@ gtk_image_set_from_icon_name (GtkImage *image,
g_object_freeze_notify (G_OBJECT (image));
new_name = g_strdup (icon_name);
- gtk_image_clear (image);
+
+ gtk_image_reset (image);
if (new_name)
{
@@ -1210,6 +1247,18 @@ gtk_image_set_from_icon_name (GtkImage *image,
g_free (new_name);
}
+ if (gtk_widget_get_visible (GTK_WIDGET (image)))
+ {
+ gint width, height;
+
+ gtk_image_get_preferred_size (image, &width, &height);
+ if (width != gtk_widget_get_allocated_width (GTK_WIDGET (image)) ||
+ height != gtk_widget_get_allocated_height (GTK_WIDGET (image)))
+ gtk_widget_queue_resize (GTK_WIDGET (image));
+ else
+ gtk_widget_queue_draw (GTK_WIDGET (image));
+ }
+
g_object_notify (G_OBJECT (image), "icon-name");
g_object_notify (G_OBJECT (image), "icon-size");
@@ -1242,7 +1291,7 @@ gtk_image_set_from_gicon (GtkImage *image,
if (icon)
g_object_ref (icon);
- gtk_image_clear (image);
+ gtk_image_reset (image);
if (icon)
{
@@ -1250,6 +1299,18 @@ gtk_image_set_from_gicon (GtkImage *image,
g_object_unref (icon);
}
+ if (gtk_widget_get_visible (GTK_WIDGET (image)))
+ {
+ gint width, height;
+
+ gtk_image_get_preferred_size (image, &width, &height);
+ if (width != gtk_widget_get_allocated_width (GTK_WIDGET (image)) ||
+ height != gtk_widget_get_allocated_height (GTK_WIDGET (image)))
+ gtk_widget_queue_resize (GTK_WIDGET (image));
+ else
+ gtk_widget_queue_draw (GTK_WIDGET (image));
+ }
+
g_object_notify (G_OBJECT (image), "gicon");
g_object_notify (G_OBJECT (image), "icon-size");
@@ -1280,7 +1341,7 @@ gtk_image_set_from_surface (GtkImage *image,
if (surface)
cairo_surface_reference (surface);
- gtk_image_clear (image);
+ gtk_image_reset (image);
if (surface)
{
@@ -1288,6 +1349,18 @@ gtk_image_set_from_surface (GtkImage *image,
cairo_surface_destroy (surface);
}
+ if (gtk_widget_get_visible (GTK_WIDGET (image)))
+ {
+ gint width, height;
+
+ gtk_image_get_preferred_size (image, &width, &height);
+ if (width != gtk_widget_get_allocated_width (GTK_WIDGET (image)) ||
+ height != gtk_widget_get_allocated_height (GTK_WIDGET (image)))
+ gtk_widget_queue_resize (GTK_WIDGET (image));
+ else
+ gtk_widget_queue_draw (GTK_WIDGET (image));
+ }
+
g_object_notify (G_OBJECT (image), "surface");
g_object_thaw_notify (G_OBJECT (image));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]