diff --git a/gdk/gdktexture.c b/gdk/gdktexture.c index 99647bcff8..f0233fb4ae 100644 --- a/gdk/gdktexture.c +++ b/gdk/gdktexture.c @@ -465,6 +465,30 @@ gdk_texture_new_for_surface (cairo_surface_t *surface) return texture; } +static GdkColorState * +gdk_color_state_from_pixbuf (GdkPixbuf *pixbuf) +{ + const char *icc_profile_base64; + GdkColorState *color_state = NULL; + + icc_profile_base64 = gdk_pixbuf_get_option (pixbuf, "icc-profile"); + if (icc_profile_base64) + { + guchar *icc_data; + gsize icc_len; + GBytes *bytes; + + icc_data = g_base64_decode (icc_profile_base64, &icc_len); + bytes = g_bytes_new_take (icc_data, icc_len); + color_state = gdk_color_state_new_from_icc_profile (bytes, NULL); + g_bytes_unref (bytes); + } + if (!color_state) + color_state = GDK_COLOR_STATE_SRGB; + + return color_state; +} + /** * gdk_texture_new_for_pixbuf: * @pixbuf: a `GdkPixbuf` @@ -482,24 +506,31 @@ gdk_texture_new_for_pixbuf (GdkPixbuf *pixbuf) { GdkTexture *texture; GBytes *bytes; + GdkColorState *color_state; g_return_val_if_fail (GDK_IS_PIXBUF (pixbuf), NULL); + color_state = gdk_color_state_from_pixbuf (pixbuf); + bytes = g_bytes_new_with_free_func (gdk_pixbuf_get_pixels (pixbuf), gdk_pixbuf_get_height (pixbuf) * (gsize) gdk_pixbuf_get_rowstride (pixbuf), g_object_unref, g_object_ref (pixbuf)); - texture = gdk_memory_texture_new (gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf), - gdk_pixbuf_get_has_alpha (pixbuf) - ? GDK_MEMORY_GDK_PIXBUF_ALPHA - : GDK_MEMORY_GDK_PIXBUF_OPAQUE, - bytes, - gdk_pixbuf_get_rowstride (pixbuf)); + + texture = gdk_memory_texture_new_with_color_state (gdk_pixbuf_get_width (pixbuf), + gdk_pixbuf_get_height (pixbuf), + gdk_pixbuf_get_has_alpha (pixbuf) + ? GDK_MEMORY_GDK_PIXBUF_ALPHA + : GDK_MEMORY_GDK_PIXBUF_OPAQUE, + color_state, + bytes, + gdk_pixbuf_get_rowstride (pixbuf)); g_bytes_unref (bytes); + gdk_color_state_unref (color_state); + return texture; }