diff --git a/libgimp/gimptilebackendplugin.c b/libgimp/gimptilebackendplugin.c index 5fcee1f5f6..851128b0ae 100644 --- a/libgimp/gimptilebackendplugin.c +++ b/libgimp/gimptilebackendplugin.c @@ -15,62 +15,47 @@ * along with this program. If not, see . */ +#include "config.h" + #include #include + #include + #include "gimp.h" #include "gimptilebackendplugin.h" + #define TILE_WIDTH gimp_tile_width() #define TILE_HEIGHT gimp_tile_width() + struct _GimpTileBackendPluginPrivate { GimpDrawable *drawable; 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 gboolean inited = 0; + static gint mul = 2; + static gboolean inited = FALSE; + if (G_LIKELY (inited)) return mul; - inited = 1; + + inited = TRUE; + if (g_getenv ("GIMP_GEGL_TILE_MUL")) mul = atoi (g_getenv ("GIMP_GEGL_TILE_MUL")); + if (mul < 1) mul = 1; - return mul; -} -static const Babl *get_format (gint32 drawable_ID); -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; + return mul; } 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; g_type_class_add_private (klass, sizeof (GimpTileBackendPluginPrivate)); - gimp_tile_cache_size (1024); + + gimp_tile_cache_ntiles (64); } static void @@ -139,21 +125,22 @@ gimp_tile_backend_plugin_command (GeglTileSource *tile_store, gint z, gpointer data) { - GimpTileBackendPlugin *backend_plugin; - - backend_plugin = GIMP_TILE_BACKEND_PLUGIN (tile_store); + GimpTileBackendPlugin *backend_plugin = GIMP_TILE_BACKEND_PLUGIN (tile_store); switch (command) { case GEGL_TILE_GET: return gimp_tile_read_mul (backend_plugin, x, y); + case GEGL_TILE_SET: gimp_tile_write_mul (backend_plugin, x, y, gegl_tile_get_data (data)); gegl_tile_mark_as_stored (data); break; + case GEGL_TILE_FLUSH: gimp_drawable_flush (backend_plugin->priv->drawable); break; + default: g_assert (command < GEGL_TILE_LAST_COMMAND && command >= 0); } @@ -166,35 +153,36 @@ gimp_tile_read_mul (GimpTileBackendPlugin *backend_plugin, gint x, gint y) { - GimpTileBackendPluginPrivate *priv = backend_plugin->priv; - GeglTileBackend *backend; - GeglTile *tile; - gint tile_size; - int u, v; - int mul = priv->mul; - unsigned char *tile_data; + GimpTileBackendPluginPrivate *priv = backend_plugin->priv; + GeglTileBackend *backend = GEGL_TILE_BACKEND (backend_plugin); + GeglTile *tile; + gint tile_size; + gint u, v; + gint mul = priv->mul; + guchar *tile_data; x *= mul; y *= mul; - backend = GEGL_TILE_BACKEND (backend_plugin); tile_size = gegl_tile_backend_get_tile_size (backend); tile = gegl_tile_new (tile_size); tile_data = gegl_tile_get_data (tile); for (u = 0; u < mul; u++) - for (v = 0; v < mul; v++) - { - GimpTile *gimp_tile; + { + for (v = 0; v < mul; v++) + { + GimpTile *gimp_tile; - if (x + u >= priv->drawable->ntile_cols || - y + v >= priv->drawable->ntile_rows) - continue; + if (x + u >= priv->drawable->ntile_cols || + y + v >= priv->drawable->ntile_rows) + 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 eheight = gimp_tile->eheight; @@ -207,12 +195,14 @@ gimp_tile_read_mul (GimpTileBackendPlugin *backend_plugin, { memcpy (tile_data + (row + TILE_HEIGHT * v) * 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_unref (gimp_tile, FALSE); - } + + gimp_tile_unref (gimp_tile, FALSE); + } + } return tile; } @@ -224,43 +214,44 @@ gimp_tile_write_mul (GimpTileBackendPlugin *backend_plugin, guchar *source) { GimpTileBackendPluginPrivate *priv = backend_plugin->priv; - int u, v; - int mul = priv->mul; - - if (!priv->shadow) - return; + gint u, v; + gint mul = priv->mul; x *= mul; y *= mul; 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 || - y + v >= priv->drawable->ntile_rows) - continue; + if (x + u >= priv->drawable->ntile_cols || + y + v >= priv->drawable->ntile_rows) + continue; - 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 eheight = gimp_tile->eheight; - gint bpp = gimp_tile->bpp; - gint tile_stride = mul * TILE_WIDTH * bpp; - gint gimp_tile_stride = ewidth * bpp; - gint row; + gimp_tile = gimp_drawable_get_tile (priv->drawable, + priv->shadow, + y+v, x+u); + gimp_tile_ref (gimp_tile); - for (row = 0; row < eheight; row++) - memcpy (((char*)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); + { + 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 (((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, gint shadow) { - const Babl *format; - GeglTileBackend *ret; - GimpTileBackendPlugin *backend_plugin; - GimpTileBackendPluginPrivate *priv; + GeglTileBackend *backend; + GimpTileBackendPlugin *backend_plugin; + const Babl *format; + 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; - gint height = drawable->height; - gint mul = gimp_gegl_tile_mul (); - GeglRectangle rect = { 0, 0, width, height}; + format = gimp_drawable_get_format (drawable->drawable_id); - 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, - "tile-width", TILE_WIDTH * mul, - "tile-height", TILE_HEIGHT * mul, - "format", format, - NULL); + backend_plugin = GIMP_TILE_BACKEND_PLUGIN (backend); - backend_plugin = GIMP_TILE_BACKEND_PLUGIN (ret); - priv = backend_plugin->priv; - priv->drawable = drawable; - priv->mul = mul; - priv->shadow = shadow; + backend_plugin->priv->drawable = drawable; + backend_plugin->priv->mul = mul; + backend_plugin->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; }