[gegl] buffer: add a command to the tile architecture for reiniting
- From: Ãyvind KolÃs <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] buffer: add a command to the tile architecture for reiniting
- Date: Wed, 14 Mar 2012 00:37:58 +0000 (UTC)
commit db43a7d8a42f0ae1ecc29fc4f8dcb4180da02ea2
Author: Ãyvind KolÃs <pippin gimp org>
Date: Wed Mar 14 00:03:02 2012 +0000
buffer: add a command to the tile architecture for reiniting
This is meant to be called from a tile backend to cause GeglBuffer to drop all
cached tiles.
gegl/buffer/gegl-buffer-private.h | 1 +
gegl/buffer/gegl-tile-backend-file.c | 13 +++------
gegl/buffer/gegl-tile-backend.c | 6 ++++
gegl/buffer/gegl-tile-backend.h | 3 ++
gegl/buffer/gegl-tile-handler-cache.c | 45 +++++++++++++++++++++++++++++++++
gegl/buffer/gegl-tile-source.h | 12 +++++++++
6 files changed, 71 insertions(+), 9 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-private.h b/gegl/buffer/gegl-buffer-private.h
index 4acd333..11323ed 100644
--- a/gegl/buffer/gegl-buffer-private.h
+++ b/gegl/buffer/gegl-buffer-private.h
@@ -174,6 +174,7 @@ struct _GeglTile
gpointer unlock_notify_data;
};
+
#ifndef __GEGL_TILE_C
#define gegl_tile_get_data(tile) ((guchar*)((tile)->data))
#endif // __GEGL_TILE_C
diff --git a/gegl/buffer/gegl-tile-backend-file.c b/gegl/buffer/gegl-tile-backend-file.c
index d835244..63d6105 100644
--- a/gegl/buffer/gegl-tile-backend-file.c
+++ b/gegl/buffer/gegl-tile-backend-file.c
@@ -789,14 +789,12 @@ gegl_tile_backend_file_load_index (GeglTileBackendFile *self,
}
else
{
+ GeglTileStorage *storage =
+ (void*)gegl_tile_backend_peek_storage (backend);
GeglRectangle rect;
g_hash_table_remove (self->index, existing);
- /* XXX: this refetch, depends on knowing the storage, the
- * storage should not be public information/API to maintain
- * proper encapsulation
- */
- gegl_tile_source_refetch (GEGL_TILE_SOURCE (backend->priv->storage),
+ gegl_tile_source_refetch (GEGL_TILE_SOURCE (storage),
existing->tile.x,
existing->tile.y,
existing->tile.z);
@@ -810,10 +808,7 @@ gegl_tile_backend_file_load_index (GeglTileBackendFile *self,
}
g_free (existing);
- /* XXX: this emitting of changed depends on knowing the storage,
- * which is icky..
- */
- g_signal_emit_by_name (backend->priv->storage, "changed", &rect, NULL);
+ g_signal_emit_by_name (storage, "changed", &rect, NULL);
}
}
g_hash_table_insert (self->index, iter->data, iter->data);
diff --git a/gegl/buffer/gegl-tile-backend.c b/gegl/buffer/gegl-tile-backend.c
index 655ac42..ddfe320 100644
--- a/gegl/buffer/gegl-tile-backend.c
+++ b/gegl/buffer/gegl-tile-backend.c
@@ -22,6 +22,7 @@
#include <babl/babl.h>
#include "gegl-buffer-types.h"
+#include "gegl-buffer-private.h"
#include "gegl-tile-source.h"
#include "gegl-tile-backend.h"
@@ -193,3 +194,8 @@ GeglRectangle gegl_tile_backend_get_extent (GeglTileBackend *tile_backend)
{
return tile_backend->priv->extent;
}
+
+GeglTileSource *gegl_tile_backend_peek_storage (GeglTileBackend *backend)
+{
+ return backend->priv->storage;
+}
diff --git a/gegl/buffer/gegl-tile-backend.h b/gegl/buffer/gegl-tile-backend.h
index 8e9fb35..ebf59e6 100644
--- a/gegl/buffer/gegl-tile-backend.h
+++ b/gegl/buffer/gegl-tile-backend.h
@@ -54,6 +54,9 @@ struct _GeglTileBackendClass
gint gegl_tile_backend_get_tile_size (GeglTileBackend *tile_backend);
Babl *gegl_tile_backend_get_format (GeglTileBackend *tile_backend);
+/* gets a pointer to the GeglTileStorage that uses the backend */
+GeglTileSource *gegl_tile_backend_peek_storage (GeglTileBackend *backend);
+
/* specify the extent of the backend, can be used to
* pre-prime the backend with the width/height information when
* constructing proxy GeglBuffers to interact with other systems
diff --git a/gegl/buffer/gegl-tile-handler-cache.c b/gegl/buffer/gegl-tile-handler-cache.c
index c576425..574ad6e 100644
--- a/gegl/buffer/gegl-tile-handler-cache.c
+++ b/gegl/buffer/gegl-tile-handler-cache.c
@@ -111,6 +111,48 @@ gegl_tile_handler_cache_init (GeglTileHandlerCache *cache)
gegl_tile_cache_init ();
}
+
+static void
+gegl_tile_handler_cache_reinit_buffer_tiles (gpointer itm,
+ gpointer userdata)
+{
+ CacheItem *item;
+ item = itm;
+ if (item->handler == userdata)
+ {
+ GeglTileHandlerCache *cache = userdata;
+ cache->free_list = g_slist_prepend (cache->free_list, item);
+ }
+}
+
+static void
+gegl_tile_handler_cache_reinit (GeglTileHandlerCache *cache)
+{
+ CacheItem *item;
+ GSList *iter;
+
+ g_static_mutex_lock (&mutex);
+ /* only throw out items belonging to this cache instance */
+ 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))
+ {
+ item = iter->data;
+ if (item->tile)
+ {
+ cache_total -= item->tile->size;
+ gegl_tile_mark_as_stored (item->tile); /* to avoid saving */
+ gegl_tile_unref (item->tile);
+ }
+ g_queue_remove (cache_queue, item);
+ g_hash_table_remove (cache_ht, item);
+ g_slice_free (CacheItem, item);
+ }
+ g_slist_free (cache->free_list);
+ cache->free_list = NULL;
+ g_static_mutex_unlock (&mutex);
+}
+
static void
gegl_tile_handler_cache_dispose_buffer_tiles (gpointer itm,
gpointer userdata)
@@ -251,6 +293,9 @@ gegl_tile_handler_cache_command (GeglTileSource *tile_store,
case GEGL_TILE_VOID:
gegl_tile_handler_cache_void (cache, x, y, z);
break;
+ case GEGL_TILE_REINIT:
+ gegl_tile_handler_cache_reinit (cache);
+ break;
default:
break;
}
diff --git a/gegl/buffer/gegl-tile-source.h b/gegl/buffer/gegl-tile-source.h
index 2dd6d86..4152e52 100644
--- a/gegl/buffer/gegl-tile-source.h
+++ b/gegl/buffer/gegl-tile-source.h
@@ -81,6 +81,7 @@ enum _GeglTileCommand
GEGL_TILE_VOID,
GEGL_TILE_FLUSH,
GEGL_TILE_REFETCH,
+ GEGL_TILE_REINIT,
GEGL_TILE_LAST_COMMAND
};
@@ -149,6 +150,15 @@ gboolean gegl_tile_source_exist (GeglTileSource *source,
gint x,
gint y,
gint z);
+
+/**
+ * gegl_tile_source_reinit:
+ * @source: a GeglTileSource *
+ *
+ * Causes all tiles in cache to be refetched.
+ */
+void gegl_tile_source_reinit (GeglTileSource *source);
+
/**
* gegl_tile_source_void:
* @source: a GeglTileSource *
@@ -206,6 +216,8 @@ gboolean gegl_tile_source_idle (GeglTileSource *source);
gegl_tile_source_command(source,GEGL_TILE_VOID,x,y,z,NULL)
#define gegl_tile_source_refetch(source,x,y,z) \
gegl_tile_source_command(source,GEGL_TILE_REFETCH,x,y,z,NULL)
+#define gegl_tile_source_reinit(source) \
+ gegl_tile_source_command(source,GEGL_TILE_REINIT,0,0,0,NULL)
#define gegl_tile_source_idle(source) \
(gboolean)GPOINTER_TO_INT(gegl_tile_source_command(source,GEGL_TILE_IDLE,0,0,0,NULL))
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]