From 299886d20db9de2704a3c361eaebb4215d7405e1 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Fri, 16 Mar 2012 18:47:04 +0100 Subject: [PATCH] app: convert drawables between RGB and GRAY using gegl_buffer_copy() --- app/core/gimpdrawable-convert.c | 248 ++++++++++++++------------------ 1 file changed, 111 insertions(+), 137 deletions(-) diff --git a/app/core/gimpdrawable-convert.c b/app/core/gimpdrawable-convert.c index bebc9855e1..e6f6d69ca5 100644 --- a/app/core/gimpdrawable-convert.c +++ b/app/core/gimpdrawable-convert.c @@ -28,6 +28,8 @@ #include "base/pixel-region.h" #include "base/tile-manager.h" +#include "gegl/gimp-gegl-utils.h" + #include "gimpdrawable.h" #include "gimpdrawable-convert.h" #include "gimpimage.h" @@ -89,15 +91,8 @@ void gimp_drawable_convert_tiles_rgb (GimpDrawable *drawable, TileManager *new_tiles) { - PixelRegion srcPR, destPR; - gint row, col; - gint offset; GimpImageType type; gboolean has_alpha; - const guchar *src, *s; - guchar *dest, *d; - const guchar *cmap; - gpointer pr; g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); g_return_if_fail (new_tiles != NULL); @@ -107,81 +102,73 @@ gimp_drawable_convert_tiles_rgb (GimpDrawable *drawable, g_return_if_fail (tile_manager_bpp (new_tiles) == (has_alpha ? 4 : 3)); - cmap = gimp_drawable_get_colormap (drawable); - - pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable), - 0, 0, - gimp_item_get_width (GIMP_ITEM (drawable)), - gimp_item_get_height (GIMP_ITEM (drawable)), - FALSE); - pixel_region_init (&destPR, new_tiles, - 0, 0, - gimp_item_get_width (GIMP_ITEM (drawable)), - gimp_item_get_height (GIMP_ITEM (drawable)), - TRUE); - switch (GIMP_IMAGE_TYPE_BASE_TYPE (type)) { case GIMP_GRAY: - for (pr = pixel_regions_register (2, &srcPR, &destPR); - pr != NULL; - pr = pixel_regions_process (pr)) - { - src = srcPR.data; - dest = destPR.data; + { + GeglBuffer *dest_buffer; - for (row = 0; row < srcPR.h; row++) - { - s = src; - d = dest; + dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE); - for (col = 0; col < srcPR.w; col++) - { - d[RED] = *s; - d[GREEN] = *s; - d[BLUE] = *s; + gegl_buffer_copy (gimp_drawable_get_read_buffer (drawable), NULL, + dest_buffer, NULL); - d += 3; - s++; - if (has_alpha) - *d++ = *s++; - } - - src += srcPR.rowstride; - dest += destPR.rowstride; - } - } + g_object_unref (dest_buffer); + } break; case GIMP_INDEXED: - for (pr = pixel_regions_register (2, &srcPR, &destPR); - pr != NULL; - pr = pixel_regions_process (pr)) - { - src = srcPR.data; - dest = destPR.data; + { + PixelRegion srcPR, destPR; + gint row, col; + gint offset; + const guchar *src, *s; + guchar *dest, *d; + const guchar *cmap; + gpointer pr; - for (row = 0; row < srcPR.h; row++) - { - s = src; - d = dest; + cmap = gimp_drawable_get_colormap (drawable); - for (col = 0; col < srcPR.w; col++) - { - offset = *s++ * 3; - d[RED] = cmap[offset + 0]; - d[GREEN] = cmap[offset + 1]; - d[BLUE] = cmap[offset + 2]; + pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable), + 0, 0, + gimp_item_get_width (GIMP_ITEM (drawable)), + gimp_item_get_height (GIMP_ITEM (drawable)), + FALSE); + pixel_region_init (&destPR, new_tiles, + 0, 0, + gimp_item_get_width (GIMP_ITEM (drawable)), + gimp_item_get_height (GIMP_ITEM (drawable)), + TRUE); - d += 3; - if (has_alpha) - *d++ = *s++; - } + for (pr = pixel_regions_register (2, &srcPR, &destPR); + pr != NULL; + pr = pixel_regions_process (pr)) + { + src = srcPR.data; + dest = destPR.data; - src += srcPR.rowstride; - dest += destPR.rowstride; - } - } + for (row = 0; row < srcPR.h; row++) + { + s = src; + d = dest; + + for (col = 0; col < srcPR.w; col++) + { + offset = *s++ * 3; + d[RED] = cmap[offset + 0]; + d[GREEN] = cmap[offset + 1]; + d[BLUE] = cmap[offset + 2]; + + d += 3; + if (has_alpha) + *d++ = *s++; + } + + src += srcPR.rowstride; + dest += destPR.rowstride; + } + } + } break; default: @@ -193,15 +180,8 @@ void gimp_drawable_convert_tiles_grayscale (GimpDrawable *drawable, TileManager *new_tiles) { - PixelRegion srcPR, destPR; - gint row, col; - gint offset, val; GimpImageType type; gboolean has_alpha; - const guchar *src, *s; - guchar *dest, *d; - const guchar *cmap; - gpointer pr; g_return_if_fail (GIMP_IS_DRAWABLE (drawable)); g_return_if_fail (new_tiles != NULL); @@ -211,78 +191,72 @@ gimp_drawable_convert_tiles_grayscale (GimpDrawable *drawable, g_return_if_fail (tile_manager_bpp (new_tiles) == (has_alpha ? 2 : 1)); - cmap = gimp_drawable_get_colormap (drawable); - - pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable), - 0, 0, - gimp_item_get_width (GIMP_ITEM (drawable)), - gimp_item_get_height (GIMP_ITEM (drawable)), - FALSE); - pixel_region_init (&destPR, new_tiles, - 0, 0, - gimp_item_get_width (GIMP_ITEM (drawable)), - gimp_item_get_height (GIMP_ITEM (drawable)), - TRUE); - switch (GIMP_IMAGE_TYPE_BASE_TYPE (type)) { case GIMP_RGB: - for (pr = pixel_regions_register (2, &srcPR, &destPR); - pr != NULL; - pr = pixel_regions_process (pr)) - { - src = srcPR.data; - dest = destPR.data; + { + GeglBuffer *dest_buffer; - for (row = 0; row < srcPR.h; row++) - { - s = src; - d = dest; - for (col = 0; col < srcPR.w; col++) - { - val = GIMP_RGB_LUMINANCE (s[RED], - s[GREEN], - s[BLUE]) + 0.5; - *d++ = (guchar) val; - s += 3; - if (has_alpha) - *d++ = *s++; - } + dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE); - src += srcPR.rowstride; - dest += destPR.rowstride; - } - } + gegl_buffer_copy (gimp_drawable_get_read_buffer (drawable), NULL, + dest_buffer, NULL); + + g_object_unref (dest_buffer); + } break; case GIMP_INDEXED: - for (pr = pixel_regions_register (2, &srcPR, &destPR); - pr != NULL; - pr = pixel_regions_process (pr)) - { - src = srcPR.data; - dest = destPR.data; + { + PixelRegion srcPR, destPR; + gint row, col; + gint offset, val; + const guchar *src, *s; + guchar *dest, *d; + const guchar *cmap; + gpointer pr; - for (row = 0; row < srcPR.h; row++) - { - s = src; - d = dest; + cmap = gimp_drawable_get_colormap (drawable); - for (col = 0; col < srcPR.w; col++) - { - offset = *s++ * 3; - val = GIMP_RGB_LUMINANCE (cmap[offset+0], - cmap[offset+1], - cmap[offset+2]) + 0.5; - *d++ = (guchar) val; - if (has_alpha) - *d++ = *s++; - } + pixel_region_init (&srcPR, gimp_drawable_get_tiles (drawable), + 0, 0, + gimp_item_get_width (GIMP_ITEM (drawable)), + gimp_item_get_height (GIMP_ITEM (drawable)), + FALSE); + pixel_region_init (&destPR, new_tiles, + 0, 0, + gimp_item_get_width (GIMP_ITEM (drawable)), + gimp_item_get_height (GIMP_ITEM (drawable)), + TRUE); - src += srcPR.rowstride; - dest += destPR.rowstride; - } - } + for (pr = pixel_regions_register (2, &srcPR, &destPR); + pr != NULL; + pr = pixel_regions_process (pr)) + { + src = srcPR.data; + dest = destPR.data; + + for (row = 0; row < srcPR.h; row++) + { + s = src; + d = dest; + + for (col = 0; col < srcPR.w; col++) + { + offset = *s++ * 3; + val = GIMP_RGB_LUMINANCE (cmap[offset+0], + cmap[offset+1], + cmap[offset+2]) + 0.5; + *d++ = (guchar) val; + if (has_alpha) + *d++ = *s++; + } + + src += srcPR.rowstride; + dest += destPR.rowstride; + } + } + } break; default: