Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
Delphi XE2 Professional
|
AW: Geht das noch schneller? - Bitmap-Verrechnung
29. Nov 2014, 13:26
Delphi-Quellcode:
PROCEDURE Blend32(Source,Dest:pRGBQuad; Width,Height,OOffset,UOffset:Integer);
....
Ja, das gute alte Assembler...
Wäre noch etwas schneller als meine letzte Variante (hier zuletzt ca. 62 MS, die ASM ca. 47 MS), allerdings ist das Ergebnis erkennbar falsch, siehe Screenshot).
Hab ich geprüft.
Das Label "Next:" gehört 2 Code-Zeilen höher.
So wie es war, wurde bei rgbReserved=0 zum nächsten Zeilenanfang gesprungen statt zum nächsten Pixel.
Bei meiner Prüfung auf identische Ergebnisse hatte ich dummerweise immer alle rgbReserved<>0, so dass dieser Fehler nicht auftrat.
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
@Next: add ebp,1
jl @Loop
// Nächste Zeile
add esi,[esp+OOffs]
add edi,[esp+UOffs]
mov ebp,[esp+WOffs]
sub [esp+HOffs],1
jnz @Loop
@ End: popad
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
|