Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
 
Delphi XE2 Professional
 
#59

AW: Geht das noch schneller? - Bitmap-Verrechnung

  Alt 28. Nov 2014, 02:10
Delphi-Quellcode:
PROCEDURE Blend32(Source,Dest:pRGBQuad; Width,Height,OOffset,UOffset:Integer);
const
   RegSize=4;
   WOffs=6*RegSize; HOffs=12*RegSize; OOffs=11*RegSize; UOffs=10*RegSize;
asm
         pushad
         mov ebp,ecx // Width
         lea esi,[eax+ebp*4] // Source
         lea edi,[edx+ebp*4] // Dest
         neg ebp
         mov [esp+WOffs],ebp
@Loop: mov bl,[esi+ebp*4].TRgbQuad.rgbReserved // S.Reserved
         test bl,bl
         jz @Next
         // Red
         mov al,[esi+ebp*4].TRgbQuad.rgbRed // S.Red
         mov cl,[edi+ebp*4].TRgbQuad.rgbRed // D.Red
         sub al,cl // S.Red-D.Red
         imul bl // (S.Red-D.Red)*S.Reserved
         add ah,cl // ((S.Red-D.Red)*S.Reserved) shr 8 + D.Red
         mov dx,ax
         // Green
         mov al,[esi+ebp*4].TRgbQuad.rgbGreen // S.Green
         mov cl,[edi+ebp*4].TRgbQuad.rgbGreen // D.Green
         sub al,cl // S.Green-D.Green
         imul bl // (S.Green-D.Green)*S.Reserved
         mov dl,ah // ((S.Green-D.Green)*S.Reserved) shr 8
         add dl,cl // ((S.Green-D.Green)*S.Reserved) shr 8 + D.Green
         shl edx,8
         // Blue
         mov al,[esi+ebp*4].TRgbQuad.rgbBlue // S.Blue
         mov cl,[edi+ebp*4].TRgbQuad.rgbBlue // D.Blue
         sub al,cl // S.Blue-D.Blue
         imul bl // (S.Blue-D.Blue)*S.Reserved
         mov dl,ah // ((S.Blue-D.Blue)*S.Reserved) shr 8
         add dl,cl // ((S.Blue-D.Blue)*S.Reserved) shr 8 + D.Blue
         // Reserved
         or edx,$FF000000
         mov [edi+ebp*4],edx
         add ebp,1
         jl @Loop
         // Nächste Zeile
@Next: add esi,[esp+OOffs]
         add edi,[esp+UOffs]
         mov ebp,[esp+WOffs]
         sub [esp+HOffs],1
         jnz @Loop
@End: popad
end;
Delphi-Quellcode:
PROCEDURE AsmDraw32BitToBitmap(Source,Dest:TBitmap);
resourcestring
   sWidthDifferent='Bitmaps haben unterschiedliche Breiten';
   sHeightDifferent='Bitmaps haben unterschiedliche Höhen';
   sZeroWidth='Breite der Bitmaps ist 0';
   sLessTwoLines='Höhe der Bitmaps ist < 2';
   sSourceNone32Bit='Source ist keine 32 Bit Bitmap';
   sDestNone32Bit='Dest ist keine 32 Bit Bitmap';
var PSource,PDest:pRGBQuad; W,H,SOffset,DOffset:Integer;
begin
   W:=Source.Width;
   H:=Source.Height;
   if Dest.Width<>W then raise Exception.Create(sWidthDifferent);
   if Dest.Height<>H then raise Exception.Create(sHeightDifferent);
   if W<1 then raise Exception.Create(sZeroWidth);
   if H<2 then raise Exception.Create(sLessTwoLines);
   if Source.PixelFormat<>pf32bit then raise Exception.Create(sSourceNone32Bit);
   if Dest.PixelFormat<>pf32bit then raise Exception.Create(sDestNone32Bit);
   PSource:=Source.ScanLine[0];
   SOffset:=NativeInt(Source.ScanLine[1])-NativeInt(PSource);
   PDest:=Dest.ScanLine[0];
   DOffset:=NativeInt(Dest.ScanLine[1])-NativeInt(PDest);
   Blend32(PSource,PDest,W,H,SOffset,DOffset);
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat