gsk: Store a solid color inside GskRenderNode

Some nodes render a solid color, and can be optimized depending on the
rendering operation.
This commit is contained in:
Emmanuele Bassi
2016-11-16 16:17:40 +00:00
parent 0cec768b54
commit 54fe34f94a
3 changed files with 46 additions and 0 deletions

View File

@@ -1228,6 +1228,14 @@ gsk_render_node_has_texture (GskRenderNode *node)
return node->texture != NULL;
}
gboolean
gsk_render_node_has_solid_color (GskRenderNode *node)
{
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), FALSE);
return node->solid_color_set;
}
GskTexture *
gsk_render_node_get_texture (GskRenderNode *node)
{
@@ -1236,6 +1244,15 @@ gsk_render_node_get_texture (GskRenderNode *node)
return node->texture;
}
void
gsk_render_node_get_solid_color (GskRenderNode *node,
GdkRGBA *color)
{
g_return_if_fail (GSK_IS_RENDER_NODE (node));
*color = node->solid_color;
}
/**
* gsk_render_node_set_texture:
* @node: a #GskRenderNode
@@ -1263,6 +1280,24 @@ gsk_render_node_set_texture (GskRenderNode *node,
gsk_texture_ref (texture);
}
void
gsk_render_node_set_solid_color (GskRenderNode *node,
const GdkRGBA *color)
{
g_return_if_fail (GSK_IS_RENDER_NODE (node));
if (color != NULL)
{
if (gdk_rgba_equal (color, &node->solid_color))
return;
node->solid_color = *color;
node->solid_color_set = TRUE;
}
else
node->solid_color_set = FALSE;
}
/*< private >
* gsk_render_node_get_surface:
* @node: a #GskRenderNode

View File

@@ -125,6 +125,10 @@ void gsk_render_node_set_scaling_filter (GskRenderNode *
GskScalingFilter min_filter,
GskScalingFilter mag_filter);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_set_solid_color (GskRenderNode *node,
const GdkRGBA *color);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_set_name (GskRenderNode *node,
const char *name);

View File

@@ -37,6 +37,8 @@ struct _GskRenderNode
/* The contents of the node as a texture */
GskTexture *texture;
GdkRGBA solid_color;
/* Paint opacity */
double opacity;
@@ -63,6 +65,7 @@ struct _GskRenderNode
gboolean hidden : 1;
gboolean opaque : 1;
gboolean transform_set : 1;
gboolean solid_color_set : 1;
gboolean needs_world_matrix_update : 1;
};
@@ -87,8 +90,12 @@ cairo_surface_t *gsk_render_node_get_surface (GskRenderNode *node);
GskTexture *gsk_render_node_get_texture (GskRenderNode *node);
void gsk_render_node_get_solid_color (GskRenderNode *node,
GdkRGBA *color);
gboolean gsk_render_node_has_surface (GskRenderNode *node);
gboolean gsk_render_node_has_texture (GskRenderNode *node);
gboolean gsk_render_node_has_solid_color (GskRenderNode *node);
GskBlendMode gsk_render_node_get_blend_mode (GskRenderNode *node);