cssshadowsvalue: Don't heap-allocate shadows

This showed up in profiles in certain scenarios, so export a
_get_n_shadows getter instead and let callers provide a sufficiently
large allocated array of GskShadows, which we can use with
g_alloc/g_newa.
This commit is contained in:
Timm Bäder
2017-09-30 13:11:51 +02:00
parent 53409623e5
commit 773973db78
4 changed files with 42 additions and 39 deletions

View File

@@ -268,23 +268,20 @@ _gtk_css_shadows_value_is_none (const GtkCssValue *shadows)
return shadows->len == 0;
}
GskShadow *
gtk_css_shadows_value_get_shadows (const GtkCssValue *shadows,
gsize *n_shadows)
gsize
gtk_css_shadows_value_get_n_shadows (const GtkCssValue *shadows)
{
return shadows->len;
}
void
gtk_css_shadows_value_get_shadows (const GtkCssValue *shadows,
GskShadow *out_shadows)
{
GskShadow *result;
guint i;
result = g_new (GskShadow, shadows->len);
for (i = 0; i < shadows->len; i++)
{
gtk_css_shadow_value_get_shadow (shadows->values[i], &result[i]);
}
*n_shadows = shadows->len;
return result;
gtk_css_shadow_value_get_shadow (shadows->values[i], &out_shadows[i]);
}
void

View File

@@ -36,8 +36,10 @@ GtkCssValue * _gtk_css_shadows_value_parse (GtkCssParser
gboolean _gtk_css_shadows_value_is_none (const GtkCssValue *shadows);
GskShadow * gtk_css_shadows_value_get_shadows (const GtkCssValue *shadows,
gsize *n_shadows);
gsize gtk_css_shadows_value_get_n_shadows (const GtkCssValue *shadows);
void gtk_css_shadows_value_get_shadows (const GtkCssValue *shadows,
GskShadow *out_shadows);
void _gtk_css_shadows_value_paint_layout (const GtkCssValue *shadows,
cairo_t *cr,

View File

@@ -118,9 +118,13 @@ gtk_css_style_snapshot_icon (GtkCssStyle *style,
gtk_css_filter_value_push_snapshot (filter_value, snapshot);
shadows = gtk_css_shadows_value_get_shadows (shadows_value, &n_shadows);
if (shadows)
gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "IconShadow<%zu>", n_shadows);
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);
}
if (graphene_matrix_is_identity (&transform_matrix))
{
@@ -143,11 +147,8 @@ gtk_css_style_snapshot_icon (GtkCssStyle *style,
gtk_snapshot_pop (snapshot);
}
if (shadows)
{
gtk_snapshot_pop (snapshot);
g_free (shadows);
}
if (n_shadows > 0)
gtk_snapshot_pop (snapshot);
gtk_css_filter_value_pop_snapshot (filter_value, snapshot);
}
@@ -295,9 +296,13 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle *style,
gtk_css_filter_value_push_snapshot (filter_value, snapshot);
shadows = gtk_css_shadows_value_get_shadows (shadows_value, &n_shadows);
if (shadows)
gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "IconShadow<%zu>", n_shadows);
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);
}
if (graphene_matrix_is_identity (&transform_matrix))
{
@@ -322,11 +327,8 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle *style,
gtk_snapshot_pop (snapshot);
}
if (shadows)
{
gtk_snapshot_pop (snapshot);
g_free (shadows);
}
if (n_shadows > 0)
gtk_snapshot_pop (snapshot);
gtk_css_filter_value_pop_snapshot (filter_value, snapshot);
}

View File

@@ -1396,17 +1396,19 @@ 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);
shadows = gtk_css_shadows_value_get_shadows (shadows_value, &n_shadows);
if (shadows)
gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "TextShadow<%zu>", n_shadows);
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);
}
gsk_pango_show_layout (snapshot, fg_color, layout);
if (shadows)
{
gtk_snapshot_pop (snapshot);
g_free (shadows);
}
if (n_shadows > 0)
gtk_snapshot_pop (snapshot);
gtk_snapshot_offset (snapshot, -x, -y);
}