[gegl] buffer: move the hot tile from buffer to storage
- From: Ãyvind KolÃs <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: move the hot tile from buffer to storage
- Date: Tue, 27 Mar 2012 18:05:42 +0000 (UTC)
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]