Allerdings stimmt das Ergebnis immer noch nicht.
Falls Du die Sache noch weiter verfolgen willst, kannst Du hier im Thread-Beitrag Nr. 26 das Demoprojekt laden, das ich gepostet habe.
@Harry:
Habe ich geprüft.
Ich habe eine 8Bit-Integer-Multipikation benutzt, bei der Byte-Werte > $7F als negativ betrachtet werden.
Im Debugger sah ich dann, dass bei Deiner Prozedur eine 32Bit-Integer Multiplikation verwendet wird.
Bei den Tests fiel das nicht ins Gewicht, weil ich einfach den gesamten Screen nach BitOben und BitUnten kopiert hatte.
Somit waren die
Rgb-Werte in Oben und Unten gleich und die Subtraktion von z.B. Oben.rgbRed - Unten.rgbRed ergab immer 0.
Nachdem ich die Bitmaps mit Zufallswerten gefüllt hatte konnte den Grund der Abweichungen finden.
Ich habe die Prozedur Blend32 umgeschrieben. Für mich sehr überraschend, ist sie dadurch schneller geworden; ich hatte das Gegenteil erwartet.
Dein Beispiel Projekt läßt sich bei mir (XE2) nicht kompilieren.
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
lea esi,[eax+ecx*4]
// Source
lea edi,[edx+ecx*4]
// Dest
neg ecx
mov [esp+WOffs],ecx
mov ebp,[esp+HOffs]
@Loop: movzx ebx,[esi+ecx*4].TRgbQuad.rgbReserved
// S.Reserved
test ebx,ebx
jz @Next
// Blue
movzx eax,[esi+ecx*4].TRgbQuad.rgbBlue
// S.Blue
movzx edx,[edi+ecx*4].TRgbQuad.rgbBlue
// D.Blue
sub eax,edx
// S.Blue-D.Blue
imul ebx
// (S.Blue-D.Blue)*S.Reserved
add [edi+ecx*4].TRgbQuad.rgbBlue,ah
// Green
movzx eax,[esi+ecx*4].TRgbQuad.rgbGreen
// S.Green
movzx edx,[edi+ecx*4].TRgbQuad.rgbGreen
// D.Green
sub eax,edx
// S.Green-D.Green
imul ebx
// (S.Green-D.Green)*S.Reserved
add [edi+ecx*4].TRgbQuad.rgbGreen,ah
// Red
movzx eax,[esi+ecx*4].TRgbQuad.rgbRed
// S.Red
movzx edx,[edi+ecx*4].TRgbQuad.rgbRed
// D.Red
sub eax,edx
// S.Red-D.Red
imul ebx
// (S.Red-D.Red)*S.Reserved
add [edi+ecx*4].TRgbQuad.rgbRed,ah
// Reserved
mov [edi+ecx*4].TRgbQuad.rgbReserved,$FF
@Next: add ecx,1
jl @Loop
// Nächste Zeile
add esi,[esp+OOffs]
add edi,[esp+UOffs]
mov ecx,[esp+WOffs]
sub ebp,1
jnz @Loop
@
End: popad
end;