[gimp/goat-invasion: 281/418] app: port the entire plug-in tile communication to using GeglBuffers
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/goat-invasion: 281/418] app: port the entire plug-in tile communication to using GeglBuffers
- Date: Wed, 4 Apr 2012 10:49:24 +0000 (UTC)
commit 6709043e8c433849d23ea2d700fa6ec6d4009710
Author: Michael Natterer <mitch gimp org>
Date: Tue Mar 27 19:57:58 2012 +0200
app: port the entire plug-in tile communication to using GeglBuffers
which means we are now completely independent of TileManager tile
sizes. The "tile" size used to talk to plug-ins is now defined as:
app/plug-in/gimpplugin-message.c | 111 ++++++++++++++++++++++++----------
app/plug-in/gimppluginmanager-call.c | 6 +-
app/plug-in/gimppluginshm.c | 3 +-
app/plug-in/plug-in-types.h | 4 +
4 files changed, 85 insertions(+), 39 deletions(-)
---
diff --git a/app/plug-in/gimpplugin-message.c b/app/plug-in/gimpplugin-message.c
index 23c5b21..b880046 100644
--- a/app/plug-in/gimpplugin-message.c
+++ b/app/plug-in/gimpplugin-message.c
@@ -29,9 +29,6 @@
#include "plug-in-types.h"
-#include "base/tile.h"
-#include "base/tile-manager.h"
-
#include "gegl/gimp-gegl-utils.h"
#include "core/gimp.h"
@@ -184,6 +181,46 @@ gimp_plug_in_handle_tile_request (GimpPlugIn *plug_in,
gimp_plug_in_handle_tile_get (plug_in, request);
}
+static gboolean
+gimp_plug_in_get_tile_rect (GeglBuffer *buffer,
+ gint tile_num,
+ GeglRectangle *rect)
+{
+ gint n_tile_rows;
+ gint n_tile_columns;
+ gint tile_row;
+ gint tile_column;
+
+ n_tile_rows =
+ (gegl_buffer_get_height (buffer) + GIMP_PLUG_IN_TILE_HEIGHT - 1) /
+ GIMP_PLUG_IN_TILE_HEIGHT;
+
+ n_tile_columns =
+ (gegl_buffer_get_width (buffer) + GIMP_PLUG_IN_TILE_WIDTH - 1) /
+ GIMP_PLUG_IN_TILE_WIDTH;
+
+ if (tile_num > n_tile_rows * n_tile_columns - 1)
+ return FALSE;
+
+ tile_row = tile_num / n_tile_columns;
+ tile_column = tile_num % n_tile_columns;
+
+ rect->x = tile_column * GIMP_PLUG_IN_TILE_WIDTH;
+ rect->y = tile_row * GIMP_PLUG_IN_TILE_HEIGHT;
+
+ if (tile_column == n_tile_columns - 1)
+ rect->width = gegl_buffer_get_width (buffer) - rect->x;
+ else
+ rect->width = GIMP_PLUG_IN_TILE_WIDTH;
+
+ if (tile_row == n_tile_rows - 1)
+ rect->height = gegl_buffer_get_height (buffer) - rect->y;
+ else
+ rect->height = GIMP_PLUG_IN_TILE_HEIGHT;
+
+ return TRUE;
+}
+
static void
gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in,
GPTileReq *request)
@@ -193,8 +230,7 @@ gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in,
GimpWireMessage msg;
GimpDrawable *drawable;
GeglBuffer *buffer;
- TileManager *tm;
- Tile *tile;
+ GeglRectangle tile_rect;
tile_data.drawable_ID = -1;
tile_data.tile_num = 0;
@@ -298,11 +334,8 @@ gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in,
buffer = gimp_drawable_get_buffer (drawable);
}
- tm = gimp_gegl_buffer_get_tiles (buffer);
-
- tile = tile_manager_get (tm, tile_info->tile_num, TRUE, TRUE);
-
- if (! tile)
+ if (! gimp_plug_in_get_tile_rect (buffer, tile_info->tile_num,
+ &tile_rect))
{
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Plug-In \"%s\"\n(%s)\n\n"
@@ -314,15 +347,18 @@ gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in,
}
if (tile_data.use_shm)
- memcpy (tile_data_pointer (tile, 0, 0),
- gimp_plug_in_shm_get_addr (plug_in->manager->shm),
- tile_size (tile));
+ {
+ gegl_buffer_set (buffer, &tile_rect, 0, NULL,
+ gimp_plug_in_shm_get_addr (plug_in->manager->shm),
+ GEGL_AUTO_ROWSTRIDE);
+ }
else
- memcpy (tile_data_pointer (tile, 0, 0),
- tile_info->data,
- tile_size (tile));
+ {
+ gegl_buffer_set (buffer, &tile_rect, 0, NULL,
+ tile_info->data,
+ GEGL_AUTO_ROWSTRIDE);
+ }
- tile_release (tile, TRUE);
gimp_wire_destroy (&msg);
if (! gp_tile_ack_write (plug_in->my_write, plug_in))
@@ -342,8 +378,9 @@ gimp_plug_in_handle_tile_get (GimpPlugIn *plug_in,
GimpWireMessage msg;
GimpDrawable *drawable;
GeglBuffer *buffer;
- TileManager *tm;
- Tile *tile;
+ const Babl *format;
+ GeglRectangle tile_rect;
+ gint tile_size;
drawable = (GimpDrawable *) gimp_item_get_by_ID (plug_in->manager->gimp,
request->drawable_ID);
@@ -383,11 +420,8 @@ gimp_plug_in_handle_tile_get (GimpPlugIn *plug_in,
buffer = gimp_drawable_get_buffer (drawable);
}
- tm = gimp_gegl_buffer_get_tiles (buffer);
-
- tile = tile_manager_get (tm, request->tile_num, TRUE, FALSE);
-
- if (! tile)
+ if (! gimp_plug_in_get_tile_rect (buffer, request->tile_num,
+ &tile_rect))
{
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Plug-In \"%s\"\n(%s)\n\n"
@@ -398,20 +432,33 @@ gimp_plug_in_handle_tile_get (GimpPlugIn *plug_in,
return;
}
+ format = gegl_buffer_get_format (buffer);
+
+ tile_size = (babl_format_get_bytes_per_pixel (format) *
+ tile_rect.width * tile_rect.height);
+
tile_data.drawable_ID = request->drawable_ID;
tile_data.tile_num = request->tile_num;
tile_data.shadow = request->shadow;
- tile_data.bpp = tile_bpp (tile);
- tile_data.width = tile_ewidth (tile);
- tile_data.height = tile_eheight (tile);
+ tile_data.bpp = babl_format_get_bytes_per_pixel (format);
+ tile_data.width = tile_rect.width;
+ tile_data.height = tile_rect.height;
tile_data.use_shm = (plug_in->manager->shm != NULL);
if (tile_data.use_shm)
- memcpy (gimp_plug_in_shm_get_addr (plug_in->manager->shm),
- tile_data_pointer (tile, 0, 0),
- tile_size (tile));
+ {
+ gegl_buffer_get (buffer, &tile_rect, 1.0, NULL,
+ gimp_plug_in_shm_get_addr (plug_in->manager->shm),
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+ }
else
- tile_data.data = tile_data_pointer (tile, 0, 0);
+ {
+ tile_data.data = g_malloc (tile_size);
+
+ gegl_buffer_get (buffer, &tile_rect, 1.0, NULL,
+ tile_data.data,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+ }
if (! gp_tile_data_write (plug_in->my_write, &tile_data, plug_in))
{
@@ -421,8 +468,6 @@ gimp_plug_in_handle_tile_get (GimpPlugIn *plug_in,
return;
}
- tile_release (tile, FALSE);
-
if (! gimp_wire_read_msg (plug_in->my_read, &msg, plug_in))
{
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
diff --git a/app/plug-in/gimppluginmanager-call.c b/app/plug-in/gimppluginmanager-call.c
index 99882cc..47d0a95 100644
--- a/app/plug-in/gimppluginmanager-call.c
+++ b/app/plug-in/gimppluginmanager-call.c
@@ -29,8 +29,6 @@
#include "config/gimpguiconfig.h"
-#include "base/tile.h"
-
#include "composite/gimp-composite.h"
#include "core/gimp.h"
@@ -185,8 +183,8 @@ gimp_plug_in_manager_call_run (GimpPlugInManager *manager,
display_ID = display ? gimp_get_display_ID (manager->gimp, display) : -1;
config.version = GIMP_PROTOCOL_VERSION;
- config.tile_width = TILE_WIDTH;
- config.tile_height = TILE_HEIGHT;
+ config.tile_width = GIMP_PLUG_IN_TILE_WIDTH;
+ config.tile_height = GIMP_PLUG_IN_TILE_HEIGHT;
config.shm_ID = (manager->shm ?
gimp_plug_in_shm_get_ID (manager->shm) : -1);
config.check_size = display_config->transparency_size;
diff --git a/app/plug-in/gimppluginshm.c b/app/plug-in/gimppluginshm.c
index 323dbc6..2829561 100644
--- a/app/plug-in/gimppluginshm.c
+++ b/app/plug-in/gimppluginshm.c
@@ -64,14 +64,13 @@
#include "plug-in-types.h"
#include "base/base-utils.h"
-#include "base/tile.h"
#include "gimppluginshm.h"
#include "gimp-log.h"
-#define TILE_MAP_SIZE (TILE_WIDTH * TILE_HEIGHT * 4)
+#define TILE_MAP_SIZE (GIMP_PLUG_IN_TILE_WIDTH * GIMP_PLUG_IN_TILE_HEIGHT * 4)
#define ERRMSG_SHM_DISABLE "Disabling shared memory tile transport"
diff --git a/app/plug-in/plug-in-types.h b/app/plug-in/plug-in-types.h
index 8793448..2515238 100644
--- a/app/plug-in/plug-in-types.h
+++ b/app/plug-in/plug-in-types.h
@@ -24,6 +24,10 @@
#include "plug-in/plug-in-enums.h"
+#define GIMP_PLUG_IN_TILE_WIDTH 64
+#define GIMP_PLUG_IN_TILE_HEIGHT 64
+
+
typedef struct _GimpPlugIn GimpPlugIn;
typedef struct _GimpPlugInDebug GimpPlugInDebug;
typedef struct _GimpPlugInDef GimpPlugInDef;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]