[gimp] gimptilebackendtilemanager: add utility call to construct buffer
- From: Ãyvind KolÃs <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] gimptilebackendtilemanager: add utility call to construct buffer
- Date: Tue, 13 Mar 2012 12:50:09 +0000 (UTC)
commit 5d6662ad00e96e9888933b1c53fd28a148a99e03
Author: Ãyvind KolÃs <pippin gimp org>
Date: Tue Mar 13 12:48:10 2012 +0000
gimptilebackendtilemanager: add utility call to construct buffer
For this utility call as well as the backend constructor itself pass a boolean
to indicate if write access to the buffer is desired.
app/gegl/gimptilebackendtilemanager.c | 47 +++++++++++++++++++++++++-------
app/gegl/gimptilebackendtilemanager.h | 6 +++-
2 files changed, 40 insertions(+), 13 deletions(-)
---
diff --git a/app/gegl/gimptilebackendtilemanager.c b/app/gegl/gimptilebackendtilemanager.c
index b55a27c..d2acdbe 100644
--- a/app/gegl/gimptilebackendtilemanager.c
+++ b/app/gegl/gimptilebackendtilemanager.c
@@ -40,6 +40,7 @@
struct _GimpTileBackendTileManagerPrivate
{
TileManager *tile_manager;
+ int write;
};
@@ -140,7 +141,7 @@ gimp_tile_backend_tile_manager_command (GeglTileSource *tile_store,
int row;
gimp_tile = tile_manager_get_at (backend_tm->priv->tile_manager,
- x, y, TRUE, FALSE);
+ x, y, TRUE, backend_tm->priv->write);
if (!gimp_tile)
return NULL;
g_return_val_if_fail (gimp_tile != NULL, NULL);
@@ -154,7 +155,7 @@ gimp_tile_backend_tile_manager_command (GeglTileSource *tile_store,
/* use the GimpTile directly as GEGL tile */
tile = gegl_tile_new_bare ();
gegl_tile_set_data_full (tile, tile_data_pointer (gimp_tile, 0, 0),
- tile_size, tile_done, gimp_tile);
+ tile_size, (void*)tile_done, gimp_tile);
}
else
{
@@ -175,6 +176,8 @@ gimp_tile_backend_tile_manager_command (GeglTileSource *tile_store,
case GEGL_TILE_SET:
{
GeglTile *tile = data;
+ if (backend_tm->priv->write == FALSE)
+ return NULL;
gimp_tile_write (backend_tm, x, y, z, gegl_tile_get_data (tile));
gegl_tile_mark_as_stored (tile);
return NULL;
@@ -208,22 +211,29 @@ gimp_tile_write (GimpTileBackendTileManager *backend_tm,
if (!gimp_tile)
return;
- tile_stride = TILE_WIDTH * tile_bpp (gimp_tile);
- gimp_tile_stride = tile_ewidth (gimp_tile) * tile_bpp (gimp_tile);
-
- for (row = 0; row < tile_eheight (gimp_tile); row++)
+ if (source != tile_data_pointer (gimp_tile, 0, 0))
{
- memcpy (tile_data_pointer (gimp_tile, 0, row),
- source + row * tile_stride,
- gimp_tile_stride);
+ /* only copy when we are not 0 copy */
+ tile_stride = TILE_WIDTH * tile_bpp (gimp_tile);
+ gimp_tile_stride = tile_ewidth (gimp_tile) * tile_bpp (gimp_tile);
+
+ for (row = 0; row < tile_eheight (gimp_tile); row++)
+ {
+ memcpy (tile_data_pointer (gimp_tile, 0, row),
+ source + row * tile_stride,
+ gimp_tile_stride);
+ }
}
tile_release (gimp_tile, FALSE);
}
GeglTileBackend *
-gimp_tile_backend_tile_manager_new (TileManager *tm)
+gimp_tile_backend_tile_manager_new (TileManager *tm,
+ gboolean write)
{
GeglTileBackend *ret;
+ GimpTileBackendTileManager *backend_tm;
+
gint width = tile_manager_width (tm);
gint height = tile_manager_height (tm);
gint bpp = tile_manager_bpp (tm);
@@ -234,10 +244,25 @@ gimp_tile_backend_tile_manager_new (TileManager *tm)
"tile-height", TILE_HEIGHT,
"format", gimp_bpp_to_babl_format (bpp, FALSE),
NULL);
+ backend_tm = GIMP_TILE_BACKEND_TILE_MANAGER (ret);
+ backend_tm->priv->write = write;
- GIMP_TILE_BACKEND_TILE_MANAGER (ret)->priv->tile_manager = tile_manager_ref (tm);
+ backend_tm->priv->tile_manager = tile_manager_ref (tm);
gegl_tile_backend_set_extent (ret, &rect);
return ret;
}
+
+GeglBuffer *
+gimp_tile_manager_get_gegl_buffer (TileManager *tm,
+ gboolean write)
+{
+ GeglTileBackend *backend;
+ GeglBuffer *buffer;
+ backend = gimp_tile_backend_tile_manager_new (tm, write);
+ buffer = gegl_buffer_new_for_backend (NULL, backend);
+ g_object_unref (backend);
+ return buffer;
+}
+
diff --git a/app/gegl/gimptilebackendtilemanager.h b/app/gegl/gimptilebackendtilemanager.h
index 85fb7e4..21d207a 100644
--- a/app/gegl/gimptilebackendtilemanager.h
+++ b/app/gegl/gimptilebackendtilemanager.h
@@ -49,9 +49,11 @@ struct _GimpTileBackendTileManagerClass
GType gimp_tile_backend_tile_manager_get_type (void) G_GNUC_CONST;
-GeglTileBackend * gimp_tile_backend_tile_manager_new (TileManager *tm);
+GeglTileBackend * gimp_tile_backend_tile_manager_new (TileManager *tm,
+ gboolean write);
-void gimp_tile_backend_tile_manager_stats (void);
+GeglBuffer * gimp_tile_manager_get_gegl_buffer (TileManager *tm,
+ gboolean write);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]