Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#15

AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?

  Alt 22. Feb 2016, 10:20
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (22. Feb 2016 um 10:26 Uhr)
  Mit Zitat antworten Zitat