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:
This commit is contained in:
Michael Natterer 2012-03-27 19:57:58 +02:00
parent 3a48101b9d
commit acd3ce41b0
4 changed files with 85 additions and 39 deletions

View File

@ -29,9 +29,6 @@
#include "plug-in-types.h" #include "plug-in-types.h"
#include "base/tile.h"
#include "base/tile-manager.h"
#include "gegl/gimp-gegl-utils.h" #include "gegl/gimp-gegl-utils.h"
#include "core/gimp.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); 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 static void
gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in, gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in,
GPTileReq *request) GPTileReq *request)
@ -193,8 +230,7 @@ gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in,
GimpWireMessage msg; GimpWireMessage msg;
GimpDrawable *drawable; GimpDrawable *drawable;
GeglBuffer *buffer; GeglBuffer *buffer;
TileManager *tm; GeglRectangle tile_rect;
Tile *tile;
tile_data.drawable_ID = -1; tile_data.drawable_ID = -1;
tile_data.tile_num = 0; tile_data.tile_num = 0;
@ -298,11 +334,8 @@ gimp_plug_in_handle_tile_put (GimpPlugIn *plug_in,
buffer = gimp_drawable_get_buffer (drawable); buffer = gimp_drawable_get_buffer (drawable);
} }
tm = gimp_gegl_buffer_get_tiles (buffer); if (! gimp_plug_in_get_tile_rect (buffer, tile_info->tile_num,
&tile_rect))
tile = tile_manager_get (tm, tile_info->tile_num, TRUE, TRUE);
if (! tile)
{ {
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR, gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Plug-In \"%s\"\n(%s)\n\n" "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) if (tile_data.use_shm)
memcpy (tile_data_pointer (tile, 0, 0), {
gimp_plug_in_shm_get_addr (plug_in->manager->shm), gegl_buffer_set (buffer, &tile_rect, 0, NULL,
tile_size (tile)); gimp_plug_in_shm_get_addr (plug_in->manager->shm),
GEGL_AUTO_ROWSTRIDE);
}
else else
memcpy (tile_data_pointer (tile, 0, 0), {
tile_info->data, gegl_buffer_set (buffer, &tile_rect, 0, NULL,
tile_size (tile)); tile_info->data,
GEGL_AUTO_ROWSTRIDE);
}
tile_release (tile, TRUE);
gimp_wire_destroy (&msg); gimp_wire_destroy (&msg);
if (! gp_tile_ack_write (plug_in->my_write, plug_in)) 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; GimpWireMessage msg;
GimpDrawable *drawable; GimpDrawable *drawable;
GeglBuffer *buffer; GeglBuffer *buffer;
TileManager *tm; const Babl *format;
Tile *tile; GeglRectangle tile_rect;
gint tile_size;
drawable = (GimpDrawable *) gimp_item_get_by_ID (plug_in->manager->gimp, drawable = (GimpDrawable *) gimp_item_get_by_ID (plug_in->manager->gimp,
request->drawable_ID); request->drawable_ID);
@ -383,11 +420,8 @@ gimp_plug_in_handle_tile_get (GimpPlugIn *plug_in,
buffer = gimp_drawable_get_buffer (drawable); buffer = gimp_drawable_get_buffer (drawable);
} }
tm = gimp_gegl_buffer_get_tiles (buffer); if (! gimp_plug_in_get_tile_rect (buffer, request->tile_num,
&tile_rect))
tile = tile_manager_get (tm, request->tile_num, TRUE, FALSE);
if (! tile)
{ {
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR, gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,
"Plug-In \"%s\"\n(%s)\n\n" "Plug-In \"%s\"\n(%s)\n\n"
@ -398,20 +432,33 @@ gimp_plug_in_handle_tile_get (GimpPlugIn *plug_in,
return; 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.drawable_ID = request->drawable_ID;
tile_data.tile_num = request->tile_num; tile_data.tile_num = request->tile_num;
tile_data.shadow = request->shadow; tile_data.shadow = request->shadow;
tile_data.bpp = tile_bpp (tile); tile_data.bpp = babl_format_get_bytes_per_pixel (format);
tile_data.width = tile_ewidth (tile); tile_data.width = tile_rect.width;
tile_data.height = tile_eheight (tile); tile_data.height = tile_rect.height;
tile_data.use_shm = (plug_in->manager->shm != NULL); tile_data.use_shm = (plug_in->manager->shm != NULL);
if (tile_data.use_shm) if (tile_data.use_shm)
memcpy (gimp_plug_in_shm_get_addr (plug_in->manager->shm), {
tile_data_pointer (tile, 0, 0), gegl_buffer_get (buffer, &tile_rect, 1.0, NULL,
tile_size (tile)); gimp_plug_in_shm_get_addr (plug_in->manager->shm),
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
}
else 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)) 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; return;
} }
tile_release (tile, FALSE);
if (! gimp_wire_read_msg (plug_in->my_read, &msg, plug_in)) if (! gimp_wire_read_msg (plug_in->my_read, &msg, plug_in))
{ {
gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR, gimp_message (plug_in->manager->gimp, NULL, GIMP_MESSAGE_ERROR,

View File

@ -29,8 +29,6 @@
#include "config/gimpguiconfig.h" #include "config/gimpguiconfig.h"
#include "base/tile.h"
#include "composite/gimp-composite.h" #include "composite/gimp-composite.h"
#include "core/gimp.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; display_ID = display ? gimp_get_display_ID (manager->gimp, display) : -1;
config.version = GIMP_PROTOCOL_VERSION; config.version = GIMP_PROTOCOL_VERSION;
config.tile_width = TILE_WIDTH; config.tile_width = GIMP_PLUG_IN_TILE_WIDTH;
config.tile_height = TILE_HEIGHT; config.tile_height = GIMP_PLUG_IN_TILE_HEIGHT;
config.shm_ID = (manager->shm ? config.shm_ID = (manager->shm ?
gimp_plug_in_shm_get_ID (manager->shm) : -1); gimp_plug_in_shm_get_ID (manager->shm) : -1);
config.check_size = display_config->transparency_size; config.check_size = display_config->transparency_size;

View File

@ -64,14 +64,13 @@
#include "plug-in-types.h" #include "plug-in-types.h"
#include "base/base-utils.h" #include "base/base-utils.h"
#include "base/tile.h"
#include "gimppluginshm.h" #include "gimppluginshm.h"
#include "gimp-log.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" #define ERRMSG_SHM_DISABLE "Disabling shared memory tile transport"

View File

@ -24,6 +24,10 @@
#include "plug-in/plug-in-enums.h" #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 _GimpPlugIn GimpPlugIn;
typedef struct _GimpPlugInDebug GimpPlugInDebug; typedef struct _GimpPlugInDebug GimpPlugInDebug;
typedef struct _GimpPlugInDef GimpPlugInDef; typedef struct _GimpPlugInDef GimpPlugInDef;