Hier gibt's meine 'weiterentwickelte' alpha-blending procedure (sehe unten). Das Original "CombineMem" findet man im Freeware Komponenten-Source "Graphics32" von Alex Denissov.
// Result = Alpha * (Foreground - Background) + Background
Die Ergebnisse fuer R, G und B Werte werden parallel berechnet mit inline MMX / SSE Assembler-Befehle.
Weiss jemandem weitere Optimierungen oder sogar noch schnellere Algorithmen fuer Alphablending?
MfG,
Arjan
Delphi-Quellcode:
procedure AlphaBlend(PenColor:TColor32; DIB:PColor32; Alpha:DWORD);
asm
MOVD MM1, EAX
// MM1 = 00 00 00 00 ** Fr Fg Fb
MOVD MM2,[EDX]
// MM2 = 00 00 00 00 ** Br Bg Bb
PUNPCKLBW MM1, MM0
// MM1 = 00 ** 00 Fr 00 Fg 00 Fb
MOVD MM3, ECX
// MM3 = 00 00 00 00 00 00 00 AA
PUNPCKLBW MM2, MM0
// MM2 = 00 ** 00 Br 00 Bg 00 Bb
PSHUFW MM3, MM3, 0
// MM3 = 00 AA 00 AA 00 AA 00 AA
PSUBW MM1, MM2
PSLLW MM2, 8
PMULLW MM1, MM3
PADDW MM1, MM2
PSRLW MM1, 8
PACKUSWB MM1, MM0
MOVD [EDX],MM1
end;
[edit=Admin]Code in Tags [delphi ]..[ /delphi] gesetzt. Künftig bitte selber machen. Mfg, Daniel[/edit]