2D ALPHA

BlitzPlus Forums/BlitzPlus Programming/2D ALPHA

Baley(Posted 2004) [#1]
Some time ago I saw a nice sample code to make an alpha effect with B+ , using a DLL (blend.dll) . It's fast, but is it possible to make it work with an image that has a mask ? In the sample, it is used a square.. if I need a circle, I must to mask a part of it, using MaskImage() . But it seems it doesn't care of mask colour. Any hints? Thank you.


MrCredo(Posted 2004) [#2]
you must rewrite my DLL (source is included) - use DevCpp (older version is better)

but i think this is faster:
1.) blend image+background to tmp-image
2.) use black/white shape and draw this masked to tmp-image
3.) draw tmp-image to background


Baley(Posted 2004) [#3]
Thank you. Where can I find your DLL ? I know C/C++ and I could modify it.

Please may you explain better better 1)2)3) steps ?


MrCredo(Posted 2004) [#4]
http://www.blitzbasic.com/toolbox/toolbox.php?tool=38


1) load normal image and a second blask/white shape (=2 images)

2) copy background to tmp-image and blend normal image to tmp-image

3) draw black/white shape to tmp-image (now you have your blended and masked image)

4) draw tmp-image to background

if you can c++ than modify my dll - i think it is easier (but i think not faster)


Snarty(Posted 2004) [#5]
This is the code based on 24/32bit source and destination, feel free to play. :)

		dest_bpp=dest_format;

		for(src_Y=src_Ystart, src_Yoff=src_Ystart*src_pitch, dest_Yoff=y*dest_pitch;
		src_Y<src_Yend;
		src_Y++, src_Yoff+=src_pitch, dest_Yoff+=dest_pitch){

			for(src_X=src_Xstart, src_Xoff=src_Yoff+(src_Xstart*src_bpp), dest_Xoff=dest_Yoff+(x*dest_bpp); 
			src_X<src_Xend; 
			src_Xoff+=src_bpp, dest_Xoff+=dest_bpp, src_X++){

				checkalpha=src_buffer[src_Xoff];

				if(src_alpha>0 && src_alpha<256){
					checkalpha=256-checkalpha;
					dest_buffer[dest_Xoff+2]=((dest_alpha * dest_buffer[dest_Xoff+2]) + (src_alpha * src_buffer[src_Xoff+2])) >> 8;
					dest_buffer[dest_Xoff+1]=((dest_alpha * dest_buffer[dest_Xoff+1]) + (src_alpha * src_buffer[src_Xoff+1])) >> 8;
					dest_buffer[dest_Xoff]=((dest_alpha * dest_buffer[dest_Xoff]) + (src_alpha * src_buffer[src_Xoff])) >> 8;
				}
				else if(src_alpha=0){
					dest_buffer[dest_Xoff+2]=src_buffer[src_Xoff+2];
					dest_buffer[dest_Xoff+1]=src_buffer[src_Xoff+1];
					dest_buffer[dest_Xoff]=src_buffer[src_Xoff];
				}
			}

		}
		break;



Snarty(Posted 2004) [#6]
Oh, if you didn't notice checkalpha is a dummy call since I was testing how much impact reading an alpha channel would cause.