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 "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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue