Re: [Gimp-developer] automatic gimp-levels

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

 



Hi again,

I've noticed that the new procedure gimp-levels-auto I've added
does not yield exactly the same effect of the Auto button in the
levels dialog.  So, here is the revised patch to the GIMP 1.2.1
source tree.

BTW, I'd like to know if the patch is likely to be integrated
into the GIMP.  If it is not, I'd need to write an plug-in
instead of a patch to the GIMP itself, since a plug-in is much
more useful from user's point of view.  Could you please tell
me the likelihood?

Thanks,

-- 
KAJIYAMA, Tamito <kajiyama@xxxxxxxxxxxxxxxxxxxxxxxx>

diff -ru gimp-1.2.1.orig/tools/pdbgen/pdb/color.pdb gimp-1.2.1/tools/pdbgen/pdb/color.pdb
--- gimp-1.2.1.orig/tools/pdbgen/pdb/color.pdb	Mon Dec 25 01:40:47 2000
+++ gimp-1.2.1/tools/pdbgen/pdb/color.pdb	Thu Mar 22 10:33:29 2001
@@ -175,6 +175,137 @@
     }
 }
 
+sub levels_auto {
+    $blurb = 'Modifies intensity levels in the specified drawable.';
+
+    $help = <<'HELP';
+This tool automatically adjusts intensity levels in the specified
+drawable. This tool is only valid on RGB color and grayscale
+images. It will not operate on indexed drawables.
+HELP
+
+    &std_pdb_misc;
+
+    @inargs = (
+	&drawable_arg
+    );
+
+    %invoke = (
+	vars => [ 'PixelRegion srcPR, destPR', 'int x1, y1, x2, y2',
+		  'GimpLut *lut', 'int i, j',
+		  'int low_input[5]',
+		  'int high_input[5]',
+		  'int low_output[5]',
+		  'int high_output[5]',
+		  'double gamma[5]',
+		  'int channel, channels[3], nchannels',
+		  'GimpHistogram *hist',
+		  'double count, new_count, percentage, next_percentage'],
+	code => <<'CODE'
+{
+  if (gimp_drawable_is_indexed (drawable))
+    success = FALSE;
+  else
+    {
+      for (i = 0; i < 5; i++)
+	{
+	  low_input[i] = 0;
+	  high_input[i] = 255;
+	  low_output[i] = 0;
+	  high_output[i] = 255;
+	  gamma[i] = 1.0;
+	}
+
+      hist = gimp_histogram_new ();
+      gimp_histogram_calculate_drawable (hist, drawable);
+
+      if (gimp_drawable_is_rgb (drawable))
+	{
+	  nchannels = 3;
+	  channels[0] = RED_LUT;
+	  channels[1] = GREEN_LUT;
+	  channels[2] = BLUE_LUT;
+	}
+      else
+	{
+	  nchannels = 1;
+	  channels[0] = GRAY_LUT;
+	}
+      for (j = 0; j < nchannels; j++)
+	{
+	  channel = channels[j];
+  
+	  count = gimp_histogram_get_count (hist, 0, 255);
+  
+	  if (count == 0.0)
+	    {
+	      low_input[channel] = 0;
+	      high_input[channel] = 0;
+	    }
+	  else
+	    {
+	      /* set the low input */
+	      new_count = 0.0;
+	      for (i = 0; i < 255; i++)
+		{
+		  new_count += gimp_histogram_get_value(hist, channel, i);
+		  percentage = new_count / count;
+		  next_percentage =
+		    (new_count + gimp_histogram_get_value (hist, channel,
+							   i + 1)) / count;
+		  if (fabs (percentage - 0.006) <
+		      fabs (next_percentage - 0.006))
+		    {
+		      low_input[channel] = i + 1;
+		      break;
+		    }
+		}
+	      /* set the high input */
+	      new_count = 0.0;
+	      for (i = 255; i > 0; i--)
+		{
+		  new_count += gimp_histogram_get_value(hist, channel, i);
+		  percentage = new_count / count;
+		  next_percentage =
+		    (new_count + gimp_histogram_get_value (hist, channel,
+							   i - 1)) / count;
+		  if (fabs (percentage - 0.006) <
+		      fabs (next_percentage - 0.006))
+		    {
+		      high_input[channel] = i - 1;
+		      break;
+		    }
+		}
+	    }
+	}
+  
+      gimp_histogram_free (hist);
+  
+      /* setup the lut */
+      lut = levels_lut_new (gamma, low_input, high_input,
+			    low_output, high_output,
+			    gimp_drawable_bytes (drawable));
+  
+      /* The application should occur only within selection bounds */
+      gimp_drawable_mask_bounds (drawable, &x1, &y1, &x2, &y2);
+  
+      pixel_region_init (&srcPR, gimp_drawable_data (drawable),
+			 x1, y1, (x2 - x1), (y2 - y1), FALSE);
+      pixel_region_init (&destPR, gimp_drawable_shadow (drawable),
+			 x1, y1, (x2 - x1), (y2 - y1), TRUE);
+  
+      pixel_regions_process_parallel ((p_func) gimp_lut_process, lut, 2,
+				      &srcPR, &destPR);
+  
+      gimp_lut_free(lut);
+      gimp_drawable_merge_shadow (drawable, TRUE);
+      drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1));
+    }
+}
+CODE
+    );
+}
+
 sub posterize {
     $blurb = 'Posterize the specified drawable.';
 
@@ -761,9 +892,9 @@
     );
 }
 
-@headers = qw("gimpimage.h" "gimpdrawable.h" "gimplut.h" "lut_funcs.h");
+@headers = qw("gimpimage.h" "gimpdrawable.h" "gimplut.h" "lut_funcs.h" "libgimp/gimpmath.h");
 
-@procs = qw(brightness_contrast levels posterize desaturate equalize invert
+@procs = qw(brightness_contrast levels levels_auto posterize desaturate equalize invert
 	    curves_spline curves_explicit color_balance histogram
 	    hue_saturation threshold);
 %exports = (app => [@procs], lib => [@procs]);






[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