Also die Single-Core-Lösung die hier am schnellsten ist, ist die aus "IsPartlyTransparentASM" (unter AQTime wird die in Average-Time ca. 20 MS schneller angezeigt, als meine Standard-Variante. Im Einzeltest sind die aber fast gleichschnell. Keine Ahnung, warum hier so Unterschiede entstehen. Bei AQTime gab es allerdings ca. 26 Durchläufe).
Die Variante habe ich hier mal auf meine Aufrufkonvention umgestaltet, um nicht doppelte Funktionsaufrufe zu haben.
Frage an die
ASM-Experten: Kann man das noch etwas schöner machen?
Delphi-Quellcode:
function HasTransparentRGBAValues (
const bm:TBitmap): Boolean;
var
W,H:NativeInt; P0,P1:Pointer;
begin
P0 := bm.ScanLine[0]; p1 := bm.ScanLine[1];
w := bm.Width; h:= bm.Height;
asm
// EAX=P0, Zeigt auf Zeile 0 der Bitmap
// EDX=P1, Zeigt auf Zeile 1 der Bitmap
// ECX=W, Breite der Bitmap
// Stack=H, Höhe der Bitmap
mov EAX,P0
// von mir ergänzt
mov EDX,P1
//
mov ECX,w
//
sub edx,eax
// Offset von Zeile 1 zu Zeile 0
js @BottomUp
imul edx,H
// Bytes/Zeile*Zeilen
add eax,edx
// Auf unterste Zeile
@BottomUp: lea eax,[eax+ecx*4+3]
// Hinter letztes Pixel (auf A-Byte)
imul ecx,H
// Anzahl Pixel
neg ecx
@Loop: cmp byte[eax+ecx*4],$FF
jne @True
add ecx,1
jl @Loop
xor al,al
jmp @
End
@True: mov al,True
@
End:
end;
end;
Edit: Hmmmh... irgendwas scheint an der procedure aber noch nicht zu stimmen, denn an einer Stelle des Programmablaufs stimmt plötzlich etwas nicht mehr (beim ersten Ausblenden der Hintergrundebene wird das Schachmuster plötzlich nicht mehr angezeigt, sondern eine weiße Arbeitsfläche, also irgendwo liefert die Funktion anscheinend einmal ein falsches Ergebnis zurück)