1. Re: BitBlt
- Posted by Robert Craig <rds at EMAIL.MSN.COM> Nov 02, 1998
- 431 views
I sped up David Cuny's bitBlt(). I know he offered it as a generic, unoptimized example, but I wanted to see how much faster I could make it go. I managed to speed it up by a factor of 7.3 on the example below, which copies a 20x20 image from a 100x100 image into another 100x100 image. The main trick was to use slices instead of an inner for-loop. ------- Cuny's reworked code follows... -- I put together a generic blitter (included), but it's obviously slow. WinMan -- was based on an optimized version of this blitter, that understood 0 in the -- argument to be a screen, and handled clipping better. However, this version -- *is* generic. -- I'd love to see a generic blitter added to the core Euphoria routines. -- David Cuny -- generic bit blitter global constant CopyROP = 1, -- dst = src OrROP = 2, -- dst = dst OR src XorROP = 3, -- dst = dst XOR src EraseROP = 4, -- dst = (NOT src) AND dst NotCopyROP = 5, -- dst = NOT src NotOrROP = 6, -- dst = (NOT src) OR dst NotXorROP = 7, -- dst = (NOT src) XOR dst NotEraseROP = 8, -- dst = src AND dst NotROP = 9 -- dst = NOT dst function opPixels( integer rop, object src, object dst ) if rop = CopyROP then return src elsif rop = OrROP then return or_bits(dst, src) elsif rop = XorROP then return xor_bits(dst, src) elsif rop = EraseROP then return and_bits( not(src), dst) elsif rop = NotCopyROP then return not(src) elsif rop = NotOrROP then return or_bits(not(src), dst) elsif rop = NotXorROP then return xor_bits(not(src), dst) elsif rop = NotEraseROP then return and_bits(src, dst) elsif rop = NotROP then return not(dst) end if -- error: unspecified rop code end function global function bitBlt( sequence dst, integer dx, integer dy, sequence src, integer sx, integer sy, integer sw, integer sh, integer rop ) -- this function copies a block of pixels from one bitmap to -- another. bitBlt means bit block transfer. -- arguments: -- -- dst the device to copy to -- dx, dy the position to copy to -- src the device to copy from -- sx, sy the position to copy from -- sw, sh the width and height of the block to be copied -- rop raster operation to be used when doing copying -- -- this can obviously be specialized to operate *much* faster integer dx2, sx2, dyy -- avoid lots of -1's in the calculations dy = dy - sy sw = sw - 1 dx2 = dx+sw sx2 = sx+sw for y = sy to sy+sh-1 do dyy = dy+y dst[dyy][dx..dx2] = opPixels( rop, src[y][sx..sx2], dst[dyy][dx..dx2] ) end for return dst end function -- timing test: copy 20x20 image -- from a 100x100 to another 100x100 sequence source, dest, dest2 source = repeat(repeat(0, 100),100) source[17][16..20] = 4 source[20][16..20] = 7 dest = source * 0 atom t t = time() for i = 1 to 10000 do dest2 = bitBlt(dest, 81, 81, source, 1, 1, 20,20,CopyROP) end for t = time() - t ? dest2 ? t Regards, Rob Craig Rapid Deployment Software http://members.aol.com/FilesEu/