[gegl] buffer: cache the backend of each buffer



commit ba9e3a145d826e628616138f349497741042718a
Author: Ãyvind KolÃs <pippin gimp org>
Date:   Thu May 3 22:33:25 2012 +0200

    buffer: cache the backend of each buffer
    
    For a given buffer, the backend will never change - thus we can cache the
    result and avoid walking the source list as well as avoid many type checks.

 gegl/buffer/gegl-buffer-private.h |    1 +
 gegl/buffer/gegl-buffer.c         |   27 ++++++++++++++++++++-------
 gegl/buffer/gegl-tile-storage.c   |    4 ++--
 3 files changed, 23 insertions(+), 9 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-private.h b/gegl/buffer/gegl-buffer-private.h
index bc6f792..7886a8a 100644
--- a/gegl/buffer/gegl-buffer-private.h
+++ b/gegl/buffer/gegl-buffer-private.h
@@ -95,6 +95,7 @@ void              gegl_tile_cache_init    (void);
 void              gegl_tile_cache_destroy (void);
 
 GeglTileBackend * gegl_buffer_backend     (GeglBuffer *buffer);
+GeglTileBackend * gegl_buffer_backend2    (GeglBuffer *buffer); /* non-cached */
 
 gboolean          gegl_buffer_is_shared   (GeglBuffer *buffer);
 
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index 534607c..10b0c9e 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -444,8 +444,9 @@ gegl_buffer_finalize (GObject *object)
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
+
 GeglTileBackend *
-gegl_buffer_backend (GeglBuffer *buffer)
+gegl_buffer_backend2 (GeglBuffer *buffer)
 {
   GeglTileSource *tmp = GEGL_TILE_SOURCE (buffer);
 
@@ -456,7 +457,6 @@ gegl_buffer_backend (GeglBuffer *buffer)
     {
       tmp = GEGL_TILE_HANDLER (tmp)->source;
     } while (tmp &&
-             /*GEGL_IS_TILE_TRAIT (tmp) &&*/
              !GEGL_IS_TILE_BACKEND (tmp));
   if (!tmp &&
       !GEGL_IS_TILE_BACKEND (tmp))
@@ -465,15 +465,28 @@ gegl_buffer_backend (GeglBuffer *buffer)
   return (GeglTileBackend *) tmp;
 }
 
+GeglTileBackend *
+gegl_buffer_backend (GeglBuffer *buffer)
+{
+  GeglTileBackend *tmp;
+  if (G_LIKELY (buffer->backend))
+    return buffer->backend;
+
+  tmp = gegl_buffer_backend2 (buffer);
+
+  if (tmp)
+    buffer->backend = tmp;
+
+  return (GeglTileBackend *) tmp;
+}
+
 static GeglTileStorage *
 gegl_buffer_tile_storage (GeglBuffer *buffer)
 {
-  GeglTileSource *tmp = GEGL_TILE_SOURCE (buffer);
+  GeglTileSource *tmp = (GeglTileSource*) (buffer);
 
-  do
-    {
-      tmp = ((GeglTileHandler *) (tmp))->source;
-    } while (!GEGL_IS_TILE_STORAGE (tmp));
+  do tmp = ((GeglTileHandler *) (tmp))->source;
+  while (!GEGL_IS_TILE_STORAGE (tmp));
 
   g_assert (tmp);
 
diff --git a/gegl/buffer/gegl-tile-storage.c b/gegl/buffer/gegl-tile-storage.c
index 9393962..88e9032 100644
--- a/gegl/buffer/gegl-tile-storage.c
+++ b/gegl/buffer/gegl-tile-storage.c
@@ -133,8 +133,8 @@ gegl_tile_storage_new (GeglTileBackend *backend)
   cache->tile_storage = tile_storage;
   gegl_tile_handler_chain_bind (tile_handler_chain);
 
-  ((GeglTileBackend *)gegl_buffer_backend ((void*)tile_storage))->priv->storage = (gpointer)
-                                             tile_storage;
+  ((GeglTileBackend *)gegl_buffer_backend2 ((void*)tile_storage))->priv->storage = (gpointer)
+                                              tile_storage;
 
   tile_storage->idle_swapper = g_timeout_add_full (G_PRIORITY_LOW,
                                               250,



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