[gimp/goat-invasion: 83/412] app: convert drawables between RGB and GRAY using gegl_buffer_copy()
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/goat-invasion: 83/412] app: convert drawables between RGB and GRAY using gegl_buffer_copy()
- Date: Tue, 3 Apr 2012 09:40:05 +0000 (UTC)
commit e8f13f0fc6207eee77a66a85e7a885219b29ee64
Author: Michael Natterer <mitch gimp org>
Date: Fri Mar 16 18:47:04 2012 +0100
app: convert drawables between RGB and GRAY using gegl_buffer_copy()
app/core/gimpdrawable-convert.c | 272 ++++++++++++++++++---------------------
1 files changed, 123 insertions(+), 149 deletions(-)
---
diff --git a/app/core/gimpdrawable-convert.c b/app/core/gimpdrawable-convert.c
index bebc985..e6f6d69 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;
-
- for (row = 0; row < srcPR.h; row++)
- {
- s = src;
- d = dest;
-
- for (col = 0; col < srcPR.w; col++)
- {
- d[RED] = *s;
- d[GREEN] = *s;
- d[BLUE] = *s;
-
- d += 3;
- s++;
- if (has_alpha)
- *d++ = *s++;
- }
-
- src += srcPR.rowstride;
- dest += destPR.rowstride;
- }
- }
+ {
+ GeglBuffer *dest_buffer;
+
+ dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE);
+
+ 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;
-
- 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;
- }
- }
+ {
+ PixelRegion srcPR, destPR;
+ gint row, col;
+ gint offset;
+ const guchar *src, *s;
+ guchar *dest, *d;
+ const guchar *cmap;
+ gpointer pr;
+
+ 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);
+
+ 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;
+ 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;
-
- 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++;
- }
-
- src += srcPR.rowstride;
- dest += destPR.rowstride;
- }
- }
+ {
+ GeglBuffer *dest_buffer;
+
+ dest_buffer = gimp_tile_manager_create_buffer (new_tiles, TRUE);
+
+ 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;
-
- 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;
- }
- }
+ {
+ PixelRegion srcPR, destPR;
+ gint row, col;
+ gint offset, val;
+ const guchar *src, *s;
+ guchar *dest, *d;
+ const guchar *cmap;
+ gpointer pr;
+
+ 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);
+
+ 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:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]