[Gimp-developer] Trivial patch to create Erode & Dilate menu items

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

 



Hi all,

I've attached a pretty trivial patch which creates Erode and
Dilate menu items. These are basically the vpropagate plug-in
called with default values. This stems from me spending about an
hour looking for this functionality today and not finding it.

Eventually someone told me "Those are the more white/black
functions in value propagate", which seemed a little obscure for
what I reckon are fairly basic functions. So I did this.

People may think it's useless, so I'll mail it here and let
people decide whether it's useless enough to get dumped. :)

Cheers,
Dave.

-- 
David Neary,               E-Mail dave.neary@xxxxxxxxxx
Palamon Technologies Ltd.  Phone +353-1-634-5059      

Index: plug-ins/common/vpropagate.c
===================================================================
RCS file: /cvs/gnome/gimp/plug-ins/common/vpropagate.c,v
retrieving revision 1.26
diff -u -r1.26 vpropagate.c
--- plug-ins/common/vpropagate.c	2001/11/29 13:23:38	1.26
+++ plug-ins/common/vpropagate.c	2001/12/05 18:18:10
@@ -41,8 +41,11 @@
 #include "libgimp/stdplugins-intl.h"
 
 
-#define	PLUG_IN_NAME	"plug_in_vpropagate"
+#define	DEFAULT_PLUG_IN_NAME	"plug_in_vpropagate"
+#define PLUG_IN_IMAGE_TYPES "RGB*, GRAY*"
 #define SHORT_NAME	"vpropagate"
+#define ERODE_PLUG_IN_NAME "plug_in_erode"
+#define DILATE_PLUG_IN_NAME "plug_in_dilate"
 
 
 #define	VP_RGB	        (1 << 0)
@@ -209,17 +212,41 @@
   };
   static gint nargs = sizeof (args) / sizeof (args[0]);
 
-  gimp_install_procedure (PLUG_IN_NAME,
+  gimp_install_procedure (DEFAULT_PLUG_IN_NAME,
 			  "Propagate values of the layer",
 			  "Propagate values of the layer",
 			  "Shuji Narazaki (narazaki@xxxxxxxxxxx)",
 			  "Shuji Narazaki",
 			  "1996-1997",
 			  N_("<Image>/Filters/Distorts/Value Propagate..."),
-			  "RGB*,GRAY*",
+			  PLUG_IN_IMAGE_TYPES,
 			  GIMP_PLUGIN,
 			  nargs, 0,
 			  args, NULL);
+
+  gimp_install_procedure (ERODE_PLUG_IN_NAME,
+			  "Erode image",
+			  "Erode image",
+			  "Shuji Narazaki (narazaki@xxxxxxxxxxx)",
+			  "Shuji Narazaki",
+			  "1996-1997",
+			  N_("<Image>/Filters/Generic/Erode..."),
+			  PLUG_IN_IMAGE_TYPES,
+			  GIMP_PLUGIN,
+			  nargs, 0,
+			  args, NULL);
+
+  gimp_install_procedure (DILATE_PLUG_IN_NAME,
+			  "Dilate image",
+			  "Dilate image",
+			  "Shuji Narazaki (narazaki@xxxxxxxxxxx)",
+			  "Shuji Narazaki",
+			  "1996-1997",
+			  N_("<Image>/Filters/Generic/Dilate..."),
+			  PLUG_IN_IMAGE_TYPES,
+			  GIMP_PLUGIN,
+			  nargs, 0,
+			  args, NULL);
 }
 
 static void
@@ -245,43 +272,82 @@
   switch (run_mode)
     {
     case GIMP_RUN_INTERACTIVE:
-      INIT_I18N_UI();
-      gimp_get_data (PLUG_IN_NAME, &vpvals);
-      /* building the values of dialog variables from vpvals. */
-      propagate_alpha =
-	(vpvals.propagating_channel & PROPAGATING_ALPHA) ? TRUE : FALSE;
-      propagate_value =
-	(vpvals.propagating_channel & PROPAGATING_VALUE) ? TRUE : FALSE;
-      {
-	int	i;
-	for (i = 0; i < 4; i++)
-	  direction_mask_vec[i] = (vpvals.direction_mask & (1 << i))
-	    ? TRUE : FALSE;
-      }
-      if (! vpropagate_dialog (gimp_drawable_type(drawable_id)))
-	return;
+      if (strcmp (name, DEFAULT_PLUG_IN_NAME) == 0)
+	{
+	  INIT_I18N_UI();
+	  gimp_get_data (DEFAULT_PLUG_IN_NAME, &vpvals);
+	  /* building the values of dialog variables from vpvals. */
+	  propagate_alpha =
+	    (vpvals.propagating_channel & PROPAGATING_ALPHA) ? TRUE : FALSE;
+	  propagate_value =
+	    (vpvals.propagating_channel & PROPAGATING_VALUE) ? TRUE : FALSE;
+	  {
+	    int	i;
+	    for (i = 0; i < 4; i++)
+	      direction_mask_vec[i] = (vpvals.direction_mask & (1 << i))
+		? TRUE : FALSE;
+	  }
+	  if (! vpropagate_dialog (gimp_drawable_type(drawable_id)))
+	    return;
+	}
+      else if (strcmp (name, ERODE_PLUG_IN_NAME) == 0 || 
+	       strcmp (name, DILATE_PLUG_IN_NAME) == 0)
+	{
+	  INIT_I18N();
+	  vpvals.propagating_channel = PROPAGATING_VALUE;
+	  vpvals.propagating_rate = 1.0;
+	  vpvals.direction_mask = 15;
+	  vpvals.lower_limit = 0;
+	  vpvals.upper_limit = 255;
+
+	  if(strcmp(name, ERODE_PLUG_IN_NAME) == 0)
+	    vpvals.propagate_mode = 0;
+	  else if(strcmp(name, DILATE_PLUG_IN_NAME) == 0)
+	    vpvals.propagate_mode = 1;
+	}
       break;
     case GIMP_RUN_NONINTERACTIVE:
       INIT_I18N();
-      vpvals.propagate_mode = param[3].data.d_int32;
-      vpvals.propagating_channel = param[4].data.d_int32;
-      vpvals.propagating_rate = param[5].data.d_float;
-      vpvals.direction_mask = param[6].data.d_int32;
-      vpvals.lower_limit = param[7].data.d_int32;
-      vpvals.upper_limit = param[8].data.d_int32;
+
+      if (strcmp (name, DEFAULT_PLUG_IN_NAME) == 0)
+	{
+	  vpvals.propagate_mode = param[3].data.d_int32;
+	  vpvals.propagating_channel = param[4].data.d_int32;
+	  vpvals.propagating_rate = param[5].data.d_float;
+	  vpvals.direction_mask = param[6].data.d_int32;
+	  vpvals.lower_limit = param[7].data.d_int32;
+	  vpvals.upper_limit = param[8].data.d_int32;
+	}
+      else if (strcmp (name, ERODE_PLUG_IN_NAME) == 0 || 
+	       strcmp (name, DILATE_PLUG_IN_NAME) == 0)
+	{
+	  INIT_I18N();
+	  vpvals.propagating_channel = PROPAGATING_VALUE;
+	  vpvals.propagating_rate = 1.0;
+	  vpvals.direction_mask = 15;
+	  vpvals.lower_limit = 0;
+	  vpvals.upper_limit = 255;
+
+	  if(strcmp(name, ERODE_PLUG_IN_NAME) == 0)
+	    vpvals.propagate_mode = 0;
+	  else if(strcmp(name, DILATE_PLUG_IN_NAME) == 0)
+	    vpvals.propagate_mode = 1;
+	}
       break;
     case GIMP_RUN_WITH_LAST_VALS:
       INIT_I18N();
-      gimp_get_data (PLUG_IN_NAME, &vpvals);
+      gimp_get_data (DEFAULT_PLUG_IN_NAME, &vpvals);
       break;
     }
   
   status = value_propagate (drawable_id);
 
-  if (run_mode != GIMP_RUN_NONINTERACTIVE)
+  if (run_mode != GIMP_RUN_NONINTERACTIVE || 
+      strcmp(name, DEFAULT_PLUG_IN_NAME) != 0)
     gimp_displays_flush();
-  if (run_mode == GIMP_RUN_INTERACTIVE && status == GIMP_PDB_SUCCESS)
-    gimp_set_data (PLUG_IN_NAME, &vpvals, sizeof (VPValueType));
+  if (run_mode == GIMP_RUN_INTERACTIVE && status == GIMP_PDB_SUCCESS 
+      && strcmp(name, DEFAULT_PLUG_IN_NAME) != 0)
+    gimp_set_data (DEFAULT_PLUG_IN_NAME, &vpvals, sizeof (VPValueType));
 
   values[0].type = GIMP_PDB_STATUS;
   values[0].data.d_status = status;

[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux