summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkcssshadowsvalue.c27
-rw-r--r--gtk/gtkcssshadowsvalueprivate.h2
-rw-r--r--gtk/gtkcssshadowvalue.c6
-rw-r--r--gtk/gtkcssshadowvalueprivate.h2
-rw-r--r--gtk/gtkrendericon.c30
-rw-r--r--gtk/gtksnapshot.c14
6 files changed, 48 insertions, 33 deletions
diff --git a/gtk/gtkcssshadowsvalue.c b/gtk/gtkcssshadowsvalue.c
index bd687dc156..fcb6097cea 100644
--- a/gtk/gtkcssshadowsvalue.c
+++ b/gtk/gtkcssshadowsvalue.c
@@ -24,6 +24,7 @@
#include <math.h>
#include "gtkcssshadowvalueprivate.h"
+#include "gtksnapshot.h"
#include <string.h>
@@ -393,3 +394,29 @@ _gtk_css_shadows_value_get_extents (const GtkCssValue *shadows,
*border = b;
}
+
+gboolean
+gtk_css_shadows_value_push_snapshot (const GtkCssValue *value,
+ GtkSnapshot *snapshot)
+{
+ gboolean need_shadow = FALSE;
+ int i;
+
+ for (i = 0; i < value->len; i++)
+ {
+ if (!gtk_css_shadow_value_is_clear (value->values[i]))
+ {
+ need_shadow = TRUE;
+ break;
+ }
+ }
+
+ if (need_shadow)
+ {
+ GskShadow *shadows = g_newa (GskShadow, value->len);
+ gtk_css_shadows_value_get_shadows (value, shadows);
+ gtk_snapshot_push_shadow (snapshot, shadows, value->len, "Shadow<%u>", value->len);
+ }
+
+ return need_shadow;
+}
diff --git a/gtk/gtkcssshadowsvalueprivate.h b/gtk/gtkcssshadowsvalueprivate.h
index be2f6b497f..5bd78615f4 100644
--- a/gtk/gtkcssshadowsvalueprivate.h
+++ b/gtk/gtkcssshadowsvalueprivate.h
@@ -61,6 +61,8 @@ void gtk_css_shadows_value_snapshot_inset (const GtkCssValue
void _gtk_css_shadows_value_get_extents (const GtkCssValue *shadows,
GtkBorder *border);
+gboolean gtk_css_shadows_value_push_snapshot (const GtkCssValue *shadows,
+ GtkSnapshot *snapshot);
G_END_DECLS
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index 3c7d1160cb..c5f1db47b8 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -1090,3 +1090,9 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue *shadow,
gsk_render_node_unref (node);
}
+gboolean
+gtk_css_shadow_value_is_clear (const GtkCssValue *shadow)
+{
+ return gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color));
+}
+
diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h
index 2c139c86e8..e3113d106a 100644
--- a/gtk/gtkcssshadowvalueprivate.h
+++ b/gtk/gtkcssshadowvalueprivate.h
@@ -59,6 +59,8 @@ void gtk_css_shadow_value_snapshot_inset (const GtkCssValue
GtkSnapshot *snapshot,
const GskRoundedRect *padding_box);
+gboolean gtk_css_shadow_value_is_clear (const GtkCssValue *shadow);
+
G_END_DECLS
#endif /* __GTK_SHADOW_H__ */
diff --git a/gtk/gtkrendericon.c b/gtk/gtkrendericon.c
index b028d7722e..a500db8fbb 100644
--- a/gtk/gtkrendericon.c
+++ b/gtk/gtkrendericon.c
@@ -99,8 +99,7 @@ gtk_css_style_snapshot_icon (GtkCssStyle *style,
const GtkCssValue *shadows_value, *transform_value, *filter_value;
graphene_matrix_t transform_matrix;
GtkCssImage *image;
- GskShadow *shadows;
- gsize n_shadows;
+ gboolean has_shadow;
g_return_if_fail (GTK_IS_CSS_STYLE (style));
g_return_if_fail (snapshot != NULL);
@@ -121,13 +120,7 @@ gtk_css_style_snapshot_icon (GtkCssStyle *style,
gtk_css_filter_value_push_snapshot (filter_value, snapshot);
- n_shadows = gtk_css_shadows_value_get_n_shadows (shadows_value);
- if (n_shadows > 0)
- {
- shadows = g_newa (GskShadow, n_shadows);
- gtk_css_shadows_value_get_shadows (shadows_value, shadows);
- gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "IconShadow<%zu>", n_shadows);
- }
+ has_shadow = gtk_css_shadows_value_push_snapshot (shadows_value, snapshot);
if (graphene_matrix_is_identity (&transform_matrix))
{
@@ -150,9 +143,9 @@ gtk_css_style_snapshot_icon (GtkCssStyle *style,
gtk_snapshot_pop (snapshot);
}
- if (n_shadows > 0)
+ if (has_shadow)
gtk_snapshot_pop (snapshot);
-
+
gtk_css_filter_value_pop_snapshot (filter_value, snapshot);
}
@@ -282,8 +275,7 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle *style,
graphene_matrix_t transform_matrix;
graphene_rect_t bounds;
double width, height;
- GskShadow *shadows;
- gsize n_shadows;
+ gboolean has_shadow;
g_return_if_fail (GTK_IS_CSS_STYLE (style));
g_return_if_fail (snapshot != NULL);
@@ -301,13 +293,7 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle *style,
gtk_css_filter_value_push_snapshot (filter_value, snapshot);
- n_shadows = gtk_css_shadows_value_get_n_shadows (shadows_value);
- if (n_shadows > 0)
- {
- shadows = g_newa (GskShadow, n_shadows);
- gtk_css_shadows_value_get_shadows (shadows_value, shadows);
- gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "IconShadow<%zu>", n_shadows);
- }
+ has_shadow = gtk_css_shadows_value_push_snapshot (shadows_value, snapshot);
if (color_matrix)
gtk_snapshot_push_color_matrix (snapshot, color_matrix, color_offset, "Recoloring Icon");
@@ -339,8 +325,8 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle *style,
if (color_matrix)
gtk_snapshot_pop (snapshot);
- if (n_shadows > 0)
+ if (has_shadow)
gtk_snapshot_pop (snapshot);
-
+
gtk_css_filter_value_pop_snapshot (filter_value, snapshot);
}
diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c
index d9d463a99c..4af505e259 100644
--- a/gtk/gtksnapshot.c
+++ b/gtk/gtksnapshot.c
@@ -1460,8 +1460,7 @@ gtk_snapshot_render_layout (GtkSnapshot *snapshot,
{
const GdkRGBA *fg_color;
GtkCssValue *shadows_value;
- GskShadow *shadows;
- gsize n_shadows;
+ gboolean has_shadow;
g_return_if_fail (snapshot != NULL);
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
@@ -1472,18 +1471,11 @@ gtk_snapshot_render_layout (GtkSnapshot *snapshot,
fg_color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
shadows_value = _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_SHADOW);
- n_shadows = gtk_css_shadows_value_get_n_shadows (shadows_value);
-
- if (n_shadows > 0)
- {
- shadows = g_newa (GskShadow, n_shadows);
- gtk_css_shadows_value_get_shadows (shadows_value, shadows);
- gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "TextShadow<%zu>", n_shadows);
- }
+ has_shadow = gtk_css_shadows_value_push_snapshot (shadows_value, snapshot);
gsk_pango_show_layout (snapshot, fg_color, layout);
- if (n_shadows > 0)
+ if (has_shadow)
gtk_snapshot_pop (snapshot);
gtk_snapshot_offset (snapshot, -x, -y);