[gimp/gimp-2-10] plug-ins: port depth-merge to GEGL, stupid 8-bit port only
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-10] plug-ins: port depth-merge to GEGL, stupid 8-bit port only
- Date: Wed, 17 Jul 2019 10:21:12 +0000 (UTC)
commit a47e3cb152da5e1b4f62add4c92dee54c470ad4e
Author: Michael Natterer <mitch gimp org>
Date: Wed Jul 17 12:18:50 2019 +0200
plug-ins: port depth-merge to GEGL, stupid 8-bit port only
(cherry picked from commit 7cd78f436dd6dd563ecb2549276b7f651795b286)
plug-ins/common/Makefile.am | 1 +
plug-ins/common/depth-merge.c | 527 ++++++++++++++---------------------------
plug-ins/common/plugin-defs.pl | 2 +-
3 files changed, 186 insertions(+), 344 deletions(-)
---
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index f77924a838..ab92d42ae2 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -600,6 +600,7 @@ depth_merge_LDADD = \
$(libgimpcolor) \
$(libgimpbase) \
$(GTK_LIBS) \
+ $(GEGL_LIBS) \
$(RT_LIBS) \
$(INTLLIBS) \
$(depth_merge_RC)
diff --git a/plug-ins/common/depth-merge.c b/plug-ins/common/depth-merge.c
index 043e99bc4c..ff656939bb 100644
--- a/plug-ins/common/depth-merge.c
+++ b/plug-ins/common/depth-merge.c
@@ -84,11 +84,11 @@ typedef struct _DepthMerge
DepthMergeInterface *interface;
DepthMergeParams params;
- GimpDrawable *resultDrawable;
- GimpDrawable *source1Drawable;
- GimpDrawable *source2Drawable;
- GimpDrawable *depthMap1Drawable;
- GimpDrawable *depthMap2Drawable;
+ gint32 resultDrawable_id;
+ gint32 source1Drawable_id;
+ gint32 source2Drawable_id;
+ gint32 depthMap1Drawable_id;
+ gint32 depthMap2Drawable_id;
gint selectionX;
gint selectionY;
gint selectionWidth;
@@ -125,22 +125,15 @@ static void dialogValueScaleUpdateCallback (GtkAdjustment *adjustment,
gpointer data);
static void util_fillReducedBuffer (guchar *dest,
+ const Babl *dest_format,
gint destWidth,
gint destHeight,
- gint destBPP,
- gboolean destHasAlpha,
- GimpDrawable *sourceDrawable,
+ gint32 sourceDrawable_id,
gint x0,
gint y0,
gint sourceWidth,
gint sourceHeight);
-static void util_convertColorspace (guchar *dest,
- gint destBPP,
- gboolean destHasAlpha,
- const guchar *source,
- gint sourceBPP,
- gboolean sourceHasAlpha,
- gint length);
+
/* ----- plug-in entry points ----- */
@@ -207,13 +200,13 @@ run (const gchar *name,
{
static GimpParam values[1];
GimpRunMode runMode;
- GimpPDBStatusType status;
+ GimpPDBStatusType status = GIMP_PDB_SUCCESS;
DepthMerge dm;
INIT_I18N ();
+ gegl_init (NULL, NULL);
- runMode = (GimpRunMode) param[0].data.d_int32;
- status = GIMP_PDB_SUCCESS;
+ runMode = param[0].data.d_int32;
*numReturnVals = 1;
*returnVals = values;
@@ -268,15 +261,15 @@ run (const gchar *name,
if (status == GIMP_PDB_SUCCESS)
{
- gimp_tile_cache_ntiles ((dm.resultDrawable->width +
- gimp_tile_width () - 1) / gimp_tile_width ());
-
if (!DepthMerge_execute (&dm))
- status = GIMP_PDB_EXECUTION_ERROR;
+ {
+ status = GIMP_PDB_EXECUTION_ERROR;
+ }
else
{
if (runMode != GIMP_RUN_NONINTERACTIVE)
gimp_displays_flush ();
+
if (runMode == GIMP_RUN_INTERACTIVE)
gimp_set_data (PLUG_IN_PROC,
&(dm.params), sizeof (DepthMergeParams));
@@ -309,34 +302,28 @@ DepthMerge_construct (DepthMerge *dm)
{
dm->interface = NULL;
- dm->resultDrawable = gimp_drawable_get (dm->params.result);
- if (! gimp_drawable_mask_intersect (dm->resultDrawable->drawable_id,
+ dm->resultDrawable_id = dm->params.result;
+
+ if (! gimp_drawable_mask_intersect (dm->resultDrawable_id,
&(dm->selectionX), &(dm->selectionY),
&(dm->selectionWidth),
&(dm->selectionHeight)))
{
return FALSE;
}
- dm->resultHasAlpha = gimp_drawable_has_alpha (dm->resultDrawable->drawable_id);
-
- dm->source1Drawable =
- (dm->params.source1 == -1) ? NULL : gimp_drawable_get (dm->params.source1);
- dm->source2Drawable =
- (dm->params.source2 == -1) ? NULL : gimp_drawable_get (dm->params.source2);
+ dm->resultHasAlpha = gimp_drawable_has_alpha (dm->resultDrawable_id);
- dm->depthMap1Drawable =
- (dm->params.depthMap1 == -1) ?
- NULL : gimp_drawable_get (dm->params.depthMap1);
-
- dm->depthMap2Drawable =
- (dm->params.depthMap2 == -1) ?
- NULL : gimp_drawable_get (dm->params.depthMap2);
+ dm->source1Drawable_id = dm->params.source1;
+ dm->source2Drawable_id = dm->params.source2;
+ dm->depthMap1Drawable_id = dm->params.depthMap1;
+ dm->depthMap2Drawable_id = dm->params.depthMap2;
dm->params.overlap = CLAMP (dm->params.overlap, 0, 2);
dm->params.offset = CLAMP (dm->params.offset, -1, 1);
dm->params.scale1 = CLAMP (dm->params.scale1, -1, 1);
dm->params.scale2 = CLAMP (dm->params.scale2, -1, 1);
+
return TRUE;
}
@@ -351,44 +338,21 @@ DepthMerge_destroy (DepthMerge *dm)
g_free (dm->interface->previewDepthMap2);
g_free (dm->interface);
}
- if (dm->resultDrawable != NULL)
- gimp_drawable_detach (dm->resultDrawable);
-
- if (dm->source1Drawable != NULL)
- gimp_drawable_detach (dm->source1Drawable);
-
- if (dm->source2Drawable != NULL)
- gimp_drawable_detach (dm->source2Drawable);
-
- if (dm->depthMap1Drawable != NULL)
- gimp_drawable_detach (dm->depthMap1Drawable);
-
- if (dm->depthMap2Drawable != NULL)
- gimp_drawable_detach (dm->depthMap2Drawable);
}
static gint32
DepthMerge_execute (DepthMerge *dm)
{
int x, y;
- GimpPixelRgn source1Rgn, source2Rgn;
- GimpPixelRgn depthMap1Rgn, depthMap2Rgn;
- GimpPixelRgn resultRgn;
+ GeglBuffer *source1_buffer = NULL;
+ GeglBuffer *source2_buffer = NULL;
+ GeglBuffer *depthMap1_buffer = NULL;
+ GeglBuffer *depthMap2_buffer = NULL;
+ GeglBuffer *result_buffer;
guchar *source1Row, *source2Row;
guchar *depthMap1Row, *depthMap2Row;
guchar *resultRow;
guchar *tempRow;
- gboolean source1HasAlpha;
- gboolean source2HasAlpha;
- gboolean depthMap1HasAlpha;
- gboolean depthMap2HasAlpha;
-
- /* initialize */
-
- source1HasAlpha = FALSE;
- source2HasAlpha = FALSE;
- depthMap1HasAlpha = FALSE;
- depthMap2HasAlpha = FALSE;
gimp_progress_init (_("Depth-merging"));
@@ -399,123 +363,110 @@ DepthMerge_execute (DepthMerge *dm)
depthMap2Row = g_new (guchar, dm->selectionWidth );
tempRow = g_new (guchar, dm->selectionWidth * 4);
- if (dm->source1Drawable != NULL)
+ if (dm->source1Drawable_id > 0)
{
- source1HasAlpha = gimp_drawable_has_alpha (dm->source1Drawable->drawable_id);
- gimp_pixel_rgn_init (&source1Rgn, dm->source1Drawable,
- dm->selectionX, dm->selectionY,
- dm->selectionWidth, dm->selectionHeight,
- FALSE, FALSE);
+ source1_buffer = gimp_drawable_get_buffer (dm->source1Drawable_id);
}
else
- for (x = 0; x < dm->selectionWidth; x++)
- {
- source1Row[4 * x ] = 0;
- source1Row[4 * x + 1] = 0;
- source1Row[4 * x + 2] = 0;
- source1Row[4 * x + 3] = 255;
- }
- if (dm->source2Drawable != NULL)
{
- source2HasAlpha = gimp_drawable_has_alpha (dm->source2Drawable->drawable_id);
- gimp_pixel_rgn_init (&source2Rgn, dm->source2Drawable,
- dm->selectionX, dm->selectionY,
- dm->selectionWidth, dm->selectionHeight,
- FALSE, FALSE);
+ for (x = 0; x < dm->selectionWidth; x++)
+ {
+ source1Row[4 * x ] = 0;
+ source1Row[4 * x + 1] = 0;
+ source1Row[4 * x + 2] = 0;
+ source1Row[4 * x + 3] = 255;
+ }
+ }
+
+ if (dm->source2Drawable_id > 0)
+ {
+ source2_buffer = gimp_drawable_get_buffer (dm->source2Drawable_id);
}
else
- for (x = 0; x < dm->selectionWidth; x++)
- {
- source2Row[4 * x ] = 0;
- source2Row[4 * x + 1] = 0;
- source2Row[4 * x + 2] = 0;
- source2Row[4 * x + 3] = 255;
- }
- if (dm->depthMap1Drawable != NULL)
{
- depthMap1HasAlpha = gimp_drawable_has_alpha (dm->depthMap1Drawable->drawable_id);
- gimp_pixel_rgn_init (&depthMap1Rgn, dm->depthMap1Drawable,
- dm->selectionX, dm->selectionY,
- dm->selectionWidth, dm->selectionHeight,
- FALSE, FALSE);
+ for (x = 0; x < dm->selectionWidth; x++)
+ {
+ source2Row[4 * x ] = 0;
+ source2Row[4 * x + 1] = 0;
+ source2Row[4 * x + 2] = 0;
+ source2Row[4 * x + 3] = 255;
+ }
+ }
+
+ if (dm->depthMap1Drawable_id > 0)
+ {
+ depthMap1_buffer = gimp_drawable_get_buffer (dm->depthMap1Drawable_id);
}
else
- for (x = 0; x < dm->selectionWidth; x++)
- {
- depthMap1Row[x] = 0;
- }
- if (dm->depthMap2Drawable != NULL)
{
- depthMap2HasAlpha = gimp_drawable_has_alpha (dm->depthMap2Drawable->drawable_id);
- gimp_pixel_rgn_init (&depthMap2Rgn, dm->depthMap2Drawable,
- dm->selectionX, dm->selectionY,
- dm->selectionWidth, dm->selectionHeight,
- FALSE, FALSE);
+ for (x = 0; x < dm->selectionWidth; x++)
+ {
+ depthMap1Row[x] = 0;
+ }
+ }
+
+ if (dm->depthMap2Drawable_id > 0)
+ {
+ depthMap2_buffer = gimp_drawable_get_buffer (dm->depthMap2Drawable_id);
}
else
- for (x = 0; x < dm->selectionWidth; x++)
- {
- depthMap2Row[x] = 0;
- }
- gimp_pixel_rgn_init (&resultRgn, dm->resultDrawable,
- dm->selectionX, dm->selectionY,
- dm->selectionWidth, dm->selectionHeight,
- TRUE, TRUE);
+ {
+ for (x = 0; x < dm->selectionWidth; x++)
+ {
+ depthMap2Row[x] = 0;
+ }
+ }
+
+ result_buffer = gimp_drawable_get_shadow_buffer (dm->resultDrawable_id);
for (y = dm->selectionY; y < (dm->selectionY + dm->selectionHeight); y++)
{
- if (dm->source1Drawable != NULL)
+ if (dm->source1Drawable_id > 0)
{
- gimp_pixel_rgn_get_row (&source1Rgn, tempRow,
- dm->selectionX, y,
- dm->selectionWidth);
- util_convertColorspace (source1Row, 4, TRUE,
- tempRow,
- dm->source1Drawable->bpp, source1HasAlpha,
- dm->selectionWidth);
+ gegl_buffer_get (source1_buffer,
+ GEGL_RECTANGLE (dm->selectionX, y,
+ dm->selectionWidth, 1), 1.0,
+ babl_format ("R'G'B'A u8"), source1Row,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
}
- if (dm->source2Drawable != NULL)
+
+ if (dm->source2Drawable_id > 0)
{
- gimp_pixel_rgn_get_row (&source2Rgn, tempRow,
- dm->selectionX, y,
- dm->selectionWidth);
- util_convertColorspace (source2Row, 4, TRUE,
- tempRow,
- dm->source2Drawable->bpp, source2HasAlpha,
- dm->selectionWidth);
+ gegl_buffer_get (source2_buffer,
+ GEGL_RECTANGLE (dm->selectionX, y,
+ dm->selectionWidth, 1), 1.0,
+ babl_format ("R'G'B'A u8"), source2Row,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
}
- if (dm->depthMap1Drawable != NULL)
+
+ if (dm->depthMap1Drawable_id > 0)
{
- gimp_pixel_rgn_get_row (&depthMap1Rgn, tempRow,
- dm->selectionX, y,
- dm->selectionWidth);
- util_convertColorspace (depthMap1Row, 1, FALSE,
- tempRow,
- dm->depthMap1Drawable->bpp, depthMap1HasAlpha,
- dm->selectionWidth);
+ gegl_buffer_get (depthMap1_buffer,
+ GEGL_RECTANGLE (dm->selectionX, y,
+ dm->selectionWidth, 1), 1.0,
+ babl_format ("Y' u8"), depthMap1Row,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
}
- if (dm->depthMap2Drawable != NULL)
+
+ if (dm->depthMap2Drawable_id > 0)
{
- gimp_pixel_rgn_get_row (&depthMap2Rgn, tempRow,
- dm->selectionX, y,
- dm->selectionWidth);
- util_convertColorspace (depthMap2Row, 1, FALSE,
- tempRow,
- dm->depthMap2Drawable->bpp, depthMap2HasAlpha,
- dm->selectionWidth);
+ gegl_buffer_get (depthMap2_buffer,
+ GEGL_RECTANGLE (dm->selectionX, y,
+ dm->selectionWidth, 1), 1.0,
+ babl_format ("Y' u8"), depthMap2Row,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
}
DepthMerge_executeRegion (dm,
source1Row, source2Row, depthMap1Row, depthMap2Row,
resultRow,
dm->selectionWidth);
- util_convertColorspace (tempRow, dm->resultDrawable->bpp, dm->resultHasAlpha,
- resultRow, 4, TRUE,
- dm->selectionWidth);
- gimp_pixel_rgn_set_row (&resultRgn, tempRow,
- dm->selectionX, y,
- dm->selectionWidth);
+ gegl_buffer_set (result_buffer,
+ GEGL_RECTANGLE (dm->selectionX, y,
+ dm->selectionWidth, 1), 0,
+ babl_format ("R'G'B'A u8"), resultRow,
+ GEGL_AUTO_ROWSTRIDE);
gimp_progress_update ((double)(y-dm->selectionY) /
(double)(dm->selectionHeight - 1));
@@ -529,11 +480,26 @@ DepthMerge_execute (DepthMerge *dm)
g_free (tempRow);
gimp_progress_update (1.0);
- gimp_drawable_flush (dm->resultDrawable);
- gimp_drawable_merge_shadow (dm->resultDrawable->drawable_id, TRUE);
- gimp_drawable_update (dm->resultDrawable->drawable_id,
+
+ if (source1_buffer)
+ g_object_unref (source1_buffer);
+
+ if (source2_buffer)
+ g_object_unref (source2_buffer);
+
+ if (depthMap1_buffer)
+ g_object_unref (depthMap1_buffer);
+
+ if (depthMap2_buffer)
+ g_object_unref (depthMap2_buffer);
+
+ g_object_unref (result_buffer);
+
+ gimp_drawable_merge_shadow (dm->resultDrawable_id, TRUE);
+ gimp_drawable_update (dm->resultDrawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
+
return TRUE;
}
@@ -821,40 +787,43 @@ DepthMerge_buildPreviewSourceImage (DepthMerge *dm)
g_new (guchar, dm->interface->previewWidth *
dm->interface->previewHeight * 4);
util_fillReducedBuffer (dm->interface->previewSource1,
+ babl_format ("R'G'B'A u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 4, TRUE,
- dm->source1Drawable,
+ dm->source1Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
+
dm->interface->previewSource2 =
g_new (guchar, dm->interface->previewWidth *
dm->interface->previewHeight * 4);
util_fillReducedBuffer (dm->interface->previewSource2,
+ babl_format ("R'G'B'A u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 4, TRUE,
- dm->source2Drawable,
+ dm->source2Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
+
dm->interface->previewDepthMap1 =
g_new (guchar, dm->interface->previewWidth *
dm->interface->previewHeight * 1);
util_fillReducedBuffer (dm->interface->previewDepthMap1,
+ babl_format ("Y' u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 1, FALSE,
- dm->depthMap1Drawable,
+ dm->depthMap1Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
+
dm->interface->previewDepthMap2 =
g_new (guchar, dm->interface->previewWidth *
dm->interface->previewHeight * 1);
util_fillReducedBuffer (dm->interface->previewDepthMap2,
+ babl_format ("Y' u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 1, FALSE,
- dm->depthMap2Drawable,
+ dm->depthMap2Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
}
@@ -923,21 +892,16 @@ static void
dialogSource1ChangedCallback (GtkWidget *widget,
DepthMerge *dm)
{
- if (dm->source1Drawable)
- gimp_drawable_detach (dm->source1Drawable);
-
gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
&dm->params.source1);
- dm->source1Drawable = ((dm->params.source1 == -1) ?
- NULL :
- gimp_drawable_get (dm->params.source1));
+ dm->source1Drawable_id = dm->params.source1;
util_fillReducedBuffer (dm->interface->previewSource1,
+ babl_format ("R'G'B'A u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 4, TRUE,
- dm->source1Drawable,
+ dm->source1Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
@@ -948,21 +912,16 @@ static void
dialogSource2ChangedCallback (GtkWidget *widget,
DepthMerge *dm)
{
- if (dm->source2Drawable)
- gimp_drawable_detach (dm->source2Drawable);
-
gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
&dm->params.source2);
- dm->source2Drawable = ((dm->params.source2 == -1) ?
- NULL :
- gimp_drawable_get (dm->params.source2));
+ dm->source2Drawable_id = dm->params.source2;
util_fillReducedBuffer (dm->interface->previewSource2,
+ babl_format ("R'G'B'A u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 4, TRUE,
- dm->source2Drawable,
+ dm->source2Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
@@ -973,21 +932,16 @@ static void
dialogDepthMap1ChangedCallback (GtkWidget *widget,
DepthMerge *dm)
{
- if (dm->depthMap1Drawable)
- gimp_drawable_detach (dm->depthMap1Drawable);
-
gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
&dm->params.depthMap1);
- dm->depthMap1Drawable = ((dm->params.depthMap1 == -1) ?
- NULL :
- gimp_drawable_get (dm->params.depthMap1));
+ dm->depthMap1Drawable_id = dm->params.depthMap1;
util_fillReducedBuffer (dm->interface->previewDepthMap1,
+ babl_format ("Y' u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 1, FALSE,
- dm->depthMap1Drawable,
+ dm->depthMap1Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
@@ -998,21 +952,16 @@ static void
dialogDepthMap2ChangedCallback (GtkWidget *widget,
DepthMerge *dm)
{
- if (dm->depthMap2Drawable)
- gimp_drawable_detach (dm->depthMap2Drawable);
-
gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
&dm->params.depthMap2);
- dm->depthMap2Drawable = ((dm->params.depthMap2 == -1) ?
- NULL :
- gimp_drawable_get (dm->params.depthMap2));
+ dm->depthMap2Drawable_id = dm->params.depthMap2;;
util_fillReducedBuffer (dm->interface->previewDepthMap2,
+ babl_format ("Y' u8"),
dm->interface->previewWidth,
dm->interface->previewHeight,
- 1, FALSE,
- dm->depthMap2Drawable,
+ dm->depthMap2Drawable_id,
dm->selectionX, dm->selectionY,
dm->selectionWidth, dm->selectionHeight);
@@ -1033,177 +982,69 @@ dialogValueScaleUpdateCallback (GtkAdjustment *adjustment,
/* ----- Utility routines ----- */
static void
-util_fillReducedBuffer (guchar *dest,
- gint destWidth,
- gint destHeight,
- gint destBPP,
- gboolean destHasAlpha,
- GimpDrawable *sourceDrawable,
- gint x0,
- gint y0,
- gint sourceWidth,
- gint sourceHeight)
+util_fillReducedBuffer (guchar *dest,
+ const Babl *dest_format,
+ gint destWidth,
+ gint destHeight,
+ gint32 sourceDrawable_id,
+ gint x0,
+ gint y0,
+ gint sourceWidth,
+ gint sourceHeight)
{
- GimpPixelRgn rgn;
- guchar *sourceBuffer, *reducedRowBuffer;
- guchar *sourceBufferPos, *reducedRowBufferPos;
- guchar *sourceBufferRow;
- gint x, y, i, yPrime;
- gboolean sourceHasAlpha;
- gint sourceBpp;
- gint *sourceRowOffsetLookup;
-
- if ((sourceDrawable == NULL) || (sourceWidth == 0) || (sourceHeight == 0))
+ GeglBuffer *buffer;
+ guchar *sourceBuffer, *reducedRowBuffer;
+ guchar *sourceBufferPos, *reducedRowBufferPos;
+ guchar *sourceBufferRow;
+ gint x, y, i, yPrime;
+ gint destBPP;
+ gint *sourceRowOffsetLookup;
+
+ destBPP = babl_format_get_bytes_per_pixel (dest_format);
+
+ if ((sourceDrawable_id < 1) || (sourceWidth == 0) || (sourceHeight == 0))
{
for (x = 0; x < destWidth * destHeight * destBPP; x++)
dest[x] = 0;
+
return;
}
- sourceBpp = sourceDrawable->bpp;
-
- sourceBuffer = g_new (guchar, sourceWidth * sourceHeight * sourceBpp);
- reducedRowBuffer = g_new (guchar, destWidth * sourceBpp);
+ sourceBuffer = g_new (guchar, sourceWidth * sourceHeight * destBPP);
+ reducedRowBuffer = g_new (guchar, destWidth * destBPP);
sourceRowOffsetLookup = g_new (int, destWidth);
- gimp_pixel_rgn_init (&rgn, sourceDrawable,
- x0, y0, sourceWidth, sourceHeight,
- FALSE, FALSE);
- sourceHasAlpha = gimp_drawable_has_alpha (sourceDrawable->drawable_id);
+
+ buffer = gimp_drawable_get_buffer (sourceDrawable_id);
for (x = 0; x < destWidth; x++)
- sourceRowOffsetLookup[x] = (x * (sourceWidth - 1) / (destWidth - 1)) * sourceBpp;
+ sourceRowOffsetLookup[x] = (x * (sourceWidth - 1) / (destWidth - 1)) * destBPP;
- gimp_pixel_rgn_get_rect (&rgn, sourceBuffer,
- x0, y0, sourceWidth, sourceHeight);
+ gegl_buffer_get (buffer,
+ GEGL_RECTANGLE (x0, y0, sourceWidth, sourceHeight), 1.0,
+ dest_format, sourceBuffer,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
for (y = 0; y < destHeight; y++)
{
yPrime = y * (sourceHeight - 1) / (destHeight - 1);
- sourceBufferRow = &(sourceBuffer[yPrime * sourceWidth * sourceBpp]);
+ sourceBufferRow = &(sourceBuffer[yPrime * sourceWidth * destBPP]);
reducedRowBufferPos = reducedRowBuffer;
+
for (x = 0; x < destWidth; x++)
{
sourceBufferPos = sourceBufferRow + sourceRowOffsetLookup[x];
- for (i = 0; i < sourceBpp; i++)
+ for (i = 0; i < destBPP; i++)
reducedRowBufferPos[i] = sourceBufferPos[i];
- reducedRowBufferPos += sourceBpp;
+ reducedRowBufferPos += destBPP;
}
- util_convertColorspace(&(dest[y * destWidth * destBPP]), destBPP, destHasAlpha,
- reducedRowBuffer, sourceDrawable->bpp, sourceHasAlpha,
- destWidth);
+
+ memcpy (&(dest[y * destWidth * destBPP]), reducedRowBuffer,
+ destWidth * destBPP);
}
+ g_object_unref (buffer);
+
g_free (sourceBuffer);
g_free (reducedRowBuffer);
g_free (sourceRowOffsetLookup);
}
-
-/* Utterly pathetic kludge to convert between color spaces;
- likes gray and rgb best, of course. Others will be creatively mutilated,
- and even rgb->gray is pretty bad */
-static void
-util_convertColorspace (guchar *dest,
- gint destBPP,
- gboolean destHasAlpha,
- const guchar *source,
- gint sourceBPP,
- gboolean sourceHasAlpha,
- gint length)
-{
- gint i, j;
- gint sourcePos, destPos;
- gint accum;
- gint sourceColorBPP = sourceHasAlpha ? (sourceBPP - 1) : sourceBPP;
- gint destColorBPP = destHasAlpha ? (destBPP - 1) : destBPP;
-
- if ((sourceColorBPP == destColorBPP) &&
- (sourceBPP == destBPP ))
- {
- j = length * sourceBPP;
- for (i = 0; i < j; i++)
- dest[i] = source[i];
- return;
- }
-
- if (sourceColorBPP == destColorBPP)
- {
- for (i = destPos = sourcePos = 0;
- i < length;
- i++, destPos += destBPP, sourcePos += sourceBPP)
- {
- for (j = 0; j < destColorBPP; j++)
- dest[destPos + j] = source[sourcePos + j];
- }
- }
- else if (sourceColorBPP == 1)
- {
- /* Duplicate single "gray" source byte across all dest bytes */
- for (i = destPos = sourcePos = 0;
- i < length;
- i++, destPos += destBPP, sourcePos += sourceBPP)
- {
- for (j = 0; j < destColorBPP; j++)
- dest[destPos + j] = source[sourcePos];
- }
- }
- else if (destColorBPP == 1)
- {
- /* Average all source bytes into single "gray" dest byte */
- for (i = destPos = sourcePos = 0;
- i < length;
- i++, destPos += destBPP, sourcePos += sourceBPP)
- {
- accum = 0;
- for (j = 0; j < sourceColorBPP; j++)
- accum += source[sourcePos + j];
- dest[destPos] = accum/sourceColorBPP;
- }
- }
- else if (destColorBPP < sourceColorBPP)
- {
- /* Copy as many corresponding bytes from source to dest as will fit */
- for (i = destPos = sourcePos = 0;
- i < length;
- i++, destPos += destBPP, sourcePos += sourceBPP)
- {
- for (j = 0; j < destColorBPP; j++)
- dest[destPos + j] = source[sourcePos + j];
- }
- }
- else /* destColorBPP > sourceColorBPP */
- {
- /* Fill extra dest bytes with zero */
- for (i = destPos = sourcePos = 0;
- i < length;
- i++, destPos += destBPP, sourcePos += sourceBPP)
- {
- for (j = 0; j < sourceColorBPP; j++)
- dest[destPos + j] = source[destPos + j];
- for ( ; j < destColorBPP; j++)
- dest[destPos + j] = 0;
- }
- }
-
- if (destHasAlpha)
- {
- if (sourceHasAlpha)
- {
- for (i = 0, destPos = destColorBPP, sourcePos = sourceColorBPP;
- i < length;
- i++, destPos += destBPP, sourcePos += sourceBPP)
- {
- dest[destPos] = source[sourcePos];
- }
- }
- else
- {
- for (i = 0, destPos = destColorBPP;
- i < length;
- i++, destPos += destBPP)
- {
- dest[destPos] = 255;
- }
- }
- }
-}
-
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index cc5d626539..2251463d00 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -18,7 +18,7 @@
'crop-zealous' => { gegl => 1 },
'curve-bend' => { ui => 1, gegl => 1 },
'decompose' => { ui => 1, gegl => 1 },
- 'depth-merge' => { ui => 1 },
+ 'depth-merge' => { ui => 1, gegl => 1 },
'despeckle' => { ui => 1, gegl => 1 },
'destripe' => { ui => 1, gegl => 1 },
'edge-dog' => { ui => 1 },
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]