summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-02-06 09:44:16 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-02-06 16:10:34 -0500
commit429dfcf483701b9b4073170c91adc04b7e7ffdee (patch)
tree7e165f2172cd49d2c8b29042c9c438d1ba561dc1
parentbe3f352b593e59cf5f784fb3929acacf09f4d9c0 (diff)
downloadgtk+-429dfcf483701b9b4073170c91adc04b7e7ffdee.tar.gz
cssshadowvalue: Add a 'filter mode'
Shadow values created by gtk_css_shadow_value_new_filter or gtk_css_shadow_value_parse_filter interpret their radius value as standard deviation. Add a flag for this mode, and use it where necessary.
-rw-r--r--gtk/gtkcssshadowvalue.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index 3afc9592a0..86dfcafdfb 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -44,12 +44,14 @@ typedef struct {
struct _GtkCssValue {
GTK_CSS_VALUE_BASE
+ guint is_filter : 1; /* values stored in radius are std_dev, for drop-shadow */
guint n_shadows;
ShadowValue shadows[1];
};
static GtkCssValue * gtk_css_shadow_value_new (ShadowValue *shadows,
- guint n_shadows);
+ guint n_shadows,
+ gboolean is_filter);
static void
shadow_value_for_transition (ShadowValue *result,
@@ -133,7 +135,7 @@ gtk_css_value_shadow_compute (GtkCssValue *value,
shadows[i].inset = shadow->inset;
}
- return gtk_css_shadow_value_new (shadows, value->n_shadows);
+ return gtk_css_shadow_value_new (shadows, value->n_shadows, value->is_filter);
}
static gboolean
@@ -227,7 +229,7 @@ gtk_css_value_shadow_transition (GtkCssValue *start,
}
}
- return gtk_css_shadow_value_new (shadows, len);
+ return gtk_css_shadow_value_new (shadows, len, start->is_filter);
}
static void
@@ -284,7 +286,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_SHADOW = {
gtk_css_value_shadow_print
};
-static GtkCssValue shadow_none_singleton = { &GTK_CSS_VALUE_SHADOW, 1, TRUE, 0 };
+static GtkCssValue shadow_none_singleton = { &GTK_CSS_VALUE_SHADOW, 1, TRUE, FALSE, 0 };
GtkCssValue *
gtk_css_shadow_value_new_none (void)
@@ -294,7 +296,8 @@ gtk_css_shadow_value_new_none (void)
static GtkCssValue *
gtk_css_shadow_value_new (ShadowValue *shadows,
- guint n_shadows)
+ guint n_shadows,
+ gboolean is_filter)
{
GtkCssValue *retval;
guint i;
@@ -304,11 +307,11 @@ gtk_css_shadow_value_new (ShadowValue *shadows,
retval = _gtk_css_value_alloc (&GTK_CSS_VALUE_SHADOW, sizeof (GtkCssValue) + sizeof (ShadowValue) * (n_shadows - 1));
retval->n_shadows = n_shadows;
+ retval->is_filter = is_filter;
memcpy (retval->shadows, shadows, sizeof (ShadowValue) * n_shadows);
retval->is_computed = TRUE;
-
for (i = 0; i < n_shadows; i++)
{
const ShadowValue *shadow = &retval->shadows[i];
@@ -339,7 +342,7 @@ gtk_css_shadow_value_new_filter (void)
value.spread = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
value.color = _gtk_css_color_value_new_current_color ();
- return gtk_css_shadow_value_new (&value, 1);
+ return gtk_css_shadow_value_new (&value, 1, TRUE);
}
enum {
@@ -501,7 +504,7 @@ gtk_css_shadow_value_parse (GtkCssParser *parser,
}
} while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA));
- return gtk_css_shadow_value_new (shadows, n_shadows);
+ return gtk_css_shadow_value_new (shadows, n_shadows, FALSE);
fail:
for (i = 0; i < n_shadows; i++)
@@ -519,7 +522,7 @@ gtk_css_shadow_value_parse_filter (GtkCssParser *parser)
ShadowValue shadow;
if (gtk_css_shadow_value_parse_one (parser, FALSE, &shadow))
- return gtk_css_shadow_value_new (&shadow, 1);
+ return gtk_css_shadow_value_new (&shadow, 1, TRUE);
else
return NULL;
}
@@ -539,6 +542,8 @@ gtk_css_shadow_value_get_extents (const GtkCssValue *value,
spread = _gtk_css_number_value_get (shadow->spread, 0);
radius = _gtk_css_number_value_get (shadow->radius, 0);
+ if (value->is_filter)
+ radius = radius * 2;
clip_radius = gsk_cairo_blur_compute_pixels (radius);
hoffset = _gtk_css_number_value_get (shadow->hoffset, 0);
voffset = _gtk_css_number_value_get (shadow->voffset, 0);
@@ -556,6 +561,8 @@ gtk_css_shadow_value_snapshot_outset (const GtkCssValue *value,
const GskRoundedRect *border_box)
{
guint i;
+ double dx, dy, spread, radius;
+ const GdkRGBA *color;
g_return_if_fail (value->class == &GTK_CSS_VALUE_SHADOW);
@@ -566,17 +573,20 @@ gtk_css_shadow_value_snapshot_outset (const GtkCssValue *value,
if (shadow->inset)
continue;
+ color = gtk_css_color_value_get_rgba (shadow->color);
+
/* We don't need to draw invisible shadows */
- if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+ if (gdk_rgba_is_clear (color))
continue;
- gtk_snapshot_append_outset_shadow (snapshot,
- border_box,
- gtk_css_color_value_get_rgba (shadow->color),
- _gtk_css_number_value_get (shadow->hoffset, 0),
- _gtk_css_number_value_get (shadow->voffset, 0),
- _gtk_css_number_value_get (shadow->spread, 0),
- _gtk_css_number_value_get (shadow->radius, 0));
+ dx = _gtk_css_number_value_get (shadow->hoffset, 0);
+ dy = _gtk_css_number_value_get (shadow->voffset, 0);
+ spread = _gtk_css_number_value_get (shadow->spread, 0);
+ radius = _gtk_css_number_value_get (shadow->radius, 0);
+ if (value->is_filter)
+ radius = 2 * radius;
+
+ gtk_snapshot_append_outset_shadow (snapshot, border_box, color, dx, dy, spread, radius);
}
}
@@ -598,15 +608,18 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue *value,
if (!shadow->inset)
continue;
+ color = gtk_css_color_value_get_rgba (shadow->color);
+
/* We don't need to draw invisible shadows */
- if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+ if (gdk_rgba_is_clear (color))
continue;
dx = _gtk_css_number_value_get (shadow->hoffset, 0);
dy = _gtk_css_number_value_get (shadow->voffset, 0);
spread = _gtk_css_number_value_get (shadow->spread, 0);
radius = _gtk_css_number_value_get (shadow->radius, 0);
- color = gtk_css_color_value_get_rgba (shadow->color);
+ if (value->is_filter)
+ radius = 2 * radius;
/* These are trivial to do with a color node */
if (spread == 0 && radius == 0 &&
@@ -725,6 +738,8 @@ gtk_css_shadow_value_push_snapshot (const GtkCssValue *value,
shadows[i].dy = _gtk_css_number_value_get (shadow->voffset, 0);
shadows[i].color = *gtk_css_color_value_get_rgba (shadow->color);
shadows[i].radius = _gtk_css_number_value_get (shadow->radius, 0);
+ if (value->is_filter)
+ shadows[i].radius *= 2;
}
gtk_snapshot_push_shadow (snapshot, shadows, value->n_shadows);