[gimp] plug-ins: port sparkle to GimpPlugIn



commit bdbe1ee06ddfad6c860a3234fdb68d0409a49755
Author: Michael Natterer <mitch gimp org>
Date:   Tue Sep 3 22:15:37 2019 +0200

    plug-ins: port sparkle to GimpPlugIn

 plug-ins/common/sparkle.c | 403 +++++++++++++++++++++++++++-------------------
 1 file changed, 234 insertions(+), 169 deletions(-)
---
diff --git a/plug-ins/common/sparkle.c b/plug-ins/common/sparkle.c
index 6c677b0c89..42ab82d88a 100644
--- a/plug-ins/common/sparkle.c
+++ b/plug-ins/common/sparkle.c
@@ -70,63 +70,81 @@ typedef struct
 } SparkleVals;
 
 
-/* Declare local functions.
- */
+typedef struct _Sparkle      Sparkle;
+typedef struct _SparkleClass SparkleClass;
 
-static void      query  (void);
-static void      run    (const gchar      *name,
-                         gint              nparams,
-                         const GimpParam  *param,
-                         gint             *nreturn_vals,
-                         GimpParam       **return_vals);
-
-static gboolean  sparkle_dialog        (GimpDrawable *drawable);
-
-static gint      compute_luminosity    (const guchar *pixel,
-                                        gboolean      gray,
-                                        gboolean      has_alpha);
-static gint      compute_lum_threshold (GimpDrawable *drawable,
-                                        gdouble       percentile);
-static void      sparkle               (GimpDrawable *drawable,
-                                        GimpPreview  *preview);
-static void      sparkle_preview       (GimpDrawable *drawable,
-                                        GimpPreview  *preview);
-static void      fspike                (GeglBuffer   *src_buffer,
-                                        GeglBuffer   *dest_buffer,
-                                        const Babl   *format,
-                                        gint          bytes,
-                                        gint          x1,
-                                        gint          y1,
-                                        gint          x2,
-                                        gint          y2,
-                                        gint          xr,
-                                        gint          yr,
-                                        gdouble       inten,
-                                        gdouble       length,
-                                        gdouble       angle,
-                                        GRand        *gr,
-                                        guchar       *dest_buf);
-static void       rpnt                 (GeglBuffer   *dest_buffer,
-                                        const Babl   *format,
-                                        gint          x1,
-                                        gint          y1,
-                                        gint          x2,
-                                        gint          y2,
-                                        gdouble       xr,
-                                        gdouble       yr,
-                                        gint          bytes,
-                                        gdouble       inten,
-                                        guchar        color[MAX_CHANNELS],
-                                        guchar       *dest_buf);
-
-const GimpPlugInInfo PLUG_IN_INFO =
+struct _Sparkle
 {
-  NULL,  /* init_proc  */
-  NULL,  /* quit_proc  */
-  query, /* query_proc */
-  run,   /* run_proc   */
+  GimpPlugIn parent_instance;
 };
 
+struct _SparkleClass
+{
+  GimpPlugInClass parent_class;
+};
+
+
+#define SPARKLE_TYPE  (sparkle_get_type ())
+#define SPARKLE (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SPARKLE_TYPE, Sparkle))
+
+GType                   sparkle_get_type         (void) G_GNUC_CONST;
+
+static GList          * sparkle_query_procedures (GimpPlugIn           *plug_in);
+static GimpProcedure  * sparkle_create_procedure (GimpPlugIn           *plug_in,
+                                                  const gchar          *name);
+
+static GimpValueArray * sparkle_run              (GimpProcedure        *procedure,
+                                                  GimpRunMode           run_mode,
+                                                  GimpImage            *image,
+                                                  GimpDrawable         *drawable,
+                                                  const GimpValueArray *args,
+                                                  gpointer              run_data);
+
+static gboolean         sparkle_dialog           (GimpDrawable         *drawable);
+
+static gint             compute_luminosity       (const guchar         *pixel,
+                                                  gboolean              gray,
+                                                  gboolean              has_alpha);
+static gint             compute_lum_threshold    (GimpDrawable         *drawable,
+                                                  gdouble               percentile);
+static void             sparkle                  (GimpDrawable         *drawable,
+                                                  GimpPreview          *preview);
+static void             sparkle_preview          (GimpDrawable         *drawable,
+                                                  GimpPreview          *preview);
+static void             fspike                   (GeglBuffer           *src_buffer,
+                                                  GeglBuffer           *dest_buffer,
+                                                  const Babl           *format,
+                                                  gint                  bytes,
+                                                  gint                  x1,
+                                                  gint                  y1,
+                                                  gint                  x2,
+                                                  gint                  y2,
+                                                  gint                  xr,
+                                                  gint                  yr,
+                                                  gdouble               inten,
+                                                  gdouble               length,
+                                                  gdouble               angle,
+                                                  GRand                *gr,
+                                                  guchar               *dest_buf);
+static void             rpnt                     (GeglBuffer           *dest_buffer,
+                                                  const Babl           *format,
+                                                  gint                  x1,
+                                                  gint                  y1,
+                                                  gint                  x2,
+                                                  gint                  y2,
+                                                  gdouble               xr,
+                                                  gdouble               yr,
+                                                  gint                  bytes,
+                                                  gdouble               inten,
+                                                  guchar                color[MAX_CHANNELS],
+                                                  guchar               *dest_buf);
+
+
+G_DEFINE_TYPE (Sparkle, sparkle, GIMP_TYPE_PLUG_IN)
+
+GIMP_MAIN (SPARKLE_TYPE)
+
+
 static SparkleVals svals =
 {
   0.001,   /* luminosity threshold */
@@ -147,150 +165,197 @@ static SparkleVals svals =
 static gint num_sparkles;
 
 
-MAIN ()
-
 static void
-query (void)
+sparkle_class_init (SparkleClass *klass)
 {
-  static const GimpParamDef args[] =
-  {
-    { GIMP_PDB_INT32,    "run-mode",      "The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) }" },
-    { GIMP_PDB_IMAGE,    "image",         "Input image (unused)" },
-    { GIMP_PDB_DRAWABLE, "drawable",      "Input drawable" },
-    { GIMP_PDB_FLOAT,    "lum-threshold", "Luminosity threshold (0.0 - 1.0)" },
-    { GIMP_PDB_FLOAT,    "flare-inten",   "Flare intensity (0.0 - 1.0)" },
-    { GIMP_PDB_INT32,    "spike-len",     "Spike length (in pixels)" },
-    { GIMP_PDB_INT32,    "spike-pts",     "# of spike points" },
-    { GIMP_PDB_INT32,    "spike-angle",   "Spike angle (0-360 degrees, -1: random)" },
-    { GIMP_PDB_FLOAT,    "density",       "Spike density (0.0 - 1.0)" },
-    { GIMP_PDB_FLOAT,    "transparency",  "Transparency (0.0 - 1.0)" },
-    { GIMP_PDB_FLOAT,    "random-hue",    "Random hue (0.0 - 1.0)" },
-    { GIMP_PDB_FLOAT,    "random-saturation",   "Random saturation (0.0 - 1.0)" },
-    { GIMP_PDB_INT32,    "preserve-luminosity", "Preserve luminosity (TRUE/FALSE)" },
-    { GIMP_PDB_INT32,    "inverse",       "Inverse (TRUE/FALSE)" },
-    { GIMP_PDB_INT32,    "border",        "Add border (TRUE/FALSE)" },
-    { GIMP_PDB_INT32,    "color-type",    "Color of sparkles: { NATURAL (0), FOREGROUND (1), BACKGROUND (2) 
}" }
-  };
-
-  gimp_install_procedure (PLUG_IN_PROC,
-                          N_("Turn bright spots into starry sparkles"),
-                          "Uses a percentage based luminoisty threhsold to find "
-                          "candidate pixels for adding some sparkles (spikes). ",
-                          "John Beale, & (ported to GIMP v0.54) Michael "
-                          "J. Hammel & ted to GIMP v1.0) & Seth Burgess & "
-                          "Spencer Kimball",
-                          "John Beale",
-                          "Version 1.27, September 2003",
-                          N_("_Sparkle..."),
-                          "RGB*, GRAY*",
-                          GIMP_PDB_PROC_TYPE_PLUGIN,
-                          G_N_ELEMENTS (args), 0,
-                          args, NULL);
-
-  gimp_plugin_menu_register (PLUG_IN_PROC,
-                             "<Image>/Filters/Light and Shadow/Light");
+  GimpPlugInClass *plug_in_class = GIMP_PLUG_IN_CLASS (klass);
+
+  plug_in_class->query_procedures = sparkle_query_procedures;
+  plug_in_class->create_procedure = sparkle_create_procedure;
 }
 
 static void
-run (const gchar      *name,
-     gint              nparams,
-     const GimpParam  *param,
-     gint             *nreturn_vals,
-     GimpParam       **return_vals)
+sparkle_init (Sparkle *sparkle)
 {
-  static GimpParam   values[1];
-  GimpRunMode        run_mode;
-  GimpDrawable      *drawable;
-  gint32             drawable_ID;
-  GimpPDBStatusType  status = GIMP_PDB_SUCCESS;
-  gint               x, y, w, h;
+}
 
-  INIT_I18N ();
-  gegl_init (NULL, NULL);
+static GList *
+sparkle_query_procedures (GimpPlugIn *plug_in)
+{
+  return g_list_append (NULL, g_strdup (PLUG_IN_PROC));
+}
+
+static GimpProcedure *
+sparkle_create_procedure (GimpPlugIn  *plug_in,
+                          const gchar *name)
+{
+  GimpProcedure *procedure = NULL;
+
+  if (! strcmp (name, PLUG_IN_PROC))
+    {
+      procedure = gimp_image_procedure_new (plug_in, name,
+                                            GIMP_PDB_PROC_TYPE_PLUGIN,
+                                            sparkle_run, NULL, NULL);
+
+      gimp_procedure_set_image_types (procedure, "RGB*, GRAY*");
+
+      gimp_procedure_set_menu_label (procedure, N_("_Sparkle..."));
+      gimp_procedure_add_menu_path (procedure,
+                                    "<Image>/Filters/Light and Shadow/Light");
+
+      gimp_procedure_set_documentation (procedure,
+                                        N_("Turn bright spots into "
+                                           "starry sparkles"),
+                                        "Uses a percentage based luminoisty "
+                                        "threhsold to find candidate pixels "
+                                        "for adding some sparkles (spikes).",
+                                        name);
+      gimp_procedure_set_attribution (procedure,
+                                      "John Beale, & (ported to GIMP v0.54) "
+                                      "Michael J. Hammel & ted to GIMP v1.0) "
+                                      "& Seth Burgess & Spencer Kimball",
+                                      "John Beale",
+                                      "Version 1.27, September 2003");
+
+      GIMP_PROC_ARG_DOUBLE (procedure, "lum-threshold",
+                            "Lum threshold",
+                            "Luminosity threshold",
+                            0.0, 1.0, 0.001,
+                            G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_DOUBLE (procedure, "flare-inten",
+                            "Flare inten",
+                            "Flare intensity",
+                            0.0, 1.0, 0.5,
+                            G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_INT (procedure, "spike-len",
+                         "Spike len",
+                         "Spike length (in pixels)",
+                         1, 1000, 20,
+                         G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_INT (procedure, "spike-points",
+                         "Spike points",
+                         "# of spike points",
+                         1, 1000, 4,
+                         G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_INT (procedure, "spike-angle",
+                         "Spike angle",
+                         "Spike angle (-1: random)",
+                         -1, 360, 15,
+                         G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_DOUBLE (procedure, "density",
+                            "Density",
+                            "Spike density",
+                            0.0, 1.0, 1.0,
+                            G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_DOUBLE (procedure, "transparency",
+                            "Transparency",
+                            "Transparency",
+                            0.0, 1.0, 0.0,
+                            G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_DOUBLE (procedure, "random-hue",
+                            "Random hue",
+                            "Random hue",
+                            0.0, 1.0, 0.0,
+                            G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_DOUBLE (procedure, "random-saturation",
+                            "Random saturation",
+                            "Random saturation",
+                            0.0, 1.0, 0.0,
+                            G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_BOOLEAN (procedure, "preserve-luminosity",
+                             "Preserve luminosity",
+                             "Preserve luminosity",
+                             FALSE,
+                             G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_BOOLEAN (procedure, "inverse",
+                             "Inverse",
+                             "Inverse",
+                             FALSE,
+                             G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_BOOLEAN (procedure, "border",
+                             "Border",
+                             "Add border",
+                             FALSE,
+                             G_PARAM_READWRITE);
+
+      GIMP_PROC_ARG_INT (procedure, "color-type",
+                         "Color type",
+                         "Color of sparkles: { NATURAL (0), "
+                         "FOREGROUND (1), BACKGROUND (2) }",
+                         0, 2, NATURAL,
+                         G_PARAM_READWRITE);
+    }
 
-  *nreturn_vals = 1;
-  *return_vals  = values;
+  return procedure;
+}
 
-  values[0].type          = GIMP_PDB_STATUS;
-  values[0].data.d_status = status;
+static GimpValueArray *
+sparkle_run (GimpProcedure        *procedure,
+             GimpRunMode           run_mode,
+             GimpImage            *image,
+             GimpDrawable         *drawable,
+             const GimpValueArray *args,
+             gpointer              run_data)
+{
+  gint x, y, w, h;
 
-  run_mode    = param[0].data.d_int32;
-  drawable_ID = param[2].data.d_drawable;
-  drawable    = gimp_drawable_get_by_id (drawable_ID);
+  INIT_I18N ();
+  gegl_init (NULL, NULL);
 
   if (! gimp_drawable_mask_intersect (drawable, &x, &y, &w, &h))
     {
       g_message (_("Region selected for filter is empty"));
-      return;
+
+      return gimp_procedure_new_return_values (procedure,
+                                               GIMP_PDB_SUCCESS,
+                                               NULL);
     }
 
   switch (run_mode)
     {
     case GIMP_RUN_INTERACTIVE:
-      /*  Possibly retrieve data  */
       gimp_get_data (PLUG_IN_PROC, &svals);
 
-      /*  First acquire information with a dialog  */
       if (! sparkle_dialog (drawable))
-        return;
+        {
+          return gimp_procedure_new_return_values (procedure,
+                                                   GIMP_PDB_CANCEL,
+                                                   NULL);
+        }
       break;
 
     case GIMP_RUN_NONINTERACTIVE:
-      /*  Make sure all the arguments are there!  */
-      if (nparams != 16)
-        {
-          status = GIMP_PDB_CALLING_ERROR;
-        }
-      else
-        {
-          svals.lum_threshold = param[3].data.d_float;
-          svals.flare_inten = param[4].data.d_float;
-          svals.spike_len = param[5].data.d_int32;
-          svals.spike_pts = param[6].data.d_int32;
-          svals.spike_angle = param[7].data.d_int32;
-          svals.density = param[8].data.d_float;
-          svals.transparency = param[9].data.d_float;
-          svals.random_hue = param[10].data.d_float;
-          svals.random_saturation = param[11].data.d_float;
-          svals.preserve_luminosity = (param[12].data.d_int32) ? TRUE : FALSE;
-          svals.inverse = (param[13].data.d_int32) ? TRUE : FALSE;
-          svals.border = (param[14].data.d_int32) ? TRUE : FALSE;
-          svals.colortype = param[15].data.d_int32;
-
-          if (svals.lum_threshold < 0.0 || svals.lum_threshold > 1.0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.flare_inten < 0.0 || svals.flare_inten > 1.0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.spike_len < 0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.spike_pts < 0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.spike_angle < -1 || svals.spike_angle > 360)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.density < 0.0 || svals.density > 1.0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.transparency < 0.0 || svals.transparency > 1.0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.random_hue < 0.0 || svals.random_hue > 1.0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.random_saturation < 0.0 ||
-               svals.random_saturation > 1.0)
-            status = GIMP_PDB_CALLING_ERROR;
-          else if (svals.colortype < NATURAL || svals.colortype > BACKGROUND)
-            status = GIMP_PDB_CALLING_ERROR;
-        }
+      svals.lum_threshold       = GIMP_VALUES_GET_DOUBLE  (args, 0);
+      svals.flare_inten         = GIMP_VALUES_GET_DOUBLE  (args, 1);
+      svals.spike_len           = GIMP_VALUES_GET_INT     (args, 2);
+      svals.spike_pts           = GIMP_VALUES_GET_INT     (args, 3);
+      svals.spike_angle         = GIMP_VALUES_GET_INT     (args, 4);
+      svals.density             = GIMP_VALUES_GET_DOUBLE  (args, 5);
+      svals.transparency        = GIMP_VALUES_GET_DOUBLE  (args, 6);
+      svals.random_hue          = GIMP_VALUES_GET_DOUBLE  (args, 7);
+      svals.random_saturation   = GIMP_VALUES_GET_DOUBLE  (args, 8);
+      svals.preserve_luminosity = GIMP_VALUES_GET_BOOLEAN (args, 9);
+      svals.inverse             = GIMP_VALUES_GET_BOOLEAN (args, 10);
+      svals.border              = GIMP_VALUES_GET_BOOLEAN (args, 11);
+      svals.colortype           = GIMP_VALUES_GET_INT     (args, 12);
       break;
 
     case GIMP_RUN_WITH_LAST_VALS:
-      /*  Possibly retrieve data  */
       gimp_get_data (PLUG_IN_PROC, &svals);
       break;
-
-    default:
-      break;
     }
 
-  /*  Make sure that the drawable is gray or RGB color  */
   if (gimp_drawable_is_rgb (drawable) ||
       gimp_drawable_is_gray (drawable))
     {
@@ -301,17 +366,17 @@ run (const gchar      *name,
       if (run_mode != GIMP_RUN_NONINTERACTIVE)
         gimp_displays_flush ();
 
-      /*  Store mvals data  */
       if (run_mode == GIMP_RUN_INTERACTIVE)
         gimp_set_data (PLUG_IN_PROC, &svals, sizeof (SparkleVals));
     }
   else
     {
-      /* gimp_message ("sparkle: cannot operate on indexed color images"); */
-      status = GIMP_PDB_EXECUTION_ERROR;
+      return gimp_procedure_new_return_values (procedure,
+                                               GIMP_PDB_EXECUTION_ERROR,
+                                               NULL);
     }
 
-  values[0].data.d_status = status;
+  return gimp_procedure_new_return_values (procedure, GIMP_PDB_SUCCESS, NULL);
 }
 
 static gboolean


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]