Re: [Gimp-developer] automatic gimp-levels

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

 



Well, 1.2.x is for bugfixes to 1.2, so the question is
whether its considered a bug.  I'm inclined to
consider it one, but I'm not really doing much in the
way of maintaining the 1.2 branch.  Yosh, Sven?

Seth

--- Tamito KAJIYAMA
<kajiyama@xxxxxxxxxxxxxxxxxxxxxxxx> wrote:
> 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
> 
=== message truncated ===


__________________________________________________
Do You Yahoo!?
Get email at your own domain with Yahoo! Mail. 
http://personal.mail.yahoo.com/


[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