[gegl] buffer: move the hot tile from buffer to storage



commit b55dfabf27d7ebf358151e1bb8016755b85778f4
Author: Ãyvind KolÃs <pippin gimp org>
Date:   Tue Mar 27 19:04:06 2012 +0100

    buffer: move the hot tile from buffer to storage
    
    This was needed to permit dropping the hot tile when the cache of the storage
    is resynced (the tiles are dropped to be re-fetched from the backend).

 gegl/buffer/gegl-buffer-access.c      |   38 +++++++++++---------------------
 gegl/buffer/gegl-buffer-private.h     |    3 +-
 gegl/buffer/gegl-buffer.c             |   34 ++++++++++-------------------
 gegl/buffer/gegl-tile-handler-cache.c |   15 +++++++-----
 gegl/buffer/gegl-tile-handler-cache.h |    6 +++++
 gegl/buffer/gegl-tile-storage.c       |    1 +
 gegl/buffer/gegl-tile-storage.h       |    3 ++
 7 files changed, 45 insertions(+), 55 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index 9b801a5..29897bc 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -164,19 +164,15 @@ gegl_buffer_set_pixel (GeglBuffer *buffer,
         gint      indice_y = gegl_tile_indice (tiledy, tile_height);
         GeglTile *tile     = NULL;
 
-        if (buffer->hot_tile &&
-            buffer->hot_tile->x == indice_x &&
-            buffer->hot_tile->y == indice_y)
+        if (buffer->tile_storage->hot_tile &&
+            buffer->tile_storage->hot_tile->x == indice_x &&
+            buffer->tile_storage->hot_tile->y == indice_y)
           {
-            tile = buffer->hot_tile;
+            tile = buffer->tile_storage->hot_tile;
           }
         else
           {
-            if (buffer->hot_tile)
-              {
-                gegl_tile_unref (buffer->hot_tile);
-                buffer->hot_tile = NULL;
-              }
+            _gegl_buffer_drop_hot_tile (buffer);
             tile = gegl_tile_source_get_tile ((GeglTileSource *) (buffer),
                                              indice_x, indice_y,
                                              0);
@@ -198,7 +194,7 @@ gegl_buffer_set_pixel (GeglBuffer *buffer,
               memcpy (tp, buf, bpx_size);
 
             gegl_tile_unlock (tile);
-            buffer->hot_tile = tile;
+            buffer->tile_storage->hot_tile = tile;
           }
       }
   }
@@ -242,19 +238,15 @@ gegl_buffer_get_pixel (GeglBuffer *buffer,
         gint      indice_y = gegl_tile_indice (tiledy, tile_height);
         GeglTile *tile     = NULL;
 
-        if (buffer->hot_tile &&
-            buffer->hot_tile->x == indice_x &&
-            buffer->hot_tile->y == indice_y)
+        if (buffer->tile_storage->hot_tile &&
+            buffer->tile_storage->hot_tile->x == indice_x &&
+            buffer->tile_storage->hot_tile->y == indice_y)
           {
-            tile = buffer->hot_tile;
+            tile = buffer->tile_storage->hot_tile;
           }
         else
           {
-            if (buffer->hot_tile)
-              {
-                gegl_tile_unref (buffer->hot_tile);
-                buffer->hot_tile = NULL;
-              }
+            _gegl_buffer_drop_hot_tile (buffer);
             tile = gegl_tile_source_get_tile ((GeglTileSource *) (buffer),
                                            indice_x, indice_y,
                                            0);
@@ -272,7 +264,7 @@ gegl_buffer_get_pixel (GeglBuffer *buffer,
               memcpy (buf, tp, px_size);
 
             /*gegl_tile_unref (tile);*/
-            buffer->hot_tile = tile;
+            buffer->tile_storage->hot_tile = tile;
           }
       }
   }
@@ -289,11 +281,7 @@ gegl_buffer_flush (GeglBuffer *buffer)
   g_return_if_fail (GEGL_IS_BUFFER (buffer));
   backend = gegl_buffer_backend (buffer);
 
-  if (buffer->hot_tile)
-    {
-      gegl_tile_unref (buffer->hot_tile);
-      buffer->hot_tile = NULL;
-    }
+  _gegl_buffer_drop_hot_tile (buffer);
 
   if ((GeglBufferHeader*)(backend->priv->header))
     {
diff --git a/gegl/buffer/gegl-buffer-private.h b/gegl/buffer/gegl-buffer-private.h
index 398f7b5..8635aef 100644
--- a/gegl/buffer/gegl-buffer-private.h
+++ b/gegl/buffer/gegl-buffer-private.h
@@ -49,8 +49,6 @@ struct _GeglBuffer
 
   GeglRectangle     abyss;
 
-  GeglTile         *hot_tile; /* cached tile for speeding up gegl_buffer_get_pixel
-                                 and gegl_buffer_set_pixel (1x1 sized gets/sets)*/
 
   GeglSampler      *sampler; /* cached sampler for speeding up random
                                 access interpolated fetches from the
@@ -170,6 +168,7 @@ struct _GeglTile
   gpointer         unlock_notify_data;
 };
 
+void _gegl_buffer_drop_hot_tile (GeglBuffer *buffer);
 
 #ifndef __GEGL_TILE_C
 #define gegl_tile_get_data(tile)  ((guchar*)((tile)->data))
diff --git a/gegl/buffer/gegl-buffer.c b/gegl/buffer/gegl-buffer.c
index 153ce13..fa11b1a 100644
--- a/gegl/buffer/gegl-buffer.c
+++ b/gegl/buffer/gegl-buffer.c
@@ -386,6 +386,17 @@ gint gegl_buffer_leaks (void)
   return allocated_buffers - de_allocated_buffers;
 }
 
+void
+_gegl_buffer_drop_hot_tile (GeglBuffer *buffer)
+{
+  GeglTileStorage *storage = buffer->tile_storage;
+  if (storage->hot_tile)
+    {
+      gegl_tile_unref (storage->hot_tile);
+      storage->hot_tile = NULL;
+    }
+}
+
 static void
 gegl_buffer_dispose (GObject *object)
 {
@@ -416,12 +427,7 @@ gegl_buffer_dispose (GObject *object)
 #endif
     }
 
-  if (buffer->hot_tile)
-    {
-      gegl_tile_unref (buffer->hot_tile);
-      buffer->hot_tile = NULL;
-    }
-
+  _gegl_buffer_drop_hot_tile (buffer);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -956,22 +962,6 @@ void gegl_bt (void)
 static void
 gegl_buffer_init (GeglBuffer *buffer)
 {
-  buffer->extent.x      = 0;
-  buffer->extent.y      = 0;
-  buffer->extent.width  = 0;
-  buffer->extent.height = 0;
-
-  buffer->shift_x      = 0;
-  buffer->shift_y      = 0;
-  buffer->abyss.x      = 0;
-  buffer->abyss.y      = 0;
-  buffer->abyss.width  = 0;
-  buffer->abyss.height = 0;
-  buffer->format       = NULL;
-  buffer->soft_format  = NULL;
-  buffer->hot_tile     = NULL;
-
-  buffer->path = NULL;
   buffer->tile_width = 128;
   buffer->tile_height = 64;
   ((GeglTileSource*)buffer)->command = gegl_buffer_command;
diff --git a/gegl/buffer/gegl-tile-handler-cache.c b/gegl/buffer/gegl-tile-handler-cache.c
index 2114469..b0b4445 100644
--- a/gegl/buffer/gegl-tile-handler-cache.c
+++ b/gegl/buffer/gegl-tile-handler-cache.c
@@ -28,6 +28,7 @@
 #include "gegl-buffer-private.h"
 #include "gegl-tile.h"
 #include "gegl-tile-handler-cache.h"
+#include "gegl-tile-storage.h"
 #include "gegl-debug.h"
 
 #include "gegl-buffer-cl-cache.h"
@@ -46,12 +47,6 @@ typedef struct CacheItem
   gint      z;
 } CacheItem;
 
-struct _GeglTileHandlerCache
-{
-  GeglTileHandler parent_instance;
-  GSList *free_list;
-};
-
 
 static void       gegl_tile_handler_cache_dispose    (GObject              *object);
 static gboolean   gegl_tile_handler_cache_wash       (GeglTileHandlerCache *cache);
@@ -135,6 +130,14 @@ gegl_tile_handler_cache_reinit (GeglTileHandlerCache *cache)
 
   g_static_mutex_lock (&mutex);
   /* only throw out items belonging to this cache instance */
+
+  if (cache->tile_storage->hot_tile)
+    {
+      gegl_tile_unref (cache->tile_storage->hot_tile);
+      cache->tile_storage->hot_tile = NULL;
+    }
+
+
   cache->free_list = NULL;
   g_queue_foreach (cache_queue, gegl_tile_handler_cache_reinit_buffer_tiles, cache);
   for (iter = cache->free_list; iter; iter = g_slist_next (iter))
diff --git a/gegl/buffer/gegl-tile-handler-cache.h b/gegl/buffer/gegl-tile-handler-cache.h
index d421121..81b40fa 100644
--- a/gegl/buffer/gegl-tile-handler-cache.h
+++ b/gegl/buffer/gegl-tile-handler-cache.h
@@ -36,6 +36,12 @@
 typedef struct _GeglTileHandlerCache      GeglTileHandlerCache;
 typedef struct _GeglTileHandlerCacheClass GeglTileHandlerCacheClass;
 
+struct _GeglTileHandlerCache
+{
+  GeglTileHandler  parent_instance;
+  GeglTileStorage *tile_storage;
+  GSList          *free_list;
+};
 
 struct _GeglTileHandlerCacheClass
 {
diff --git a/gegl/buffer/gegl-tile-storage.c b/gegl/buffer/gegl-tile-storage.c
index e4689cb..9393962 100644
--- a/gegl/buffer/gegl-tile-storage.c
+++ b/gegl/buffer/gegl-tile-storage.c
@@ -130,6 +130,7 @@ gegl_tile_storage_new (GeglTileBackend *backend)
                                  g_object_new (GEGL_TYPE_TILE_HANDLER_LOG, NULL));
 #endif
   tile_storage->cache = cache;
+  cache->tile_storage = tile_storage;
   gegl_tile_handler_chain_bind (tile_handler_chain);
 
   ((GeglTileBackend *)gegl_buffer_backend ((void*)tile_storage))->priv->storage = (gpointer)
diff --git a/gegl/buffer/gegl-tile-storage.h b/gegl/buffer/gegl-tile-storage.h
index aa38c7c..e1de893 100644
--- a/gegl/buffer/gegl-tile-storage.h
+++ b/gegl/buffer/gegl-tile-storage.h
@@ -50,6 +50,9 @@ struct _GeglTileStorage
   gint           seen_zoom; /* the maximum zoom level we've seen tiles for */
 
   guint          idle_swapper;
+
+  GeglTile      *hot_tile; /* cached tile for speeding up gegl_buffer_get_pixel
+                              and gegl_buffer_set_pixel (1x1 sized gets/sets)*/
 };
 
 struct _GeglTileStorageClass



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