アルファブレンド その3
MMXコードを書きたいのだが、ここでひとつの問題にぶち当たった。 それは「透明色処理」である。 普通、アルファブレンドは1ドットずつ処理を行なうコードを書くのが一般的である。 しかし、MMXレジスタを使用せずともレジスタ幅は32ビットであるため、16ビット画像なら2ドットずつ処理を行なうことができる。 その反面、透明色処理も2ドット同時に行なわなければならず、コードが複雑になり、しかも、上手く書かないとかえって遅くなってしまう。 私はこの2ドット同時透明色処理を昔懐かしの「AND-OR法」(今名付けた)を用いてクリアした。
「AND-OR法」を用いる際にどうしても必要なのが「マスク」である。 このマスクは透明色のパターンに応じて毎度作る必要がある。 透明色のパターンは2ドット組の場合4通り存在する。 このうち、2ドットとも透明または不透明の場合はマスクなしで処理できるため、実際は2通りでよい。 ただ、あらかじめ作ったマスクをレジスタ(高級言語なら変数)に保存して「AND-OR法」に適用すると極めて遅い。 これを解決するためには、パターン毎に「マスク使用部にマスクの直値(マジックナンバー)を入れたコード」(*)を用意し、パターン別に分岐する必要がある。 このコードなら高速な実行が可能だ。 しかし、単純にコードが2倍になってしまう。
さて、話はMMXに戻って。 MMXレジスタの幅は64ビットであり、16ビット画像なら4ドットずつ処理することができる。 しかし、ここで問題になるのが先にも挙げた「透明色処理」である。 4ドット組の場合、透明色のパターンは16通りである。 このうち、4ドットとも透明または不透明の場合を除いた14通りが、記述しなければならないコードの数である。 まあ、記述すること自体はコピペで作れるものだからたいした問題ではないが、出来上がりは非常に醜いものとなるだろう。 そこで、別の方法を考えているのだが、どうやらこの醜い手段以外はなさそうである。
- マスク使用部に~
- ある条件で変数maskは0x0000FFFF、または、0xFFFF0000の値を持つとする。 このあとのコードはdata&=maskであるとする。 このコードを「ある条件でdata&=0x0000FFFF、または、data&=0xFFFF0000のコード」に書き換える。