[gimp] plug-ins: port qbist to GEGL, it's just too cool/weird to get lost
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: port qbist to GEGL, it's just too cool/weird to get lost
- Date: Mon, 8 Jan 2018 01:46:59 +0000 (UTC)
commit f7fe2753e233606f74f01bb1174e3433ebefccfc
Author: Michael Natterer <mitch gimp org>
Date: Mon Jan 8 02:45:54 2018 +0100
plug-ins: port qbist to GEGL, it's just too cool/weird to get lost
plug-ins/common/Makefile.am | 1 +
plug-ins/common/plugin-defs.pl | 2 +-
plug-ins/common/qbist.c | 135 +++++++++++++++++++---------------------
3 files changed, 67 insertions(+), 71 deletions(-)
---
diff --git a/plug-ins/common/Makefile.am b/plug-ins/common/Makefile.am
index 314e75f..8a5fe35 100644
--- a/plug-ins/common/Makefile.am
+++ b/plug-ins/common/Makefile.am
@@ -1519,6 +1519,7 @@ qbist_LDADD = \
$(libgimpcolor) \
$(libgimpbase) \
$(GTK_LIBS) \
+ $(GEGL_LIBS) \
$(RT_LIBS) \
$(INTLLIBS) \
$(qbist_RC)
diff --git a/plug-ins/common/plugin-defs.pl b/plug-ins/common/plugin-defs.pl
index 010a469..f23f028 100644
--- a/plug-ins/common/plugin-defs.pl
+++ b/plug-ins/common/plugin-defs.pl
@@ -75,7 +75,7 @@
'photocopy' => { ui => 1 },
'plugin-browser' => { ui => 1 },
'procedure-browser' => { ui => 1 },
- 'qbist' => { ui => 1 },
+ 'qbist' => { ui => 1, gegl => 1 },
'ripple' => { ui => 1 },
'sample-colorize' => { ui => 1 },
'sharpen' => { ui => 1 },
diff --git a/plug-ins/common/qbist.c b/plug-ins/common/qbist.c
index 510c522..3db1eb4 100644
--- a/plug-ins/common/qbist.c
+++ b/plug-ins/common/qbist.c
@@ -28,8 +28,6 @@
#include "config.h"
-#define _GNU_SOURCE /* need PATH_MAX */
-
#include <string.h>
#include <limits.h>
@@ -40,15 +38,6 @@
#include "libgimp/stdplugins-intl.h"
-#if ! defined PATH_MAX
-# if defined _MAX_PATH
-# define PATH_MAX _MAX_PATH
-# elif defined MAXPATHLEN
-# define PATH_MAX MAXPATHLEN
-# else
-# define PATH_MAX 1024
-# endif
-#endif
/** qbist renderer ***********************************************************/
@@ -68,15 +57,15 @@ typedef gfloat vreg[3];
typedef enum
{
- PROJECTION,
- SHIFT,
- SHIFTBACK,
- ROTATE,
- ROTATE2,
- MULTIPLY,
- SINE,
- CONDITIONAL,
- COMPLEMENT
+ PROJECTION,
+ SHIFT,
+ SHIFTBACK,
+ ROTATE,
+ ROTATE2,
+ MULTIPLY,
+ SINE,
+ CONDITIONAL,
+ COMPLEMENT
} TransformType;
#define NUM_TRANSFORMS (COMPLEMENT + 1)
@@ -88,34 +77,32 @@ typedef struct
gint source[MAX_TRANSFORMS];
gint control[MAX_TRANSFORMS];
gint dest[MAX_TRANSFORMS];
-}
-ExpInfo;
+} ExpInfo;
typedef struct
{
ExpInfo info;
gint oversampling;
gchar path[PATH_MAX];
-}
-QbistInfo;
+} QbistInfo;
/** prototypes **************************************************************/
-static void query (void);
-static void run (const gchar *name,
- gint nparams,
- const GimpParam *param,
- gint *nreturn_vals,
- GimpParam **return_vals);
+static void query (void);
+static void run (const gchar *name,
+ gint nparams,
+ const GimpParam *param,
+ gint *nreturn_vals,
+ GimpParam **return_vals);
static gboolean dialog_run (void);
-static void dialog_new_variations (GtkWidget *widget,
- gpointer data);
-static void dialog_update_previews (GtkWidget *widget,
- gpointer data);
-static void dialog_select_preview (GtkWidget *widget,
- ExpInfo *n_info);
+static void dialog_new_variations (GtkWidget *widget,
+ gpointer data);
+static void dialog_update_previews (GtkWidget *widget,
+ gpointer data);
+static void dialog_select_preview (GtkWidget *widget,
+ ExpInfo *n_info);
static QbistInfo qbist_info;
static GRand *gr = NULL;
@@ -429,12 +416,11 @@ run (const gchar *name,
gint *nreturn_vals,
GimpParam **return_vals)
{
- static GimpParam values[1];
- gint sel_x1, sel_y1, sel_width, sel_height;
- gint img_height, img_width;
-
- GimpDrawable *drawable;
+ static GimpParam values[1];
+ gint sel_x1, sel_y1, sel_width, sel_height;
+ gint img_height, img_width;
GimpRunMode run_mode;
+ gint32 drawable_id;
GimpPDBStatusType status;
*nreturn_vals = 1;
@@ -447,19 +433,20 @@ run (const gchar *name,
run_mode = param[0].data.d_int32;
INIT_I18N ();
+ gegl_init (NULL, NULL);
if (param[2].type != GIMP_PDB_DRAWABLE)
status = GIMP_PDB_CALLING_ERROR;
- drawable = gimp_drawable_get (param[2].data.d_drawable);
+ drawable_id = param[2].data.d_drawable;
- img_width = gimp_drawable_width (drawable->drawable_id);
- img_height = gimp_drawable_height (drawable->drawable_id);
+ img_width = gimp_drawable_width (drawable_id);
+ img_height = gimp_drawable_height (drawable_id);
- if (! gimp_drawable_is_rgb (drawable->drawable_id))
+ if (! gimp_drawable_is_rgb (drawable_id))
status = GIMP_PDB_CALLING_ERROR;
- if (! gimp_drawable_mask_intersect (drawable->drawable_id,
+ if (! gimp_drawable_mask_intersect (drawable_id,
&sel_x1, &sel_y1,
&sel_width, &sel_height))
{
@@ -510,46 +497,56 @@ run (const gchar *name,
if (status == GIMP_PDB_SUCCESS)
{
- GimpPixelRgn imagePR;
- gpointer pr;
+ GeglBuffer *buffer;
+ GeglBufferIterator *iter;
+ gint total_pixels = img_width * img_height;
+ gint done_pixels = 0;
+
+ buffer = gimp_drawable_get_shadow_buffer (drawable_id);
- gimp_tile_cache_ntiles ((drawable->width + gimp_tile_width () - 1) /
- gimp_tile_width ());
- gimp_pixel_rgn_init (&imagePR, drawable,
- 0, 0, img_width, img_height, TRUE, TRUE);
+ iter = gegl_buffer_iterator_new (buffer,
+ GEGL_RECTANGLE (0, 0,
+ img_width, img_height),
+ 0, babl_format ("RGBA u8"),
+ GEGL_ACCESS_READWRITE,
+ GEGL_ABYSS_NONE);
optimize (&qbist_info.info);
gimp_progress_init (_("Qbist"));
- for (pr = gimp_pixel_rgns_register (1, &imagePR);
- pr != NULL;
- pr = gimp_pixel_rgns_process (pr))
+ while (gegl_buffer_iterator_next (iter))
{
- gint row;
+ guchar *data = iter->data[0];
+ GeglRectangle roi = iter->roi[0];
+ gint row;
- for (row = 0; row < imagePR.h; row++)
+ for (row = 0; row < roi.height; row++)
{
qbist (&qbist_info.info,
- imagePR.data + row * imagePR.rowstride,
- imagePR.x,
- imagePR.y + row,
- imagePR.w,
+ data + row * roi.width * 4,
+ roi.x,
+ roi.y + row,
+ roi.width,
sel_width,
sel_height,
- imagePR.bpp,
+ 4,
qbist_info.oversampling);
}
- gimp_progress_update ((gfloat) (imagePR.y - sel_y1) /
- (gfloat) sel_height);
+ done_pixels += roi.width * roi.height;
+
+ gimp_progress_update ((gdouble) done_pixels /
+ (gdouble) total_pixels);
}
+ g_object_unref (buffer);
+
gimp_progress_update (1.0);
- gimp_drawable_flush (drawable);
- gimp_drawable_merge_shadow (drawable->drawable_id, TRUE);
- gimp_drawable_update (drawable->drawable_id, sel_x1, sel_y1,
- sel_width, sel_height);
+
+ gimp_drawable_merge_shadow (drawable_id, TRUE);
+ gimp_drawable_update (drawable_id, sel_x1, sel_y1,
+ sel_width, sel_height);
gimp_displays_flush ();
}
@@ -559,8 +556,6 @@ run (const gchar *name,
values[0].type = GIMP_PDB_STATUS;
values[0].data.d_status = status;
-
- gimp_drawable_detach (drawable);
}
/** User interface ***********************************************************/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]