@ Berhard: Klar, AQTime (Prof) ist mein ständiger Begleiter.
Lokale Variablen zu verwenden, bringt im vorliegenden Fall leider nichts, weil die Zuweisung an die lokalen Variablen in der Summe länger braucht (ca. 30%), als der Zugriff auf den Speicher:
Delphi-Quellcode:
procedure Draw32BitToBitmapNew(const BitOben: TBitmap; BitUnten: TBitmap);
var
h,w,i: Integer;
rublue, rugreen, rured, rureserved,
roblue, rogreen, rored, roreserved: Byte;
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
rublue := RGBA_Unten^[w].rgbBlue;
rugreen := RGBA_Unten^[w].rgbGreen;
rured := RGBA_Unten^[w].rgbred;
rureserved := RGBA_Unten^[w].rgbreserved;
roblue := RGBA_Oben^[w].rgbBlue;
rogreen := RGBA_Oben^[w].rgbGreen;
rored := RGBA_Oben^[w].rgbred;
roreserved := RGBA_Oben^[w].rgbreserved;
i := Round (ruBlue - ((ruBlue - roBlue) / 255 * roReserved));
if i < 0 then RGBA_Unten^[w].rgbBlue := 0 else if i > 255 then RGBA_Unten^[w].rgbBlue := 255 else RGBA_Unten^[w].rgbBlue := i;
i := Round (ruGreen - ((ruGreen - roGreen) / 255 * roReserved));
if i < 0 then RGBA_Unten^[w].rgbGreen := 0 else if i > 255 then RGBA_Unten^[w].rgbGreen := 255 else RGBA_Unten^[w].rgbGreen := i;
i := Round (ruRed - ((ruRed - roRed) / 255 * roReserved));
if i < 0 then RGBA_Unten^[w].rgbRed := 0 else if i > 255 then RGBA_Unten^[w].rgbRed := 255 else RGBA_Unten^[w].rgbRed := i;
RGBA_Unten^[w].rgbReserved := 255;
end;
end;
end;
end;