Um die bisherigen Ergebnisse zusammenzufassen:
* Zugriff auf ein Lookup-Array dauert länger, als die Berechnung.
* MulDiv bringt eindeutig keine Beschleunigung
* Im vorliegenden Fall bringt auch eine Parallelisierung nichts, da der Verwaltungsaufwand
größer ist, als der Gewinn durch mehrere Prozessorkerne
Das bislang schnellste Ergebnis liefert der untenstehende Code, egal, ob per Pointer-Addition oder Array-Zugriff:
Delphi-Quellcode:
procedure Draw32BitToBitmapxxx(const BitOben: TBitmap; BitUnten: TBitmap); // Array-Zugriff
var
h,w,i, r, g, b: Integer;
RGBA_Unten, RGBA_Oben: pRGBALine;
begin
for h := 0 to BitUnten.Height-1 do begin
RGBA_Unten := BitUnten.ScanLine[h];
RGBA_Oben := BitOben.ScanLine[h];
For w:= 0 to BitUnten.Width-1 do begin
if RGBA_Oben^[w].rgbReserved = 0 then begin
// unten bleibt
end else begin
RGBA_Unten^[w].rgbred := (RGBA_Oben^[w].rgbReserved * (RGBA_Oben^[w].rgbred - RGBA_Unten^[w].rgbred) shr 8 + RGBA_Unten^[w].rgbred);
RGBA_Unten^[w].rgbGreen := (RGBA_Oben^[w].rgbReserved * (RGBA_Oben^[w].rgbgreen - RGBA_Unten^[w].rgbGreen) shr 8 + RGBA_Unten^[w].rgbGreen);
RGBA_Unten^[w].rgbBlue := (RGBA_Oben^[w].rgbReserved * (RGBA_Oben^[w].rgbBlue - RGBA_Unten^[w].rgbBlue) shr 8 + RGBA_Unten^[w].rgbBlue);
RGBA_Unten^[w].rgbReserved := 255;
end;
end;
end;
end;
procedure Draw32BitToBitmapnew(const BitOben: TBitmap; BitUnten: TBitmap); // Pointer-Addition
var
h,w: Integer;
RGBA_Unten, RGBA_Oben: ^TRGBQuad; // pRGBALine;
begin
For h := 0 to BitUnten.Height-1 do begin
RGBA_Unten := BitUnten.ScanLine[h];
RGBA_Oben := BitOben.ScanLine[h];
For w:= 0 to BitUnten.Width-1 do begin
if RGBA_Oben^.rgbReserved = 0 then begin
// unten bleibt
end else begin
RGBA_Unten^.rgbBlue := ((RGBA_Oben^.rgbReserved * (RGBA_Oben^.rgbBlue - RGBA_Unten^.rgbBlue)) shr 8 + RGBA_Unten^.rgbBlue);
RGBA_Unten^.rgbGreen := ((RGBA_Oben^.rgbReserved * (RGBA_Oben^.rgbgreen - RGBA_Unten^.rgbGreen)) shr 8 + RGBA_Unten^.rgbGreen);
RGBA_Unten^.rgbred := ((RGBA_Oben^.rgbReserved * (RGBA_Oben^.rgbred - RGBA_Unten^.rgbred)) shr 8 + RGBA_Unten^.rgbred);
RGBA_Unten^.rgbReserved := 255;
end;
inc (RGBA_Unten);
inc (RGBA_oben);
end;
end;
end;