clutter/image: Also invalidate size

ClutterImage is a ClutterContent implementation that
has an internally managed CoglTexture. This texture
is recreated when new image data is set.

ClutterContent implementations may have control over
the allocation of the widgets they're attached to,
through CLUTTER_REQUEST_CONTENT_SIZE. On those cases,
if the new image data differs in size from the previous
data, it is important to notify those actors about the
size change. However, currently ClutterImage does not
notify them.

With the introduction of clutter_content_invalidate_size(),
it is possible to report the size changes to attached
actors.

Adapt ClutterImage to invalidate_size() when image data
has different sizes.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/405
This commit is contained in:
Georges Basile Stavracas Neto 2019-01-27 13:53:06 -02:00
parent 0f0b411f6e
commit 25f36b3892

View File

@ -53,6 +53,8 @@
struct _ClutterImagePrivate struct _ClutterImagePrivate
{ {
CoglTexture *texture; CoglTexture *texture;
gint width;
gint height;
}; };
static void clutter_content_iface_init (ClutterContentIface *iface); static void clutter_content_iface_init (ClutterContentIface *iface);
@ -68,6 +70,27 @@ clutter_image_error_quark (void)
return g_quark_from_static_string ("clutter-image-error-quark"); return g_quark_from_static_string ("clutter-image-error-quark");
} }
static void
update_image_size (ClutterImage *self)
{
gint width, height;
if (self->priv->texture == NULL)
return;
width = cogl_texture_get_width (self->priv->texture);
height = cogl_texture_get_height (self->priv->texture);
if (self->priv->width == width &&
self->priv->height == height)
return;
self->priv->width = width;
self->priv->height = height;
clutter_content_invalidate_size (CLUTTER_CONTENT (self));
}
static void static void
clutter_image_finalize (GObject *gobject) clutter_image_finalize (GObject *gobject)
{ {
@ -238,6 +261,7 @@ clutter_image_set_data (ClutterImage *image,
} }
clutter_content_invalidate (CLUTTER_CONTENT (image)); clutter_content_invalidate (CLUTTER_CONTENT (image));
update_image_size (image);
return TRUE; return TRUE;
} }
@ -306,6 +330,7 @@ clutter_image_set_bytes (ClutterImage *image,
} }
clutter_content_invalidate (CLUTTER_CONTENT (image)); clutter_content_invalidate (CLUTTER_CONTENT (image));
update_image_size (image);
return TRUE; return TRUE;
} }
@ -399,6 +424,7 @@ clutter_image_set_area (ClutterImage *image,
} }
clutter_content_invalidate (CLUTTER_CONTENT (image)); clutter_content_invalidate (CLUTTER_CONTENT (image));
update_image_size (image);
return TRUE; return TRUE;
} }