アルファブレンドを……って罠だコレー!

ir9Ex2005-12-08

http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_updatelayeredwindow.asp?frame=true がありますが、これ(と32bitBitmap)を使うとピクセル単位でαブレンドをしてくれるウィンドウが作れます。

作れるのはいいのですが、どうも描画後の色がおかしい。 真ん中の赤い円が描かれている四角形がウィンドウなのですが、これすべてのピクセルが α=0 なんですよ。 なんでお前描画されてるんじゃー!

というわけで、MSDNライブラリで調べてみると…

http://msdn.microsoft.com/library/en-us/gdi/bitmaps_3b3m.asp?frame=true 構造体 にこう記述されているではありませんか。

Src.Red   = Src.Red   * SourceConstantAlpha / 255.0; 
Src.Green = Src.Green * SourceConstantAlpha / 255.0; 
Src.Blue  = Src.Blue  * SourceConstantAlpha / 255.0; 
Src.Alpha = Src.Alpha * SourceConstantAlpha / 255.0; 
Dst.Red   = Src.Red   + (1 - Src.Alpha) * Dst.Red 
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green 
Dst.Blue  = Src.Blue  + (1 - Src.Alpha) * Dst.Blue 
Dst.Alpha = Src.Alpha + (1 - Src.Alpha) * Dst.Alpha 

Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red とな?

Dst.Red = ([]Src[].[]Alpha[] * Src.Red) + (1 - Src.Alpha) * Dst.Redじゃねーのかよ!!orz

そりゃ加算合成になるわ。 何でこんな仕様に…。ちくしょう薔薇水晶め…。


…で、つまり Src の色は、自前で計算しろってことですか。そうですかそうですか…… めどい。orz