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.
This commit is contained in:
@@ -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 = { >K_CSS_VALUE_SHADOW, 1, TRUE, 0 };
|
||||
static GtkCssValue shadow_none_singleton = { >K_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 (>K_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 == >K_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);
|
||||
|
||||
Reference in New Issue
Block a user