Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
|
Re: Aus Intensität neue Farbe berechnen
14. Okt 2005, 14:32
Und natürlich kein Pixels benutzen .
Oder ganz schnell :
Delphi-Quellcode:
// GR32-Lib, [url]www.graphics32.org[/url]
// Unit GR32_Blend
// "Note, that after using the Blend function, you have to call EMMS. Otherwise CPU will be unable to handle floating point instructions."
function M_BlendReg(F, B: TColor32): TColor32;
asm
// blend foregrownd color (F) to a background color (B),
// using alpha channel value of F
// EAX <- F
// EDX <- B
// Result := Fa * (Frgb - Brgb) + Brgb
db $0F,$6E,$C0 /// MOVD MM0,EAX
db $0F,$EF,$ DB /// PXOR MM3,MM3
db $0F,$6E,$D2 /// MOVD MM2,EDX
db $0F,$60,$C3 /// PUNPCKLBW MM0,MM3
MOV ECX,bias_ptr
db $0F,$60,$D3 /// PUNPCKLBW MM2,MM3
db $0F,$6F,$C8 /// MOVQ MM1,MM0
db $0F,$69,$C9 /// PUNPCKHWD MM1,MM1
db $0F,$F9,$C2 /// PSUBW MM0,MM2
db $0F,$6A,$C9 /// PUNPCKHDQ MM1,MM1
db $0F,$71,$F2,$08 /// PSLLW MM2,8
db $0F,$D5,$C1 /// PMULLW MM0,MM1
db $0F,$FD,$11 /// PADDW MM2,[ECX]
db $0F,$FD,$D0 /// PADDW MM2,MM0
db $0F,$71,$D2,$08 /// PSRLW MM2,8
db $0F,$67,$D3 /// PACKUSWB MM2,MM3
db $0F,$7E,$D0 /// MOVD EAX,MM2
end;
Vielleicht kann das ja jemand auf "Intensität" statt Alphakanal von F umschreiben. Ich habe jedenfalls keine Ahnung von Assembler, von MMX noch weniger.
Sebastian Moderator in der EE
|