[gimp] plug-ins: port fractal-explorer to GEGL, 8 bit only
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: port fractal-explorer to GEGL, 8 bit only
- Date: Fri, 28 Jun 2019 11:04:19 +0000 (UTC)
commit a3e2dda8c7a8abbe0ad38e5a70848b06fbf9c92d
Author: Michael Natterer <mitch gimp org>
Date: Fri Jun 28 13:03:45 2019 +0200
plug-ins: port fractal-explorer to GEGL, 8 bit only
plug-ins/fractal-explorer/Makefile.am | 1 +
plug-ins/fractal-explorer/fractal-explorer.c | 121 ++++++++++++---------------
2 files changed, 56 insertions(+), 66 deletions(-)
---
diff --git a/plug-ins/fractal-explorer/Makefile.am b/plug-ins/fractal-explorer/Makefile.am
index 87031a4358..2905f1f6e5 100644
--- a/plug-ins/fractal-explorer/Makefile.am
+++ b/plug-ins/fractal-explorer/Makefile.am
@@ -49,6 +49,7 @@ LDADD = \
$(libgimpmath) \
$(libgimpbase) \
$(GTK_LIBS) \
+ $(GEGL_LIBS) \
$(RT_LIBS) \
$(INTLLIBS) \
$(fractal_explorer_RC)
diff --git a/plug-ins/fractal-explorer/fractal-explorer.c b/plug-ins/fractal-explorer/fractal-explorer.c
index 01fe73a7ef..00c7d2fb53 100644
--- a/plug-ins/fractal-explorer/fractal-explorer.c
+++ b/plug-ins/fractal-explorer/fractal-explorer.c
@@ -95,7 +95,7 @@ gchar *fractalexplorer_path = NULL;
static gfloat cx = -0.75;
static gfloat cy = -0.2;
-GimpDrawable *drawable;
+gint32 drawable_id;
static GList *fractalexplorer_list = NULL;
explorer_interface_t wint =
@@ -141,7 +141,7 @@ static void run (const gchar *name,
gint *nreturn_vals,
GimpParam **return_vals);
-static void explorer (GimpDrawable *drawable);
+static void explorer (gint32 drawable_id);
/**********************************************************************
Declare local functions
@@ -266,8 +266,6 @@ run (const gchar *name,
gint sel_width;
gint sel_height;
- run_mode = param[0].data.d_int32;
-
values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status;
@@ -275,11 +273,12 @@ run (const gchar *name,
*return_vals = values;
INIT_I18N ();
+ gegl_init (NULL, NULL);
- /* Get the specified drawable */
- drawable = gimp_drawable_get (param[2].data.d_drawable);
+ run_mode = param[0].data.d_int32;
+ drawable_id = param[2].data.d_drawable;
- if (! gimp_drawable_mask_intersect (drawable->drawable_id,
+ if (! gimp_drawable_mask_intersect (drawable_id,
&sel_x, &sel_y,
&sel_width, &sel_height))
return;
@@ -362,32 +361,20 @@ run (const gchar *name,
if (status == GIMP_PDB_SUCCESS)
{
- /* Make sure that the drawable is not indexed */
- if (! gimp_drawable_is_indexed (drawable->drawable_id))
- {
- gimp_progress_init (_("Rendering fractal"));
+ gimp_progress_init (_("Rendering fractal"));
- /* Set the tile cache size */
- gimp_tile_cache_ntiles (2 * (drawable->width / gimp_tile_width() + 1));
- /* Run! */
+ explorer (drawable_id);
- explorer (drawable);
- if (run_mode != GIMP_RUN_NONINTERACTIVE)
- gimp_displays_flush ();
+ if (run_mode != GIMP_RUN_NONINTERACTIVE)
+ gimp_displays_flush ();
- /* Store data */
- if (run_mode == GIMP_RUN_INTERACTIVE)
- gimp_set_data ("plug_in_fractalexplorer",
- &wvals, sizeof (explorer_vals_t));
- }
- else
- {
- status = GIMP_PDB_EXECUTION_ERROR;
- }
+ /* Store data */
+ if (run_mode == GIMP_RUN_INTERACTIVE)
+ gimp_set_data ("plug_in_fractalexplorer",
+ &wvals, sizeof (explorer_vals_t));
}
- values[0].data.d_status = status;
- gimp_drawable_detach (drawable);
+ values[0].data.d_status = status;
}
/**********************************************************************
@@ -395,20 +382,21 @@ run (const gchar *name,
*********************************************************************/
static void
-explorer (GimpDrawable * drawable)
+explorer (gint32 drawable_id)
{
- GimpPixelRgn srcPR;
- GimpPixelRgn destPR;
- gint width;
- gint height;
- gint bpp;
- gint row;
- gint x;
- gint y;
- gint w;
- gint h;
- guchar *src_row;
- guchar *dest_row;
+ GeglBuffer *src_buffer;
+ GeglBuffer *dest_buffer;
+ const Babl *format;
+ gint width;
+ gint height;
+ gint bpp;
+ gint row;
+ gint x;
+ gint y;
+ gint w;
+ gint h;
+ guchar *src_row;
+ guchar *dest_row;
/* Get the input area. This is the bounding box of the selection in
* the image (or the entire image if there is no selection). Only
@@ -416,42 +404,39 @@ explorer (GimpDrawable * drawable)
* need to be done for correct operation. (It simply makes it go
* faster, since fewer pixels need to be operated on).
*/
- if (! gimp_drawable_mask_intersect (drawable->drawable_id, &x, &y, &w, &h))
+ if (! gimp_drawable_mask_intersect (drawable_id, &x, &y, &w, &h))
return;
/* Get the size of the input image. (This will/must be the same
* as the size of the output image.
*/
- width = drawable->width;
- height = drawable->height;
- bpp = drawable->bpp;
+ width = gimp_drawable_width (drawable_id);
+ height = gimp_drawable_height (drawable_id);
+
+ if (gimp_drawable_has_alpha (drawable_id))
+ format = babl_format ("R'G'B'A u8");
+ else
+ format = babl_format ("R'G'B' u8");
+
+ bpp = babl_format_get_bytes_per_pixel (format);
/* allocate row buffers */
src_row = g_new (guchar, bpp * w);
dest_row = g_new (guchar, bpp * w);
- /* initialize the pixel regions */
- gimp_pixel_rgn_init (&srcPR, drawable, 0, 0, width, height, FALSE, FALSE);
- gimp_pixel_rgn_init (&destPR, drawable, 0, 0, width, height, TRUE, TRUE);
+ src_buffer = gimp_drawable_get_buffer (drawable_id);
+ dest_buffer = gimp_drawable_get_shadow_buffer (drawable_id);
xbild = width;
ybild = height;
xdiff = (xmax - xmin) / xbild;
ydiff = (ymax - ymin) / ybild;
- /* for grayscale drawables */
- if (bpp < 3)
- {
- gint i;
- for (i = 0; i < MAXNCOLORS; i++)
- valuemap[i] = GIMP_RGB_LUMINANCE (colormap[i].r,
- colormap[i].g,
- colormap[i].b);
- }
-
for (row = y; row < y + h; row++)
{
- gimp_pixel_rgn_get_row (&srcPR, src_row, x, row, w);
+ gegl_buffer_get (src_buffer, GEGL_RECTANGLE (x, row, w, 1), 1.0,
+ format, src_row,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
explorer_render_row (src_row,
dest_row,
@@ -459,21 +444,25 @@ explorer (GimpDrawable * drawable)
w,
bpp);
- /* store the dest */
- gimp_pixel_rgn_set_row (&destPR, dest_row, x, row, w);
+ gegl_buffer_set (dest_buffer, GEGL_RECTANGLE (x, row, w, 1), 0,
+ format, dest_row,
+ GEGL_AUTO_ROWSTRIDE);
if ((row % 10) == 0)
gimp_progress_update ((double) row / (double) h);
}
- gimp_progress_update (1.0);
- /* update the processed region */
- gimp_drawable_flush (drawable);
- gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
- gimp_drawable_update (drawable->drawable_id, x, y, w, h);
+ g_object_unref (src_buffer);
+ g_object_unref (dest_buffer);
g_free (src_row);
g_free (dest_row);
+
+ gimp_progress_update (1.0);
+
+ /* update the processed region */
+ gimp_drawable_merge_shadow (drawable_id, TRUE);
+ gimp_drawable_update (drawable_id, x, y, w, h);
}
/**********************************************************************
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]