[gimp] plug-ins: port pagecurl to the new API, to have a GUI plug-in to test
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] plug-ins: port pagecurl to the new API, to have a GUI plug-in to test
- Date: Sat, 3 Aug 2019 15:11:09 +0000 (UTC)
commit eaf5c792bf8f097f707583f273d55509500cc9b6
Author: Michael Natterer <mitch gimp org>
Date: Sat Aug 3 17:00:13 2019 +0200
plug-ins: port pagecurl to the new API, to have a GUI plug-in to test
plug-ins/pagecurl/pagecurl.c | 340 +++++++++++++++++++++++++------------------
1 file changed, 199 insertions(+), 141 deletions(-)
---
diff --git a/plug-ins/pagecurl/pagecurl.c b/plug-ins/pagecurl/pagecurl.c
index c2d3830fe2..857e569d4d 100644
--- a/plug-ins/pagecurl/pagecurl.c
+++ b/plug-ins/pagecurl/pagecurl.c
@@ -22,6 +22,7 @@
/*
* Ported to the 0.99.x architecture by Simon Budig, Simon Budig unix-ag org
+ * Ported to the 3.0 plug-in API by Michael Natterer <mitch gimp org>
*/
/*
@@ -39,6 +40,7 @@
* 1.0: (July '04)
* - Code cleanup, added reverse gradient option.
*/
+
#include "config.h"
#include <libgimp/gimp.h>
@@ -101,45 +103,58 @@ typedef struct
CurlOrientation orientation;
} CurlParams;
+typedef struct _Pagecurl Pagecurl;
+typedef struct _PagecurlClass PagecurlClass;
-/***** Prototypes *****/
+struct _Pagecurl
+{
+ GimpPlugIn parent_instance;
+};
-static void query (void);
-static void run (const gchar *name,
- gint nparams,
- const GimpParam *param,
- gint *nreturn_vals,
- GimpParam **return_vals);
-static void set_default_params (void);
+struct _PagecurlClass
+{
+ GimpPlugInClass parent_class;
+};
-static void dialog_scale_update (GtkAdjustment *adjustment,
- gdouble *value);
-static gboolean dialog (void);
+#define PAGECURL_TYPE (pagecurl_get_type ())
+#define PAGECURL (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PAGECURL_TYPE, Pagecurl))
-static void init_calculation (gint32 drawable_id);
-static gint32 do_curl_effect (gint32 drawable_id);
-static void clear_curled_region (gint32 drawable_id);
-static gint32 page_curl (gint32 drawable_id);
-static GimpRGB * get_gradient_samples (gint32 drawable_id,
- gboolean reverse);
+GType pagecurl_get_type (void) G_GNUC_CONST;
+static GList * pagecurl_query_procedures (GimpPlugIn *plug_in);
+static GimpProcedure * pagecurl_create_procedure (GimpPlugIn *plug_in,
+ const gchar *name);
-/***** Variables *****/
+static GimpValueArray * pagecurl_run (GimpProcedure *procedure,
+ const GimpValueArray *args,
+ gpointer run_data);
+
+static void dialog_scale_update (GtkAdjustment *adjustment,
+ gdouble *value);
+
+static gboolean dialog (void);
+
+static void init_calculation (gint32 drawable_id);
+static gint32 do_curl_effect (gint32 drawable_id);
+static void clear_curled_region (gint32 drawable_id);
+static gint32 page_curl (gint32 drawable_id);
+static GimpRGB * get_gradient_samples (gint32 drawable_id,
+ gboolean reverse);
+
+
+G_DEFINE_TYPE (Pagecurl, pagecurl, GIMP_TYPE_PLUG_IN)
+
+GIMP_MAIN (PAGECURL_TYPE)
-const GimpPlugInInfo PLUG_IN_INFO =
-{
- NULL, /* init_proc */
- NULL, /* quit_proc */
- query, /* query_proc */
- run /* run_proc */
-};
+
+/***** Variables *****/
static CurlParams curl;
/* Image parameters */
-static gint32 image_id;
+static gint32 image_id = -1;
static GtkWidget *curl_image = NULL;
@@ -171,135 +186,187 @@ static GimpRGB fg_color;
static GimpRGB bg_color;
-/***** Functions *****/
+static void
+pagecurl_class_init (PagecurlClass *klass)
+{
+ GimpPlugInClass *plug_in_class = GIMP_PLUG_IN_CLASS (klass);
-MAIN ()
+ plug_in_class->query_procedures = pagecurl_query_procedures;
+ plug_in_class->create_procedure = pagecurl_create_procedure;
+}
static void
-query (void)
+pagecurl_init (Pagecurl *pagecurl)
{
- static const GimpParamDef args[] =
- {
- { GIMP_PDB_INT32, "run-mode", "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" },
- { GIMP_PDB_IMAGE, "image", "Input image" },
- { GIMP_PDB_DRAWABLE, "drawable", "Input drawable" },
- { GIMP_PDB_INT32, "colors", "FG- and BG-Color (0), Current gradient (1), Current gradient
reversed (2)" },
- { GIMP_PDB_INT32, "edge",
- "Edge to curl (1-4, clockwise, starting in the lower right edge)" },
- { GIMP_PDB_INT32, "orientation", "Vertical (0), Horizontal (1)" },
- { GIMP_PDB_INT32, "shade",
- "Shade the region under the curl (1) or not (0)" },
- };
-
- static const GimpParamDef return_vals[] =
- {
- { GIMP_PDB_LAYER, "Curl Layer", "The new layer with the curl." }
- };
-
- gimp_install_procedure (PLUG_IN_PROC,
- N_("Curl up one of the image corners"),
- "This plug-in creates a pagecurl-effect.",
- "Federico Mena Quintero and Simon Budig",
- "Federico Mena Quintero and Simon Budig",
- PLUG_IN_VERSION,
- N_("_Pagecurl..."),
- "RGB*, GRAY*",
- GIMP_PLUGIN,
- G_N_ELEMENTS (args),
- G_N_ELEMENTS (return_vals),
- args,
- return_vals);
-
- gimp_plugin_menu_register (PLUG_IN_PROC, "<Image>/Filters/Distorts");
}
-static void
-run (const gchar *name,
- gint nparams,
- const GimpParam *param,
- gint *nreturn_vals,
- GimpParam **return_vals)
+static GList *
+pagecurl_query_procedures (GimpPlugIn *plug_in)
{
- static GimpParam values[2];
- GimpRunMode run_mode;
- GimpPDBStatusType status = GIMP_PDB_SUCCESS;
- gint32 drawable_id;
+ return g_list_append (NULL, g_strdup (PLUG_IN_PROC));
+}
- run_mode = param[0].data.d_int32;
+static GimpProcedure *
+pagecurl_create_procedure (GimpPlugIn *plug_in,
+ const gchar *name)
+{
+ GimpProcedure *procedure = NULL;
- INIT_I18N ();
- gegl_init (NULL, NULL);
+ if (! strcmp (name, PLUG_IN_PROC))
+ {
+ procedure = gimp_procedure_new (plug_in, name, GIMP_PLUGIN,
+ pagecurl_run, NULL, NULL);
+
+ gimp_procedure_set_image_types (procedure, "RGB*, GRAY*");
+
+ gimp_procedure_set_menu_label (procedure, N_("_Pagecurl..."));
+ gimp_procedure_add_menu_path (procedure, "<Image>/Filters/Distorts");
+
+ gimp_procedure_set_documentation (procedure,
+ N_("Curl up one of the image corners"),
+ "This plug-in creates a pagecurl-effect.",
+ PLUG_IN_PROC);
+ gimp_procedure_set_attribution (procedure,
+ "Federico Mena Quintero and Simon Budig",
+ "Federico Mena Quintero and Simon Budig",
+ PLUG_IN_VERSION);
+
+ gimp_procedure_add_argument (procedure,
+ g_param_spec_enum ("run-mode",
+ "Run mode",
+ "The run mode",
+ GIMP_TYPE_RUN_MODE,
+ GIMP_RUN_NONINTERACTIVE,
+ G_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ gimp_param_spec_image_id ("image",
+ "Image",
+ "The input image",
+ FALSE,
+ G_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ gimp_param_spec_drawable_id ("drawable",
+ "Drawable",
+ "The input drawable",
+ FALSE,
+ G_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ g_param_spec_int ("colors",
+ "Colors",
+ "FG- and BG-Color (0), Current gradient (1), Current
gradient reversed (2)",
+ CURL_COLORS_FG_BG,
+ CURL_COLORS_LAST,
+ CURL_COLORS_FG_BG,
+ G_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ g_param_spec_int ("edge",
+ "Edge",
+ "Edge to curl (1-4, clockwise, starting in the lower
right edge)",
+ CURL_EDGE_LOWER_RIGHT,
+ CURL_EDGE_UPPER_RIGHT,
+ CURL_EDGE_LOWER_RIGHT,
+ G_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ g_param_spec_int ("orientation",
+ "Orientation",
+ "Vertical (0), Horizontal (1)",
+ CURL_ORIENTATION_VERTICAL,
+ CURL_ORIENTATION_HORIZONTAL,
+ CURL_ORIENTATION_VERTICAL,
+ G_PARAM_READWRITE));
+ gimp_procedure_add_argument (procedure,
+ g_param_spec_boolean ("shade",
+ "Shade",
+ "Shade the region under the curl",
+ TRUE,
+ G_PARAM_READWRITE));
+
+ gimp_procedure_add_return_value (procedure,
+ gimp_param_spec_layer_id ("curl-layer",
+ "Curl layer",
+ "The new layer with the curl.",
+ FALSE,
+ G_PARAM_READWRITE));
+ }
- set_default_params ();
+ return procedure;
+}
- /* Possibly retrieve data */
- gimp_get_data (PLUG_IN_PROC, &curl);
+static GimpValueArray *
+pagecurl_run (GimpProcedure *procedure,
+ const GimpValueArray *args,
+ gpointer run_data)
+{
+ GimpValueArray *return_vals = NULL;
+ GimpRunMode run_mode;
+ gint32 drawable_id;
- *nreturn_vals = 2;
- *return_vals = values;
+ INIT_I18N ();
+ gegl_init (NULL, NULL);
- values[0].type = GIMP_PDB_STATUS;
- values[0].data.d_status = status;
- values[1].type = GIMP_PDB_LAYER;
- values[1].data.d_layer = -1;
+ run_mode = g_value_get_enum (gimp_value_array_index (args, 0));
+ image_id = gimp_value_get_image_id (gimp_value_array_index (args, 1));
+ drawable_id = gimp_value_get_drawable_id (gimp_value_array_index (args, 2));
- /* Get the specified drawable */
- drawable_id = param[2].data.d_drawable;
- image_id = param[1].data.d_image;
+ curl.colors = g_value_get_int (gimp_value_array_index (args, 3));
+ curl.edge = g_value_get_int (gimp_value_array_index (args, 4));
+ curl.orientation = g_value_get_int (gimp_value_array_index (args, 5));
+ curl.shade = g_value_get_boolean (gimp_value_array_index (args, 6));
- if ((gimp_drawable_is_rgb (drawable_id) ||
- gimp_drawable_is_gray (drawable_id)) &&
- gimp_drawable_mask_intersect (drawable_id, &sel_x, &sel_y,
- &true_sel_width, &true_sel_height))
+ if (! gimp_drawable_mask_intersect (drawable_id, &sel_x, &sel_y,
+ &true_sel_width, &true_sel_height))
{
- switch (run_mode)
- {
- case GIMP_RUN_INTERACTIVE:
- /* First acquire information with a dialog */
- if (! dialog ())
- return;
- break;
-
- case GIMP_RUN_NONINTERACTIVE:
- /* Make sure all the arguments are there! */
- if (nparams != 7)
- status = GIMP_PDB_CALLING_ERROR;
-
- if (status == GIMP_PDB_SUCCESS)
- {
- curl.colors = CLAMP (param[3].data.d_int32,
- 0, CURL_COLORS_LAST);
- curl.edge = CLAMP (param[4].data.d_int32,
- CURL_EDGE_FIRST, CURL_EDGE_LAST);
- curl.orientation = CLAMP (param[5].data.d_int32,
- 0, CURL_ORIENTATION_LAST);
- curl.shade = param[6].data.d_int32 ? TRUE : FALSE;
- }
- break;
+ return gimp_procedure_new_return_values (procedure, GIMP_PDB_SUCCESS,
+ NULL);
+ }
- case GIMP_RUN_WITH_LAST_VALS:
- break;
+ if (! (gimp_drawable_is_rgb (drawable_id) ||
+ gimp_drawable_is_gray (drawable_id)))
+ {
+ /* Sorry - no indexed/noalpha images */
+ return gimp_procedure_new_return_values (procedure,
+ GIMP_PDB_EXECUTION_ERROR,
+ NULL);
+ }
- default:
- break;
- }
+ switch (run_mode)
+ {
+ case GIMP_RUN_INTERACTIVE:
+ /* Possibly retrieve data */
+ gimp_get_data (PLUG_IN_PROC, &curl);
+
+ /* First acquire information with a dialog */
+ if (! dialog ())
+ return gimp_procedure_new_return_values (procedure,
+ GIMP_PDB_CANCEL,
+ NULL);
+ break;
- if (status == GIMP_PDB_SUCCESS)
- {
- values[1].data.d_layer = page_curl (drawable_id);
+ case GIMP_RUN_NONINTERACTIVE:
+ break;
- if (run_mode != GIMP_RUN_NONINTERACTIVE)
- gimp_displays_flush ();
+ case GIMP_RUN_WITH_LAST_VALS:
+ /* Possibly retrieve data */
+ gimp_get_data (PLUG_IN_PROC, &curl);
+ break;
- if (run_mode == GIMP_RUN_INTERACTIVE)
- gimp_set_data (PLUG_IN_PROC, &curl, sizeof (CurlParams));
- }
+ default:
+ break;
}
- else
- /* Sorry - no indexed/noalpha images */
- status = GIMP_PDB_EXECUTION_ERROR;
- values[0].data.d_status = status;
+ return_vals = gimp_procedure_new_return_values (procedure, GIMP_PDB_SUCCESS,
+ NULL);
+
+ gimp_value_set_layer_id (gimp_value_array_index (return_vals, 1),
+ page_curl (drawable_id));
+
+ if (run_mode != GIMP_RUN_NONINTERACTIVE)
+ gimp_displays_flush ();
+
+ if (run_mode == GIMP_RUN_INTERACTIVE)
+ gimp_set_data (PLUG_IN_PROC, &curl, sizeof (CurlParams));
+
+ return return_vals;
}
/*****************************************************
@@ -362,15 +429,6 @@ inside_circle (gdouble x,
return x * x + y * y <= radius * radius;
}
-static void
-set_default_params (void)
-{
- curl.colors = CURL_COLORS_FG_BG;
- curl.opacity = 1.0;
- curl.shade = TRUE;
- curl.edge = CURL_EDGE_LOWER_RIGHT;
- curl.orientation = CURL_ORIENTATION_VERTICAL;
-}
/********************************************************************/
/* dialog callbacks */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]