[gtk+/wip/ebassi/gsk: 11/11] gsk: Add GSK layer content delegate



commit 29599d460b86daf35617a9fb50407bc88d85334a
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Mon Aug 3 18:53:32 2015 +0100

    gsk: Add GSK layer content delegate
    
    A simple interface that can be used to implement delegate objects that
    will draw the contents of one or more layers.

 gsk/Makefile.am              |    3 ++
 gsk/gsk.h                    |    1 +
 gsk/gsklayer.c               |   16 ++++++++
 gsk/gsklayer.h               |   20 +++++++---
 gsk/gsklayercontent.c        |   82 ++++++++++++++++++++++++++++++++++++++++++
 gsk/gsklayercontent.h        |   50 +++++++++++++++++++++++++
 gsk/gsklayercontentprivate.h |   17 +++++++++
 gsk/gsktypes.h               |    2 +
 8 files changed, 185 insertions(+), 6 deletions(-)
---
diff --git a/gsk/Makefile.am b/gsk/Makefile.am
index 47f6f0f..e396e33 100644
--- a/gsk/Makefile.am
+++ b/gsk/Makefile.am
@@ -41,6 +41,7 @@ gsk_public_source_h = \
        gskdebug.h \
        gskenums.h \
        gsklayer.h \
+       gsklayercontent.h \
        gsklayeriter.h \
        gsklayoutmanager.h \
        gskmacros.h \
@@ -48,6 +49,7 @@ gsk_public_source_h = \
        gsktypes.h
 
 gsk_private_source_h = \
+       gsklayercontentprivate.h \
        gsklayerprivate.h
 
 gsk_private_source_c =
@@ -61,6 +63,7 @@ gsk_built_source_c = \
 gsk_source_c = \
        gskdebug.c \
        gsklayer.c \
+       gsklayercontent.c \
        gsklayeriter.c \
        gsklayerstate.c \
        gsklayoutmanager.c \
diff --git a/gsk/gsk.h b/gsk/gsk.h
index 1eef652..807cb0b 100644
--- a/gsk/gsk.h
+++ b/gsk/gsk.h
@@ -27,6 +27,7 @@
 #include <gsk/gskenums.h>
 #include <gsk/gskenumtypes.h>
 #include <gsk/gsklayer.h>
+#include <gsk/gsklayercontent.h>
 #include <gsk/gsklayeriter.h>
 #include <gsk/gsklayoutmanager.h>
 #include <gsk/gskrenderer.h>
diff --git a/gsk/gsklayer.c b/gsk/gsklayer.c
index 6f4d81a..c24e61d 100644
--- a/gsk/gsklayer.c
+++ b/gsk/gsklayer.c
@@ -26,6 +26,8 @@
 #include "config.h"
 
 #include "gsklayerprivate.h"
+
+#include "gsklayercontentprivate.h"
 #include "gsklayoutmanager.h"
 #include "gskdebug.h"
 
@@ -57,10 +59,20 @@ typedef struct {
   /* The target state of the layer */
   GskLayerState model;
 
+  /* The presentation state of the layer; if nothing changes during the
+   * frame presentation, this is just a pointer to the model
+   */
+  GskLayerState *presentation;
+
+  /* The frame clock used by the top-level layer */
   GdkFrameClock *frame_clock;
 
+  /* The delegate object for the children layout */
   GskLayoutManager *layout_manager;
 
+  /* The delegate object for the content of the layer */
+  GskLayerContent *layer_content;
+
   /* Bitfields: keep at the end */
   guint hidden : 1;
   guint needs_redraw : 1;
@@ -211,6 +223,7 @@ static gboolean
 gsk_layer_real_draw (GskLayer *self,
                      cairo_t *cr)
 {
+  GskLayerPrivate *priv = gsk_layer_get_instance_private (self);
   GskLayerState *state = gsk_layer_get_state (self);
   const RenderInfo *rinfo = gsk_layer_state_peek_render_info (state);
   const GeometryInfo *ginfo = gsk_layer_state_peek_geometry_info (state);
@@ -228,6 +241,9 @@ gsk_layer_real_draw (GskLayer *self,
 
   cairo_restore (cr);
 
+  if (priv->layer_content != NULL)
+    gsk_layer_content_draw (priv->layer_content, self, cr);
+
   GSK_LAYER_PRIV (self)->needs_redraw = FALSE;
 
   return FALSE;
diff --git a/gsk/gsklayer.h b/gsk/gsklayer.h
index 288780d..0b1f001 100644
--- a/gsk/gsklayer.h
+++ b/gsk/gsklayer.h
@@ -130,23 +130,31 @@ void            gsk_layer_set_hidden                    (GskLayer *self,
                                                          gboolean  hidden);
 GDK_AVAILABLE_IN_3_18
 gboolean        gsk_layer_get_hidden                    (GskLayer *self);
+
+/* Content */
+
 GDK_AVAILABLE_IN_3_18
-void            gsk_layer_set_opacity                   (GskLayer *self,
+void                    gsk_layer_set_opacity           (GskLayer *self,
                                                          double    opacity);
 GDK_AVAILABLE_IN_3_18
-double          gsk_layer_get_opacity                   (GskLayer *self);
+double                  gsk_layer_get_opacity           (GskLayer *self);
 GDK_AVAILABLE_IN_3_18
-void            gsk_layer_set_background_color          (GskLayer *self,
+void                    gsk_layer_set_background_color  (GskLayer *self,
                                                          const GdkRGBA *bg_color);
 GDK_AVAILABLE_IN_3_18
-void            gsk_layer_get_background_color          (GskLayer *self,
+void                    gsk_layer_get_background_color  (GskLayer *self,
                                                          GdkRGBA *bg_color);
 GDK_AVAILABLE_IN_3_18
-void            gsk_layer_set_clip                      (GskLayer *self,
+void                    gsk_layer_set_clip              (GskLayer *self,
                                                          const graphene_rect_t *clip);
 GDK_AVAILABLE_IN_3_18
-void            gsk_layer_get_clip                      (GskLayer *self,
+void                    gsk_layer_get_clip              (GskLayer *self,
                                                          graphene_rect_t *clip);
+GDK_AVAILABLE_IN_3_18
+void                    gsk_layer_set_content           (GskLayer *self,
+                                                         GskLayerContent *content);
+GDK_AVAILABLE_IN_3_18
+GskLayerContent *       gsk_layer_get_content           (GskLayer *self);
 
 /* Geometry */
 
diff --git a/gsk/gsklayercontent.c b/gsk/gsklayercontent.c
new file mode 100644
index 0000000..dc459dd
--- /dev/null
+++ b/gsk/gsklayercontent.c
@@ -0,0 +1,82 @@
+/* GSK - The GTK scene graph toolkit
+ * Copyright 2015  Emmanuele Bassi 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gsklayercontentprivate.h"
+#include "gsklayerprivate.h"
+
+G_DEFINE_INTERFACE (GskLayerContent, gsk_layer_content, G_TYPE_OBJECT)
+
+static void
+gsk_layer_content_real_draw (GskLayerContent *self,
+                             GskLayer        *layer,
+                             cairo_t         *cr)
+{
+}
+
+static gboolean
+gsk_layer_content_real_get_preferred_size (GskLayerContent *self,
+                                           graphene_size_t *size)
+{
+  return FALSE;
+}
+
+static gboolean
+gsk_layer_content_real_needs_redraw (GskLayerContent *self)
+{
+  return FALSE;
+}
+
+static void
+gsk_layer_content_default_init (GskLayerContentInterface *iface)
+{
+  iface->get_preferred_size = gsk_layer_content_real_get_preferred_size;
+  iface->needs_redraw = gsk_layer_content_real_needs_redraw;
+  iface->draw = gsk_layer_content_real_draw;
+}
+
+gboolean
+gsk_layer_content_get_preferred_size (GskLayerContent *content,
+                                      graphene_size_t *size)
+{
+  g_return_val_if_fail (GSK_IS_LAYER_CONTENT (content), FALSE);
+  g_return_val_if_fail (size != NULL, FALSE);
+
+  return GSK_LAYER_CONTENT_GET_IFACE (content)->get_preferred_size (content, size);
+}
+
+void
+gsk_layer_content_draw (GskLayerContent *content,
+                        GskLayer        *layer,
+                        cairo_t         *cr)
+{
+  g_return_if_fail (GSK_IS_LAYER_CONTENT (content));
+  g_return_if_fail (GSK_IS_LAYER (layer));
+  g_return_if_fail (cr != NULL);
+  g_return_if_fail (cairo_status (cr) == CAIRO_STATUS_SUCCESS);
+
+  GSK_LAYER_CONTENT_GET_IFACE (content)->draw (content, layer, cr);
+}
+
+gboolean
+gsk_layer_content_needs_redraw (GskLayerContent *content)
+{
+  g_return_val_if_fail (GSK_IS_LAYER_CONTENT (content), FALSE);
+
+  return GSK_LAYER_CONTENT_GET_IFACE (content)->needs_redraw (content);
+}
diff --git a/gsk/gsklayercontent.h b/gsk/gsklayercontent.h
new file mode 100644
index 0000000..45fad1c
--- /dev/null
+++ b/gsk/gsklayercontent.h
@@ -0,0 +1,50 @@
+/* GSK - The GTK scene graph toolkit
+ * Copyright 2015  Emmanuele Bassi 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GSK_LAYER_CONTENT_H__
+#define __GSK_LAYER_CONTENT_H__
+
+#if !defined (__GSK_H_INSIDE__) && !defined (GSK_COMPILATION)
+#error "Only <gsk/gsk.h> can be included directly."
+#endif
+
+#include <gsk/gsktypes.h>
+
+G_BEGIN_DECLS
+
+#define GSK_TYPE_LAYER_CONTENT (gsk_layer_content_get_type ())
+
+GDK_AVAILABLE_IN_3_18
+G_DECLARE_INTERFACE (GskLayerContent, gsk_layer_content, GSK, LAYER_CONTENT, GObject)
+
+struct _GskLayerContentInterface
+{
+  GTypeInterface g_iface;
+
+  void     (* draw) (GskLayerContent *content,
+                     GskLayer        *layer,
+                     cairo_t         *cr);
+
+  gboolean (* needs_redraw) (GskLayerContent *content);
+
+  gboolean (* get_preferred_size) (GskLayerContent *content,
+                                   graphene_size_t *size);
+};
+
+G_END_DECLS
+
+#endif /* __GSK_LAYER_CONTENT_H__ */
diff --git a/gsk/gsklayercontentprivate.h b/gsk/gsklayercontentprivate.h
new file mode 100644
index 0000000..207cb85
--- /dev/null
+++ b/gsk/gsklayercontentprivate.h
@@ -0,0 +1,17 @@
+#ifndef __GSK_LAYER_CONTENT_PRIVATE_H__
+#define __GSK_LAYER_CONTENT_PRIVATE_H__
+
+#include "gsklayercontent.h"
+
+G_BEGIN_DECLS
+
+void            gsk_layer_content_draw                  (GskLayerContent *self,
+                                                         GskLayer        *layer,
+                                                         cairo_t         *cr);
+gboolean        gsk_layer_content_get_preferred_size    (GskLayerContent *self,
+                                                         graphene_size_t *size);
+gboolean        gsk_layer_content_needs_redraw          (GskLayerContent *self);
+
+G_END_DECLS
+
+#endif /* __GSK_LAYER_CONTENT_PRIVATE_H__ */
diff --git a/gsk/gsktypes.h b/gsk/gsktypes.h
index f77b2ae..084d306 100644
--- a/gsk/gsktypes.h
+++ b/gsk/gsktypes.h
@@ -32,8 +32,10 @@ G_BEGIN_DECLS
 
 typedef struct _GskLayer                GskLayer;
 typedef struct _GskLayerIter            GskLayerIter;
+
 typedef struct _GskRenderer             GskRenderer;
 typedef struct _GskLayoutManager        GskLayoutManager;
+typedef struct _GskLayerContent         GskLayerContent;
 
 G_END_DECLS
 


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