libgimp: sytle cleanup in GimpTileBackendPlugin

and use gimp_drawable_get_format() instead our own utility function.
This commit is contained in:
Michael Natterer
2012-04-02 20:44:24 +02:00
parent 79464eefce
commit 3e0891b80c

View File

@ -15,62 +15,47 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "config.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <gegl.h> #include <gegl.h>
#include "gimp.h" #include "gimp.h"
#include "gimptilebackendplugin.h" #include "gimptilebackendplugin.h"
#define TILE_WIDTH gimp_tile_width() #define TILE_WIDTH gimp_tile_width()
#define TILE_HEIGHT gimp_tile_width() #define TILE_HEIGHT gimp_tile_width()
struct _GimpTileBackendPluginPrivate struct _GimpTileBackendPluginPrivate
{ {
GimpDrawable *drawable; GimpDrawable *drawable;
gboolean shadow; gboolean shadow;
int mul; gint mul;
}; };
static int gimp_gegl_tile_mul (void)
static gint
gimp_gegl_tile_mul (void)
{ {
static int mul = 2; static gint mul = 2;
static gboolean inited = 0; static gboolean inited = FALSE;
if (G_LIKELY (inited)) if (G_LIKELY (inited))
return mul; return mul;
inited = 1;
inited = TRUE;
if (g_getenv ("GIMP_GEGL_TILE_MUL")) if (g_getenv ("GIMP_GEGL_TILE_MUL"))
mul = atoi (g_getenv ("GIMP_GEGL_TILE_MUL")); mul = atoi (g_getenv ("GIMP_GEGL_TILE_MUL"));
if (mul < 1) if (mul < 1)
mul = 1; mul = 1;
return mul;
}
static const Babl *get_format (gint32 drawable_ID); return mul;
static const Babl *get_format (gint32 drawable_ID)
{
switch (gimp_drawable_type (drawable_ID))
{
case GIMP_RGB_IMAGE: return babl_format ("R'G'B' u8");
case GIMP_RGBA_IMAGE: return babl_format ("R'G'B'A u8");
case GIMP_GRAY_IMAGE: return babl_format ("Y' u8");
case GIMP_GRAYA_IMAGE: return babl_format ("Y'A u8");
case GIMP_INDEXED_IMAGE:
case GIMP_INDEXEDA_IMAGE:
{
gint32 image_ID = gimp_item_get_image (drawable_ID);
const Babl *pala, *pal;
gint ncols;
guchar *cmap = gimp_image_get_colormap (image_ID, &ncols);
babl_new_palette (NULL, &pal, &pala);
babl_palette_set_palette (pal, babl_format ("R'G'B' u8"),
cmap, ncols);
g_free (cmap);
if (gimp_drawable_type (drawable_ID) == GIMP_INDEXEDA_IMAGE)
return pala;
return pal;
}
}
return NULL;
} }
static void gimp_tile_backend_plugin_finalize (GObject *object); static void gimp_tile_backend_plugin_finalize (GObject *object);
@ -105,7 +90,8 @@ _gimp_tile_backend_plugin_class_init (GimpTileBackendPluginClass *klass)
object_class->finalize = gimp_tile_backend_plugin_finalize; object_class->finalize = gimp_tile_backend_plugin_finalize;
g_type_class_add_private (klass, sizeof (GimpTileBackendPluginPrivate)); g_type_class_add_private (klass, sizeof (GimpTileBackendPluginPrivate));
gimp_tile_cache_size (1024);
gimp_tile_cache_ntiles (64);
} }
static void static void
@ -139,21 +125,22 @@ gimp_tile_backend_plugin_command (GeglTileSource *tile_store,
gint z, gint z,
gpointer data) gpointer data)
{ {
GimpTileBackendPlugin *backend_plugin; GimpTileBackendPlugin *backend_plugin = GIMP_TILE_BACKEND_PLUGIN (tile_store);
backend_plugin = GIMP_TILE_BACKEND_PLUGIN (tile_store);
switch (command) switch (command)
{ {
case GEGL_TILE_GET: case GEGL_TILE_GET:
return gimp_tile_read_mul (backend_plugin, x, y); return gimp_tile_read_mul (backend_plugin, x, y);
case GEGL_TILE_SET: case GEGL_TILE_SET:
gimp_tile_write_mul (backend_plugin, x, y, gegl_tile_get_data (data)); gimp_tile_write_mul (backend_plugin, x, y, gegl_tile_get_data (data));
gegl_tile_mark_as_stored (data); gegl_tile_mark_as_stored (data);
break; break;
case GEGL_TILE_FLUSH: case GEGL_TILE_FLUSH:
gimp_drawable_flush (backend_plugin->priv->drawable); gimp_drawable_flush (backend_plugin->priv->drawable);
break; break;
default: default:
g_assert (command < GEGL_TILE_LAST_COMMAND && command >= 0); g_assert (command < GEGL_TILE_LAST_COMMAND && command >= 0);
} }
@ -166,35 +153,36 @@ gimp_tile_read_mul (GimpTileBackendPlugin *backend_plugin,
gint x, gint x,
gint y) gint y)
{ {
GimpTileBackendPluginPrivate *priv = backend_plugin->priv; GimpTileBackendPluginPrivate *priv = backend_plugin->priv;
GeglTileBackend *backend; GeglTileBackend *backend = GEGL_TILE_BACKEND (backend_plugin);
GeglTile *tile; GeglTile *tile;
gint tile_size; gint tile_size;
int u, v; gint u, v;
int mul = priv->mul; gint mul = priv->mul;
unsigned char *tile_data; guchar *tile_data;
x *= mul; x *= mul;
y *= mul; y *= mul;
backend = GEGL_TILE_BACKEND (backend_plugin);
tile_size = gegl_tile_backend_get_tile_size (backend); tile_size = gegl_tile_backend_get_tile_size (backend);
tile = gegl_tile_new (tile_size); tile = gegl_tile_new (tile_size);
tile_data = gegl_tile_get_data (tile); tile_data = gegl_tile_get_data (tile);
for (u = 0; u < mul; u++) for (u = 0; u < mul; u++)
for (v = 0; v < mul; v++) {
{ for (v = 0; v < mul; v++)
GimpTile *gimp_tile; {
GimpTile *gimp_tile;
if (x + u >= priv->drawable->ntile_cols || if (x + u >= priv->drawable->ntile_cols ||
y + v >= priv->drawable->ntile_rows) y + v >= priv->drawable->ntile_rows)
continue; continue;
gimp_tile = gimp_drawable_get_tile (priv->drawable,
priv->shadow,
y + v, x + u);
gimp_tile_ref (gimp_tile);
gimp_tile = gimp_drawable_get_tile (priv->drawable,
priv->shadow,
y+v, x+u);
gimp_tile_ref (gimp_tile);
{ {
gint ewidth = gimp_tile->ewidth; gint ewidth = gimp_tile->ewidth;
gint eheight = gimp_tile->eheight; gint eheight = gimp_tile->eheight;
@ -207,12 +195,14 @@ gimp_tile_read_mul (GimpTileBackendPlugin *backend_plugin,
{ {
memcpy (tile_data + (row + TILE_HEIGHT * v) * memcpy (tile_data + (row + TILE_HEIGHT * v) *
tile_stride + u * TILE_WIDTH * bpp, tile_stride + u * TILE_WIDTH * bpp,
((char*)gimp_tile->data) + row * gimp_tile_stride, ((gchar *) gimp_tile->data) + row * gimp_tile_stride,
gimp_tile_stride); gimp_tile_stride);
} }
} }
gimp_tile_unref (gimp_tile, FALSE);
} gimp_tile_unref (gimp_tile, FALSE);
}
}
return tile; return tile;
} }
@ -224,43 +214,44 @@ gimp_tile_write_mul (GimpTileBackendPlugin *backend_plugin,
guchar *source) guchar *source)
{ {
GimpTileBackendPluginPrivate *priv = backend_plugin->priv; GimpTileBackendPluginPrivate *priv = backend_plugin->priv;
int u, v; gint u, v;
int mul = priv->mul; gint mul = priv->mul;
if (!priv->shadow)
return;
x *= mul; x *= mul;
y *= mul; y *= mul;
for (v = 0; v < mul; v++) for (v = 0; v < mul; v++)
for (u = 0; u < mul; u++)
{ {
GimpTile *gimp_tile; for (u = 0; u < mul; u++)
{
GimpTile *gimp_tile;
if (x + u >= priv->drawable->ntile_cols || if (x + u >= priv->drawable->ntile_cols ||
y + v >= priv->drawable->ntile_rows) y + v >= priv->drawable->ntile_rows)
continue; continue;
gimp_tile = gimp_drawable_get_tile (priv->drawable, gimp_tile = gimp_drawable_get_tile (priv->drawable,
priv->shadow, priv->shadow,
y+v, x+u); y+v, x+u);
gimp_tile_ref (gimp_tile); gimp_tile_ref (gimp_tile);
{
gint ewidth = gimp_tile->ewidth;
gint eheight = gimp_tile->eheight;
gint bpp = gimp_tile->bpp;
gint tile_stride = mul * TILE_WIDTH * bpp;
gint gimp_tile_stride = ewidth * bpp;
gint row;
for (row = 0; row < eheight; row++) {
memcpy (((char*)gimp_tile->data) + row * gimp_tile_stride, gint ewidth = gimp_tile->ewidth;
source + (row + v * TILE_HEIGHT) * gint eheight = gimp_tile->eheight;
tile_stride + u * TILE_WIDTH * bpp, gint bpp = gimp_tile->bpp;
gimp_tile_stride); gint tile_stride = mul * TILE_WIDTH * bpp;
} gint gimp_tile_stride = ewidth * bpp;
gimp_tile_unref (gimp_tile, TRUE); gint row;
for (row = 0; row < eheight; row++)
memcpy (((gchar *)gimp_tile->data) + row * gimp_tile_stride,
source + (row + v * TILE_HEIGHT) *
tile_stride + u * TILE_WIDTH * bpp,
gimp_tile_stride);
}
gimp_tile_unref (gimp_tile, TRUE);
}
} }
} }
@ -268,31 +259,29 @@ GeglTileBackend *
_gimp_tile_backend_plugin_new (GimpDrawable *drawable, _gimp_tile_backend_plugin_new (GimpDrawable *drawable,
gint shadow) gint shadow)
{ {
const Babl *format; GeglTileBackend *backend;
GeglTileBackend *ret; GimpTileBackendPlugin *backend_plugin;
GimpTileBackendPlugin *backend_plugin; const Babl *format;
GimpTileBackendPluginPrivate *priv; gint width = gimp_drawable_width (drawable->drawable_id);
gint height = gimp_drawable_height (drawable->drawable_id);
gint mul = gimp_gegl_tile_mul ();
gint width = drawable->width; format = gimp_drawable_get_format (drawable->drawable_id);
gint height = drawable->height;
gint mul = gimp_gegl_tile_mul ();
GeglRectangle rect = { 0, 0, width, height};
format = get_format (drawable->drawable_id); backend = g_object_new (GIMP_TYPE_TILE_BACKEND_PLUGIN,
"tile-width", TILE_WIDTH * mul,
"tile-height", TILE_HEIGHT * mul,
"format", format,
NULL);
ret = g_object_new (GIMP_TYPE_TILE_BACKEND_PLUGIN, backend_plugin = GIMP_TILE_BACKEND_PLUGIN (backend);
"tile-width", TILE_WIDTH * mul,
"tile-height", TILE_HEIGHT * mul,
"format", format,
NULL);
backend_plugin = GIMP_TILE_BACKEND_PLUGIN (ret); backend_plugin->priv->drawable = drawable;
priv = backend_plugin->priv; backend_plugin->priv->mul = mul;
priv->drawable = drawable; backend_plugin->priv->shadow = shadow;
priv->mul = mul;
priv->shadow = shadow;
gegl_tile_backend_set_extent (ret, &rect); gegl_tile_backend_set_extent (backend,
GEGL_RECTANGLE (0, 0, width, height));
return ret; return backend;
} }