I am working on a wince game and want to do some fadein/out works on a vga screen. I use alphablt in IDirectDrawSurface, but it only support a constant 50% alpha. When I blt a 320x240 image on a 480x640 screen, alphablt give me about 12 fps plus filling a backbuffer black , blt another 320x240 image and blt to primary surface. I found a table look method while googling and doing the same thing on device. It can only achieve 8 fps. If pixel is cliped when out of screen, the speed increase. About 20 fps if only draw 1/10 of the image on screen.
The numbers is reading from A HTC Touch Pro. A pretty slow device.

The following function is what I am using to blend the pixel on a back screen surface to another back screen surface. Any ideas how can I improve this function to as fast as the alphablt one in Directdraw?? It seems arm can do something better then x86 tricks, most operation can done in one cycle include mul.

procedure TDirectDrawSurface.drawAlpha(x, y: integer;
 SrcSurface: TDirectDrawSurface;  alpha: integer
 );
var
  SourceTable,DestTable : LookUpLevel;
  SourceTableG,DestTableG : LookUpLevelG;
  DDSURFACEinfoSrc,DDSURFACEinfoDEST : TDDSURFACEDESC;
  SRCbuffer,DESTbuffer,SrcColor,DestColor : ^ushort;
  nPitchDest,nPitchSrc : ushort;
  i,j,xEnd,yEnd,DestLinePos,SrcLinePos, DestWidth, DestHeight,
  SrcWidth,SrcHeight:integer;

  function PackColor(R,G,B : byte) : ushort; inline;
  begin
    result :=  r shl 11 + g shl 5 + b;
  end;

  function UnpackColorR(color : ushort;RBitMask : DWORD) : byte; inline;
  begin
       result := color and RBitMask shr 11;
  end;
  function UnpackColorG(color : ushort;GBitMask : DWORD) : byte; inline;
  begin
       result := color and GBitMask shr 5;
  end;
  function UnpackColorB(color : ushort;BBitMask : DWORD) : byte; inline;
  begin
       result := color and BBitMask;
  end;
begin
 DDSURFACEinfoSrc :=SrcSurface.lock;
 DDSURFACEinfoDEST := lock;

 SourceTable := Alphatable.LookupPointer(Alpha);
 SourceTableG := Alphatable.LookupPointerG(Alpha);
 DestTable := Alphatable.LookupPointer(255 - Alpha);
 DestTableG := Alphatable.LookupPointerG(255 - Alpha);

 SRCbuffer :=  DDSURFACEinfoSRC.lpSurface;
 nPitchSrc  := DDSURFACEinfoSrc.lPitch shr 1;
 DESTbuffer := DDSURFACEinfoDEST.lpSurface;
 nPitchDest := DDSURFACEinfoDest.lPitch shr 1;
 DestWidth := width;
 DestHeight := Height;
 SrcWidth := SrcSurface.width;
 SrcHeight := SrcSurface.Height;

 x := max(0,x);
 y := max(0,y);
 xEnd := min(x+SrcWidth-1,Destwidth-1);
 yEnd := min(y+ SrcHeight-1,DestHeight-1);

 SrcLinePos :=  0;
 DestLinePos := y*nPitchDest;

 for i := y to yEnd do
   begin
   DestColor := @DESTbuffer[DestlinePos+x];
   SrcColor  := @SRCbuffer[SrcLinePos];
   for j := x to xEnd do
    begin
    DESTbuffer[DestlinePos+j] :=
    PackColor(
DestTable[UnpackColorR(DestColor^,DDSURFACEinfoSrc.ddpfPixelFormat._mask.dwRBitMask)]+ SourceTable[UnpackColorR(SrcColor^,DDSURFACEinfoSrc.ddpfPixelFormat._mask.dwRBitMask)], DestTableG[UnpackColorG(DestColor^,DDSURFACEinfoSrc.ddpfPixelFormat._mask.dwGBitMask)]+ SourceTableG[UnpackColorG(SrcColor^,DDSURFACEinfoSrc.ddpfPixelFormat._mask.dwGBitMask)], DestTable[UnpackColorB(DestColor^,DDSURFACEinfoSrc.ddpfPixelFormat._mask.dwBBitMask)]+ SourceTable[UnpackColorB(SrcColor^,DDSURFACEinfoSrc.ddpfPixelFormat._mask.dwBBitMask)]
    );

    inc(DestColor);
    inc(SrcColor);
    end;
   inc(DestlinePos, nPitchDest);
   inc(SrcLinePos, nPitchSrc);
   end;
 SrcSurface.unlock;
 unlock;
end;
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to