Einzelnen Beitrag anzeigen

Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Aus Intensität neue Farbe berechnen

  Alt 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
  Mit Zitat antworten Zitat