mirror of https://github.com/GNOME/gimp.git
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:
parent
3a48101b9d
commit
acd3ce41b0
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue