Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
Delphi XE2 Professional
|
AW: Geht das noch schneller? - Bitmap-Verrechnung
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....
|