summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2017-10-23 09:08:25 +0200
committerMatthias Clasen <mclasen@redhat.com>2017-10-23 11:47:17 +0200
commita072f9fc066c56e04a5aac091f155801ca8388e5 (patch)
tree8741cd46fb0ad4103ae1c20ded7c675683c07c50
parente4cdbef092d8dfd8ce23f4ca80beff5894fed8c3 (diff)
downloadgtk+-a072f9fc066c56e04a5aac091f155801ca8388e5.tar.gz
Use a color matrix for symbolic icons
The recoloring of symbolic icons is just a color matrix operation.
-rw-r--r--gtk/gtkiconhelper.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/gtk/gtkiconhelper.c b/gtk/gtkiconhelper.c
index 5d47954536..7942c1509d 100644
--- a/gtk/gtkiconhelper.c
+++ b/gtk/gtkiconhelper.c
@@ -505,11 +505,7 @@ find_cached_texture (GtkIconHelper *self)
return NULL;
if (gtk_icon_info_is_symbolic (info))
- {
- // FIXME
- g_object_unref (info);
- return NULL;
- }
+ self->rendered_surface_is_symbolic = TRUE;
texture = gtk_icon_info_load_texture (info);
@@ -791,6 +787,8 @@ gtk_icon_helper_snapshot (GtkIconHelper *self,
{
GtkCssStyle *style;
GskTexture *texture;
+ graphene_matrix_t matrix;
+ graphene_vec4_t offset;
style = gtk_css_node_get_style (self->node);
@@ -798,12 +796,28 @@ gtk_icon_helper_snapshot (GtkIconHelper *self,
texture = self->texture;
if (texture == NULL)
return;
-
+
+ if (self->rendered_surface_is_symbolic)
+ {
+ GdkRGBA fg, sc, wc, ec;
+
+ gtk_icon_theme_lookup_symbolic_colors (style, &fg, &sc, &wc, &ec);
+
+ 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);
+ }
+
gtk_css_style_snapshot_icon_texture (style,
snapshot,
texture,
gtk_widget_get_scale_factor (self->owner),
- NULL, NULL);
+ self->rendered_surface_is_symbolic ? &matrix : NULL,
+ self->rendered_surface_is_symbolic ? &offset : NULL);
}
gboolean