Zitat:
Aber gibt es da nicht so einen Super
ASM-Befehl, der das in einem Rutsch ohne Iteration erledigen kann?
Nein, auch da sind schleifen nötig.
Delphi speichert den "Endwert", also 2 Variablen, was bei fester 0 nicht nötig ist, zusätzlich zum
DEC x; JZ p;
, statt einem
DEC x; CMP x, z; JE p;
, als Abbruchbedingung (oder so in etwa)
Delphi-Quellcode:
IstUngleich0 := False;
for x := z - 1 downto 0 do begin
if PixelArrayPointerDerAktuellenZeileInPByte[x * 4 + 3] <> 0 then begin // das + 3 besser vorher drauf rechnen
IstUngleich0 := True;
Break;
end;
Einzelbytezugriffe sind eh schlechter, also ...
Delphi-Quellcode:
IstUngleich0 := False;
for x := z - 1 downto 0 do begin
if PixelArrayPointerDerAktuellenZeileInPLongWordOderTColor[x] and $ff000000 <> 0 then begin
IstUngleich0 := True;
Break;
end;
geht nur bei gerade Pixelanzahl
Delphi-Quellcode:
IstUngleich0 := False;
for x := z div 2 - 1 downto 0 do begin
if PixelArrayPointerDerAktuellenZeileInPLargeWord[x] and $ff000000ff000000 <> 0 then begin
IstUngleich0 := True;
Break;
end;
Bei einem 32-Bit-Bitmap kann man auch alle Zeilen zusammen in dieser einen Schleife behandeln, da die Zeilen im Speicher hintereinander liegen, ohne ein Offset/Align.
Oder ohne Offsetberechnungen mit einer For/While-Schleife, von PointerErstesPixel bis PointerLetztesPixel.