From: Alexander Larsson Date: Tue, 28 Jan 2020 11:06:55 +0000 (+0100) Subject: icon-theme: Add gtk_icon_info_download_colored_texture() X-Git-Tag: archive/raspbian/4.4.1+ds1-2+rpi1^2~18^2~20^2~126^2~29 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6ffb54f47f593c6fcfd2d647084fd4448c6829bf;p=gtk4.git icon-theme: Add gtk_icon_info_download_colored_texture() This is a way to get at recolored pixels and will replace all existing users of _load_symbolic*() --- diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index 768889bea1..46e67733e1 100644 --- a/gtk/gtkicontheme.c +++ b/gtk/gtkicontheme.c @@ -3866,6 +3866,65 @@ gtk_icon_info_download_texture (GtkIconInfo *self, return texture; } +static void +init_color_matrix (graphene_matrix_t *color_matrix, + graphene_vec4_t *color_offset, + const GdkRGBA *foreground_color, + const GdkRGBA *success_color, + const GdkRGBA *warning_color, + const GdkRGBA *error_color) +{ + GdkRGBA fg_default = { 0.7450980392156863, 0.7450980392156863, 0.7450980392156863, 1.0}; + GdkRGBA success_default = { 0.3046921492332342,0.6015716792553597, 0.023437857633325704, 1.0}; + GdkRGBA warning_default = {0.9570458533607996, 0.47266346227206835, 0.2421911955443656, 1.0 }; + GdkRGBA error_default = { 0.796887159533074, 0 ,0, 1.0 }; + const GdkRGBA *fg = foreground_color ? foreground_color : &fg_default; + const GdkRGBA *sc = success_color ? success_color : &success_default; + const GdkRGBA *wc = warning_color ? warning_color : &warning_default; + const GdkRGBA *ec = error_color ? error_color : &error_default; + + graphene_matrix_init_from_float (color_matrix, + (float[16]) { + sc->red - fg->red, sc->green - fg->green, sc->blue - fg->blue, 0, + wc->red - fg->red, wc->green - fg->green, wc->blue - fg->blue, 0, + ec->red - fg->red, ec->green - fg->green, ec->blue - fg->blue, 0, + 0, 0, 0, fg->alpha + }); + graphene_vec4_init (color_offset, fg->red, fg->green, fg->blue, 0); +} + + +GdkTexture * +gtk_icon_info_download_colored_texture (GtkIconInfo *self, + const GdkRGBA *foreground_color, + const GdkRGBA *success_color, + const GdkRGBA *warning_color, + const GdkRGBA *error_color, + GError **error) +{ + GdkTexture *texture, *colored_texture; + graphene_matrix_t matrix; + graphene_vec4_t offset; + cairo_surface_t *surface; + + texture = gtk_icon_info_download_texture (self, error); + + if (texture == NULL || gtk_icon_info_is_symbolic (self)) + return texture; + + init_color_matrix (&matrix, &offset, + foreground_color, success_color, + warning_color, error_color); + + surface = gdk_texture_download_surface (texture); + gdk_cairo_image_surface_recolor (surface, &matrix, &offset); + colored_texture = gdk_texture_new_for_surface (surface); + cairo_surface_destroy (surface); + g_object_unref (texture); + + return colored_texture; +} + static void icon_info_paintable_snapshot (GdkPaintable *paintable, GdkSnapshot *snapshot, @@ -3919,21 +3978,12 @@ gtk_icon_info_snapshot_with_colors (GtkIconInfo *icon_info, if (symbolic) { - const GdkRGBA *fg = foreground_color; - const GdkRGBA *sc = success_color; - const GdkRGBA *wc = warning_color; - const GdkRGBA *ec = error_color; graphene_matrix_t matrix; graphene_vec4_t offset; - graphene_matrix_init_from_float (&matrix, - (float[16]) { - sc->red - fg->red, sc->green - fg->green, sc->blue - fg->blue, 0, - wc->red - fg->red, wc->green - fg->green, wc->blue - fg->blue, 0, - ec->red - fg->red, ec->green - fg->green, ec->blue - fg->blue, 0, - 0, 0, 0, fg->alpha - }); - graphene_vec4_init (&offset, fg->red, fg->green, fg->blue, 0); + init_color_matrix (&matrix, &offset, + foreground_color, success_color, + warning_color, error_color); gtk_snapshot_push_color_matrix (snapshot, &matrix, &offset); } diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h index dee4b114ca..c938156117 100644 --- a/gtk/gtkicontheme.h +++ b/gtk/gtkicontheme.h @@ -216,6 +216,13 @@ gboolean gtk_icon_info_is_symbolic (GtkIconInfo *self); GDK_AVAILABLE_IN_ALL GdkTexture * gtk_icon_info_download_texture (GtkIconInfo *self, GError **error); +GDK_AVAILABLE_IN_ALL +GdkTexture * gtk_icon_info_download_colored_texture (GtkIconInfo *self, + const GdkRGBA *foreground_color, + const GdkRGBA *success_color, + const GdkRGBA *warning_color, + const GdkRGBA *error_color, + GError **error); GDK_AVAILABLE_IN_ALL void gtk_icon_info_snapshot_with_colors (GtkIconInfo *icon_info,