[Flash Player 10 #4] PixelBender のファイルを使わずにカスタムフィルターを定義
すっかり FlashPlayer 10 の魅力に取り付かれています。
‘08.10.09 追記:
CS4 からはメタデータを使ってファイルの埋め込みができるようになるようなので、こんな面倒臭いことしなくても大丈夫です。
通常、Shader を使用するときは pbj 形式のファイルが必要ですが、今回はこのファイルを使用せずにカスタムフィルターを作成するという試み。結果から言うと大成功でした。これで他の BitmapFilter 同様、import するだけでカスタムフィルターが使用できます。このやり方は流行ると思うなぁ。Adobe の人もこういう使い方を想定しているんでしょう、きっと。
まずはカスタムフィルターのコード。
package
{
import flash.display.Shader;
import flash.filters.ShaderFilter;
import flash.utils.ByteArray;
public class ColorizeFilter extends ShaderFilter
{
// ここが重要!
// あらかじめ、PixelBender のバイナリデータをベクター情報として格納しておく。
private static var _data:Vector.<int> = Vector.<int>([-91,1,0,0,0,-92,11,0,67,111,108,111,114,70,105,108,116,101,114,-96,12,110,97,109,101,115,112,97,99,101,0,109,117,116,97,0,-96,12,118,101,110,100,111,114,0,109,117,116,97,0,-96,8,118,101,114,115,105,111,110,0,1,0,-96,12,100,101,115,99,114,105,112,116,105,111,110,0,84,104,105,115,32,102,105,108,116,101,114,32,70,105,108,108,32,99,111,108,111,114,46,0,-95,1,2,0,0,12,95,79,117,116,67,111,111,114,100,0,-95,1,4,1,0,15,99,111,108,111,114,0,-94,4,100,101,102,97,117,108,116,86,97,108,117,101,0,0,0,0,0,0,0,0,0,0,0,0,0,63,-128,0,0,-94,12,100,101,115,99,114,105,112,116,105,111,110,0,99,111,108,111,114,0,-93,0,4,115,114,99,0,-95,2,4,2,0,15,100,115,116,0,48,3,0,-15,0,0,16,0,29,4,0,-13,3,0,27,0,1,4,0,-13,1,0,27,0,29,2,0,-13,4,0,27,0]);
private static var _byteCode:ByteArray;
private var _color:uint;
public function ColorizeFilter(color:uint):void
{
// ムービーを通して初めての new 時のみ、Vector を ByteArray に変換する。
if (_byteCode == null)
{
_byteCode = new ByteArray();
for (var i:int = 0, l:int = _data.length; i < l; i++)
{
_byteCode.writeByte(_data[i]);
}
}
super(new Shader(_byteCode));
this.color = color;
}
public function get color():uint
{
return _color;
}
public function set color(value:uint):void
{
_color = value;
// プロパティのセッター内で Shader にデータを渡す。
shader.data.color.value = [value >> 16, value >> 8 & 0xFF, value & 0xFF];
}
}
}
実際に使用するときのコード。
var data:BitmapData = Bitmap(new image()).bitmapData;
data.applyFilter(
data,
data.rect,
new Point(),
new ColorizeFilter(0xFF0000)
);
addChild(new Bitmap(data));
こんな感じで通常のフィルターと同じように import して new するだけで使用できます。今回のコード一式も例のごとく libspark に上げてますので、必要な方は http://www.libspark.org/svn/as3/Astro/ShaderFilter/CustomFilter/ 以下をチェックアウトしてください。