Blitz+ 2D Alpha Blend

Miscellaneous Forums/Blitz Showcase/Blitz+ 2D Alpha Blend

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

I wanted to convert the alpha16() function found in a DLL to Blitz code. Here it is the original C function:

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.