[gtk+/wip/ebassi/render-solid-colors: 1/3] gsk: Store a solid color inside GskRenderNode



commit 54fe34f94a02ec01f1d82485ff7a897c1ff3712d
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Nov 16 16:17:40 2016 +0000

    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(+), 0 deletions(-)
---
diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c
index be64fba..5b1fa7b 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 c6f5086..a7cf437 100644
--- a/gsk/gskrendernode.h
+++ b/gsk/gskrendernode.h
@@ -126,6 +126,10 @@ void                    gsk_render_node_set_scaling_filter      (GskRenderNode *
                                                                  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);
 GDK_AVAILABLE_IN_3_90
diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h
index 3447822..594497d 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);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]