On Thursday, 5 Apr 2001, Georg Acher wrote:

> I just looked into bumpmap.c and tried to figure out if it can profit from
> blocking and played a bit with the code. It seems that there is some major
> (performance) problem with the gimp_pixel_rgn_get/set_row-calls in Gimp
> 1.2.1.
> 
> The original bumpmap took for my 1400*1400 image about 30s, when I commented
> out one of the gimp_pixel_rgn_get/set_row() that access the source or the
> destination image, the whole stuff took only about 2.4s, while the
> calculations were still done! 
> 
> I experimented a bit, and found out, that apparently the "switch" between
> get and set seems to be the problem. I changed the code to get 32 rows,
> calculate them and the write the 32 back. It took only 3s overall, the
> resulting image is the same as with the 30s boiling time. 

Have a look at the gimp_pixel_rgns_register() and
gimp_pixel_rgns_process() functions.  They do similar blocking on a
per-tile basis.

Most plugins should be using them, but ones with more complex access
patterns (eg accessing pixels across tile boundaries) probably won't.'

Typical use is something like this:


gimp_drawable_mask_bounds (drawable->id, &x1, &y1, &x2, &y2);

for (y = y1; y < y2; y += tile_width - (y % tile_width))
{
    for (x = x1; x < x2; x += tile_width - (x % tile_width))
    {
        /* process the image in tile-sized regions */
        for (pr = gimp_pixel_rgns_register (2, &src_rgn, &dest_rgn);
             pr != NULL;
             pr = gimp_pixel_rgns_process (pr))
        {
            src_row  = src_rgn.data;
            dest_row = dest_rgn.data;

            for (row = 0; row < src_rgn.h; row++)
            {
                src  = src_row;
                dest = dest_row;

                for (col = 0; col < src_rgn.w; col++)
                {

                    /* do stuff with src[0..bpp] and dest[0..bpp] */

                    src  += src_rgn.bpp;
                    dest += dest_rgn.bpp;
                }

                src_row  += src_rgn.rowstride;
                dest_row += dest_rgn.rowstride;
            }
        }
    }
}

Of course this precise form will only work where there's a one-to-one
correspondence between input and output pixels.  I suspect whirl-pinch
has more complex access patterns, in which case you'll need to be more
creative with the loop structure.

Austin
_______________________________________________
Gimp-developer mailing list
[EMAIL PROTECTED]
http://lists.xcf.berkeley.edu/mailman/listinfo/gimp-developer

Reply via email to