From 54fe34f94a02ec01f1d82485ff7a897c1ff3712d Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 16 Nov 2016 16:17:40 +0000 Subject: [PATCH] gsk: Store a solid color inside GskRenderNode Some nodes render a solid color, and can be optimized depending on the rendering operation. --- gsk/gskrendernode.c | 35 +++++++++++++++++++++++++++++++++++ gsk/gskrendernode.h | 4 ++++ gsk/gskrendernodeprivate.h | 7 +++++++ 3 files changed, 46 insertions(+) diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index be64fbad46..5b1fa7b4de 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -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 diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index c6f5086562..a7cf437c30 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -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); diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h index 3447822060..594497d5d9 100644 --- a/gsk/gskrendernodeprivate.h +++ b/gsk/gskrendernodeprivate.h @@ -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);