I wanted to convert the alpha16() function found in a DLL to Blitz code. Here it is the original C function:
I've translated it to Blitz code, but it doesn't work properly. Do you know what's wrong with this ?
Thanks for any hint.
BBDECL int BBCALL alpha16(short buffer1[], int width1, int height1, int pitch1, short buffer2[], int width2, int height2, int pitch2, short buffer3[], int px, int py, int mode, int alpha1) { int alpha2=255-alpha1; int offset1; int offset2; int x; int y; int rgb1; int r1; int g1; int b1; int rgb2; int r2; int g2; int b2; int r3; int g3; int b3; int startx=0; int starty=0; int endx=width2-1; int endy=height2-1; if (px<0) startx=0-px; if (py<0) starty=0-py; if (px+width2>width1) endx=width1-px; if (py+height2>height1) endy=height1-py; pitch1=pitch1/2; pitch2=pitch2/2; for(y=starty; y<=endy; y++) { offset1=(y+py)*pitch1+(startx+px)-1; offset2=y*pitch2+startx-1; for(x=startx; x<=endx; x++) { offset1++; offset2++; rgb1=buffer1[offset1]; r1=((rgb1 >> 11) & 31); g1=((rgb1 >> 5) & 63); b1=(rgb1 & 31); rgb2=buffer2[offset2]; r2=((rgb2 >> 11) & 31); g2=((rgb2 >> 5) & 63); b2=(rgb2 & 31); r3=(r1*alpha1)/255 + (r2*alpha2)/255; g3=(g1*alpha1)/255 + (g2*alpha2)/255; b3=(b1*alpha1)/255 + (b2*alpha2)/255; if (mode==1) buffer3[offset1]=(r3 << 11) + (g3 << 5) + b3; else buffer3[offset2]=(r3 << 11) + (g3 << 5) + b3; }; }; return 1; }
I've translated it to Blitz code, but it doesn't work properly. Do you know what's wrong with this ?
Function balpha16(buffer1,width1,height1,pitch1,buffer2,width2,height2,pitch2,buffer3,px,py,mode,alpha1) ;BBDECL Int BBCALL alpha16(short buffer1[], Int width1, Int height1, Int pitch1, short buffer2[], Int width2, Int height2, Int pitch2, short buffer3[], Int px, Int py, Int mode, Int alpha1) alpha2=255-alpha1 startx=0 starty=0 endx=width2-1 endy=height2-1 If px<0 Then startx=0-px If py<0 Then starty=0-py If px+width2>width1 Then endx=width1-px If py+height2>height1 Then endy=height1-py pitch1=pitch1/2 pitch2=pitch2/2 For y=starty To endy offset1=(y+py)*pitch1+(startx+px)-1 offset2=y*pitch2+startx-1 For x=startx To endx offset1=offset1+1 offset2=offset2+1 rgb1=PeekShort(buffer1,offset1) ;rgb1=buffer1[offset1] r1=((rgb1 Shr 11) And 31) g1=((rgb1 Shr 5) And 63); b1=(rgb1 And 31) rgb2=PeekShort(buffer2,offset2) ;rgb2=buffer2[offset2]; r2=((rgb2 Shr 11) And 31) g2=((rgb2 Shr 5) And 63) b2=(rgb2 And 31) r3=(r1*alpha1)/255 + (r2*alpha2)/255 g3=(g1*alpha1)/255 + (g2*alpha2)/255 b3=(b1*alpha1)/255 + (b2*alpha2)/255 If mode=1 PokeShort(buffer3,offset1,(r3 Shl 11) + (g3 Shl 5) + b3) ;buffer3[offset1]=(r3 << 11) + (g3 << 5) + b3; Else PokeShort(buffer3,offset2,(r3 Shl 11) + (g3 Shl 5) + b3) ;buffer3[offset2]=(r3 << 11) + (g3 << 5) + b3; EndIf Next Next Return 1 End Function
Thanks for any hint.