On Thu, Jul 04, 2002 at 03:31:46PM +0200, Simon Budig wrote:
>
> I should have read the code before posting my last message:
> 
> Dr William Bland ([EMAIL PROTECTED]) wrote:
> > I thought about using some kind of "double tile iterator" to do this, e.g:
> > 
> >   gimp_pixel_rgn_init (&image_rgn, image_drawable,
> >                     x1, y1, (x2 - x1), (y2 - y1), TRUE, TRUE);
> >   gimp_pixel_rgn_init (&select_rgn, select_drawable,
> >                     x1, y1, (x2 - x1), (y2 - y1), TRUE, TRUE);
> >   for (p1 = gimp_pixel_rgns_register (1, &image_rgn),
> >      p2 = gimp_pixel_rgns_register (1, &select_rgn);
> >        (p1 != NULL) && (p2 != NULL);
> >        p1 = gimp_pixel_rgns_process (p1),
> >      p2 = gimp_pixel_rgns_process (p2))
> 
> this better should be
>     p1 = gimp_pixel_rgns_register (2, &image_rgn, &select_rgn);
>     p1 != NULL;
>     p1 = gimp_pixel_rgns_process (p1)
> 
> >     {
> >     /* Interesting stuff goes in here!            */
> >     /* Set some of the pixels in select_drawable  */
> >     /* depending on the pixels in image_drawable. */
> >     }
> 
> Then the core will care about the stuff I mentioned in the other mail.

Hi Simon,
        Thanks!  That looks much nicer.  Unfortunately I can't get it to
work properly (sorry, like I said, I'm a newbie at this ;-).  I now have
the following code:

static void
do_stuff (GimpDrawable *image_drawable, GimpDrawable *select_drawable)
{
  GimpPixelRgn image_rgn, select_rgn;
  gint x1=0, y1=0, x2=select_drawable->width, y2=select_drawable->height;
  guchar *image_data = NULL, *select_data;
  gint i;
  gint image_bytes = image_drawable->bpp, select_bytes = select_drawable->bpp;
  gint size;
  gpointer pr;

  gimp_pixel_rgn_init (&image_rgn, image_drawable, x1, y1,
                        (x2 - x1), (y2 - y1), TRUE, TRUE);
  gimp_pixel_rgn_init (&select_rgn, select_drawable, x1, y1,
                        (x2 - x1), (y2 - y1), TRUE, TRUE);
  for ( pr = gimp_pixel_rgns_register (2, &select_rgn, &image_rgn);
        pr != NULL;
        pr = gimp_pixel_rgns_process (pr))
    {
      size = select_rgn.w * select_rgn.h;
      select_data = select_rgn.data;

      while (size--)
        {
          for (i=0; i<select_bytes; i++)
            *select_data++ = 255*(size%2);
        }
    }
  /*  merge the shadow, update the drawable  */
  gimp_drawable_flush (select_drawable);
  gimp_drawable_merge_shadow (select_drawable->id, TRUE);
  gimp_drawable_update (select_drawable->id, x1, y1, (x2 - x1), (y2 - y1));
}


Note that I'm not yet actually *doing* anything with the data in
image_rgn, only select_rgn.  Now if I start gimp, create a blank 256*256
image, select everything and then run my plugin, I get:
        http://www.abstractnonsense.com/double.png
which is clearly not right!  Some of the pixels are correct, but there is
clearly some random fluff in there as well.
If I change the iterator to a single one, so that it reads
  for ( pr = gimp_pixel_rgns_register (1, &select_rgn);
then I get:
        http://www.abstractnonsense.com/single.png
which is correct but doesn't help since I will be needing the double
iterator soon.


Any ideas what's going on here?  Thanks again for your help.
Best wishes,
                Bill.
_______________________________________________
Gimp-developer mailing list
[EMAIL PROTECTED]
http://lists.xcf.berkeley.edu/mailman/listinfo/gimp-developer

Reply via email to