HSPの標準命令であるpalfade命令でもフェードアウトをする事はできますが、パレットモードでしかpalfade命令は使用できません。 そこで、フルカラーモードでフェードアウトをするfadeout命令を作ってみましょう。 画面上の画像をフェードアウトするには、全てのドットの濃度値から一定の値を引きます。 いくつ引くかは、p2で指定する事にしたいと思います。 (p1はBMSCR構造体へのポインタです。)
一つ一つのドットのR, G, Bの濃度は、0〜255の範囲内でなければなりません。 しかし、仮に元々の濃度が10でp2の値が20だったとすると、10から20を引いたら-10になってしまいますね。 このように、そのまま引き算をすると負の数になってしまう場合は、引き算をせずに0にしなければなりません。 そうしないと、意図した通りにはフェードアウトされなくなってしまいます。
さて、ecxにセットする繰り返しの回数を考えてみましょう。 まず、1行あたりのバイト数を7.3と同様に計算します。 sxの値を3倍し、4の倍数になるようにダミーのバイト数を加えればいいんでしたね。 1行あたりのバイト数が求まったら、それにsyの値を掛ければ、全体のバイト数が求まります。
あとは、esiにpBitを代入してecx回引き算を繰り返せばOKです。 ダミーからもp2の値を引いているため若干無駄があるような気がしますが、まぁよしとしましょう。(^^;
|
|
フェードアウトとは逆に、フェードインをするfadein命令も作ってみましょう。 フェードアウトでは全てのドットの濃度値から一定の値を引きましたが、フェードインでは全てのドットの濃度値に一定の値を加えます。ただし、p2の値を加えると255を超えてしまう場合は255にしなければなりません。
|
|
いわゆるフォトレタッチソフトには、必ずと言っていいほど明るさを調整する機能が付いているかと思いますが、一体どのような処理を行っているのでしょうか? 実は、ここで説明したフェードイン、フェードアウトと同様に、全てのドットの濃度値に一定の値を足したり引いたりしているだけです。
明るさの調整以外にもフォトレタッチソフトには様々な機能がありますが、それらを全て紹介していてはきりがありません。 そこで、比較的簡単に実現でき、かつ比較的簡単にMMX命令で高速化できそうな明るさの調整を取り上げてみました。 次の章では、fadeinとfadeoutをMMX命令を利用して高速化したいと思います。 次の章へ進む前に両方とも理解しておいてください。