[gimp] plug-ins: port flame to GEGL, 8-bit only
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: port flame to GEGL, 8-bit only
- Date: Fri, 28 Jun 2019 10:38:04 +0000 (UTC)
commit be411a58a78dc25008ed363fcf99b824ec0c738f
Author: Michael Natterer <mitch gimp org>
Date: Fri Jun 28 12:37:26 2019 +0200
plug-ins: port flame to GEGL, 8-bit only
plug-ins/flame/Makefile.am | 1 +
plug-ins/flame/flame.c | 122 ++++++++++++++++++++++++---------------------
2 files changed, 66 insertions(+), 57 deletions(-)
---
diff --git a/plug-ins/flame/Makefile.am b/plug-ins/flame/Makefile.am
index 6b3e4763b0..4171d894af 100644
--- a/plug-ins/flame/Makefile.am
+++ b/plug-ins/flame/Makefile.am
@@ -53,6 +53,7 @@ LDADD = \
$(libgimpmath) \
$(libgimpbase) \
$(GTK_LIBS) \
+ $(GEGL_LIBS) \
$(RT_LIBS) \
$(INTLLIBS) \
$(flame_RC)
diff --git a/plug-ins/flame/flame.c b/plug-ins/flame/flame.c
index f7c4ca7a58..37f8783f20 100644
--- a/plug-ins/flame/flame.c
+++ b/plug-ins/flame/flame.c
@@ -69,7 +69,7 @@ static void run (const gchar *name,
const GimpParam *param,
gint *nreturn_vals,
GimpParam **return_vals);
-static void flame (GimpDrawable *drawable);
+static void flame (gint32 drawable_id);
static gboolean flame_dialog (void);
static void set_flame_preview (void);
@@ -178,16 +178,18 @@ run (const gchar *name,
GimpParam **return_vals)
{
static GimpParam values[1];
- GimpDrawable *drawable = NULL;
+ gint32 drawable_id;
GimpRunMode run_mode;
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
*nreturn_vals = 1;
*return_vals = values;
- run_mode = param[0].data.d_int32;
+ run_mode = param[0].data.d_int32;
+ drawable_id = param[2].data.d_drawable;
INIT_I18N ();
+ gegl_init (NULL, NULL);
if (run_mode == GIMP_RUN_NONINTERACTIVE)
{
@@ -198,16 +200,13 @@ run (const gchar *name,
gimp_get_data (PLUG_IN_PROC, &config);
maybe_init_cp ();
- drawable = gimp_drawable_get (param[2].data.d_drawable);
- config.cp.width = drawable->width;
- config.cp.height = drawable->height;
+ config.cp.width = gimp_drawable_width (drawable_id);
+ config.cp.height = gimp_drawable_height (drawable_id);
if (run_mode == GIMP_RUN_INTERACTIVE)
{
if (! flame_dialog ())
{
- gimp_drawable_detach (drawable);
-
status = GIMP_PDB_CANCEL;
}
}
@@ -222,13 +221,11 @@ run (const gchar *name,
if (status == GIMP_PDB_SUCCESS)
{
- if (gimp_drawable_is_rgb (drawable->drawable_id))
+ if (gimp_drawable_is_rgb (drawable_id))
{
gimp_progress_init (_("Drawing flame"));
- gimp_tile_cache_ntiles (2 * (drawable->width /
- gimp_tile_width () + 1));
- flame (drawable);
+ flame (drawable_id);
if (run_mode != GIMP_RUN_NONINTERACTIVE)
gimp_displays_flush ();
@@ -239,8 +236,6 @@ run (const gchar *name,
{
status = GIMP_PDB_EXECUTION_ERROR;
}
-
- gimp_drawable_detach (drawable);
}
values[0].type = GIMP_PDB_STATUS;
@@ -250,10 +245,7 @@ run (const gchar *name,
static void
drawable_to_cmap (control_point *cp)
{
- gint i, j;
- GimpPixelRgn pr;
- GimpDrawable *d;
- guchar *p;
+ gint i, j;
if (TABLE_DRAWABLE >= config.cmap_drawable)
{
@@ -285,38 +277,44 @@ drawable_to_cmap (control_point *cp)
}
else
{
- d = gimp_drawable_get (config.cmap_drawable);
- p = g_new (guchar, d->bpp);
- gimp_pixel_rgn_init (&pr, d, 0, 0,
- d->width, d->height, FALSE, FALSE);
+ GeglBuffer *buffer = gimp_drawable_get_buffer (config.cmap_drawable);
+ gint width = gegl_buffer_get_width (buffer);
+ gint height = gegl_buffer_get_height (buffer);
+ guchar p[3];
+
for (i = 0; i < 256; i++)
{
- gimp_pixel_rgn_get_pixel (&pr, p, i % d->width,
- (i / d->width) % d->height);
+ gegl_buffer_sample (buffer,
+ i % width,
+ (i / width) % height,
+ NULL, p, babl_format ("R'G'B'"),
+ GEGL_SAMPLER_NEAREST, GEGL_ABYSS_NONE);
+
for (j = 0; j < 3; j++)
- cp->cmap[i][j] =
- (d->bpp >= 3) ? (p[j] / 255.0) : (p[0]/255.0);
+ cp->cmap[i][j] = p[j] / 255.0;
}
- g_free (p);
+
+ g_object_unref (buffer);
}
}
static void
-flame (GimpDrawable *drawable)
+flame (gint32 drawable_id)
{
- gint width, height;
- guchar *tmp;
- gint bytes;
+ const Babl *format;
+ gint width, height;
+ guchar *tmp;
+ gint bytes;
- width = drawable->width;
- height = drawable->height;
- bytes = drawable->bpp;
+ width = gimp_drawable_width (drawable_id);
+ height = gimp_drawable_height (drawable_id);
- if (3 != bytes && 4 != bytes)
- {
- g_message (_("Flame works only on RGB drawables."));
- return;
- }
+ if (gimp_drawable_has_alpha (drawable_id))
+ format = babl_format ("R'G'B'A u8");
+ else
+ format = babl_format ("R'G'B' u8");
+
+ bytes = babl_format_get_bytes_per_pixel (format);
tmp = g_new (guchar, width * height * 4);
@@ -331,31 +329,34 @@ flame (GimpDrawable *drawable)
gimp_progress_update (1.0);
/* update destination */
- if (4 == bytes)
+ if (bytes == 4)
{
- GimpPixelRgn pr;
- gimp_pixel_rgn_init (&pr, drawable, 0, 0, width, height,
- TRUE, TRUE);
- gimp_pixel_rgn_set_rect (&pr, tmp, 0, 0, width, height);
+ GeglBuffer *buffer = gimp_drawable_get_shadow_buffer (drawable_id);
+
+ gegl_buffer_set (buffer, GEGL_RECTANGLE (0, 0, width, height), 0,
+ format, tmp,
+ GEGL_AUTO_ROWSTRIDE);
+
+ g_object_unref (buffer);
}
- else if (3 == bytes)
+ else if (bytes == 3)
{
- gint i, j;
- GimpPixelRgn src_pr, dst_pr;
- guchar *sl;
+ GeglBuffer *src_buffer = gimp_drawable_get_buffer (drawable_id);
+ GeglBuffer *dest_buffer = gimp_drawable_get_shadow_buffer (drawable_id);
+ gint i, j;
+ guchar *sl;
sl = g_new (guchar, 3 * width);
- gimp_pixel_rgn_init (&src_pr, drawable,
- 0, 0, width, height, FALSE, FALSE);
- gimp_pixel_rgn_init (&dst_pr, drawable,
- 0, 0, width, height, TRUE, TRUE);
for (i = 0; i < height; i++)
{
guchar *rr = tmp + 4 * i * width;
guchar *sld = sl;
- gimp_pixel_rgn_get_rect (&src_pr, sl, 0, i, width, 1);
+ gegl_buffer_get (src_buffer, GEGL_RECTANGLE (0, i, width, 1), 1.0,
+ format, sl,
+ GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
+
for (j = 0; j < width; j++)
{
gint k, alpha = rr[3];
@@ -370,15 +371,22 @@ flame (GimpDrawable *drawable)
rr += 4;
sld += 3;
}
- gimp_pixel_rgn_set_rect (&dst_pr, sl, 0, i, width, 1);
+
+ gegl_buffer_set (dest_buffer, GEGL_RECTANGLE (0, i, width, 1), 0,
+ format, sl,
+ GEGL_AUTO_ROWSTRIDE);
}
+
g_free (sl);
+
+ g_object_unref (src_buffer);
+ g_object_unref (dest_buffer);
}
g_free (tmp);
- gimp_drawable_flush (drawable);
- gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
- gimp_drawable_update (drawable->drawable_id, 0, 0, width, height);
+
+ gimp_drawable_merge_shadow (drawable_id, TRUE);
+ gimp_drawable_update (drawable_id, 0, 0, width, height);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]