第17回 グラフィックページの透過合成を作ってみます。
技術としては関数間での配列の受け渡し、各色の情報取得にビット操作を利用しています。
<あらすじ>
グラフィック画面で透過合成をしてみようと半透明を設定したものが表示されない。
調べてみると、RGB設定値のAは透明かどうか1ビットの情報しかない。
そこで、透過合成をさせるためにGSAVEを使って画像データを取得、加工後、GLOAD戻すことにしました。
<表示内容>
プログラムで何を表示しているのかというと、
グラフィックページ4(スプライト用画像の格納場所)の160,160から幅、高さ160のサイズの画像を
グラフィックページ0(ACLS後の表示画面)の5箇所の座標に30%の透過率でコピーしています。
スピードはのんびりです。
このプログラムの著作権はフリーです。
今まで講座でも、使えそうなところがあれば、自由に使ってください。

<概略>
画像配列領域の定義
コピー元の画像を画像配列(元)に転送
コピー先の画像も画像配列(先)に転送
画像配列(元)の各色を透過率で変更
画像配列(先)と画像配列(元)の各色を加算して、画像配列(先)に入れる(上限値対応要)
コピー先の画像に画像配列(先)を転送
(これはそのまま、AL_COPY関数の中の各行になってます)
<画像配列>
GSAVE、GLOADなどの命令の説明で画像配列という記述があります。
画像1ドットの情報を16ビットが配列の1つに格納されているようです。
GSAVEで画像配列に転送すると、例えば縦100x横100だと10000個の配列ができます。
(色変換フラグが1の時)
配列の1つ16ビットで各ビットこのように入っています。
上から5ビットずつ赤(R)、緑(G)、青(B)
最後の1ビット(A)が透明:0か透明でないか:1
RRRRRGGGGGBBBBBA
こんな感じ。
例えば、緑の情報だけ取り出したけれは、6ビット右にシフト( >> )して
000000RRRRRGGGGG
0000000000011111 = (&H1F)とアンド計算して取得しています。
設定するときは逆に、左に6ビットシフトして加えます。
プログラム中の&H1Fはそれが理由です。
余談 プチコン3号で指定している各色の階調は実際は256ではなくて32のようです。
下3ビットを繰り上げて上5ビットで設定しているそうです。確認はまだしていません。
<関数>
AL_COPY
BP,BX,BY コピー元のページと座標
TP,TX,TY コピー先のページと座標
WD,HD 合成画像の幅と高さ
AL コピー元の画像の透過率0~1
BW,TW 画像配列(元)と(先)
内部で利用していますが下記の関数とやり取りしています。
(以下同じ変数は記述省略)
P_HALF 画像配列の色合い透過率で変更
LG 画像配列の数
P_PLUS 画像配列の加算
透過ビットは1固定にしています。
C_GET 色のA,R,G,Bを取得
C 画像配列の一個
C_SET 画像配列の一個を作成
A,R,G,Bの対象ビットを超えないよう制御して返す
関数間での配列の受け渡し
配列名を渡して受け取った変数名で利用できます。
内部で値を変更した場合はそのまま設定されます。


もうひとつ各GPAGEを見るプログラムが隠れています。
技術としては関数間での配列の受け渡し、各色の情報取得にビット操作を利用しています。
<あらすじ>
グラフィック画面で透過合成をしてみようと半透明を設定したものが表示されない。
調べてみると、RGB設定値のAは透明かどうか1ビットの情報しかない。
そこで、透過合成をさせるためにGSAVEを使って画像データを取得、加工後、GLOAD戻すことにしました。
<表示内容>
プログラムで何を表示しているのかというと、
グラフィックページ4(スプライト用画像の格納場所)の160,160から幅、高さ160のサイズの画像を
グラフィックページ0(ACLS後の表示画面)の5箇所の座標に30%の透過率でコピーしています。
スピードはのんびりです。
このプログラムの著作権はフリーです。
今まで講座でも、使えそうなところがあれば、自由に使ってください。

<概略>
画像配列領域の定義
コピー元の画像を画像配列(元)に転送
コピー先の画像も画像配列(先)に転送
画像配列(元)の各色を透過率で変更
画像配列(先)と画像配列(元)の各色を加算して、画像配列(先)に入れる(上限値対応要)
コピー先の画像に画像配列(先)を転送
(これはそのまま、AL_COPY関数の中の各行になってます)
<画像配列>
GSAVE、GLOADなどの命令の説明で画像配列という記述があります。
画像1ドットの情報を16ビットが配列の1つに格納されているようです。
GSAVEで画像配列に転送すると、例えば縦100x横100だと10000個の配列ができます。
(色変換フラグが1の時)
配列の1つ16ビットで各ビットこのように入っています。
上から5ビットずつ赤(R)、緑(G)、青(B)
最後の1ビット(A)が透明:0か透明でないか:1
RRRRRGGGGGBBBBBA
こんな感じ。
例えば、緑の情報だけ取り出したけれは、6ビット右にシフト( >> )して
000000RRRRRGGGGG
0000000000011111 = (&H1F)とアンド計算して取得しています。
設定するときは逆に、左に6ビットシフトして加えます。
プログラム中の&H1Fはそれが理由です。
余談 プチコン3号で指定している各色の階調は実際は256ではなくて32のようです。
下3ビットを繰り上げて上5ビットで設定しているそうです。確認はまだしていません。
<関数>
AL_COPY
BP,BX,BY コピー元のページと座標
TP,TX,TY コピー先のページと座標
WD,HD 合成画像の幅と高さ
AL コピー元の画像の透過率0~1
BW,TW 画像配列(元)と(先)
内部で利用していますが下記の関数とやり取りしています。
(以下同じ変数は記述省略)
P_HALF 画像配列の色合い透過率で変更
LG 画像配列の数
P_PLUS 画像配列の加算
透過ビットは1固定にしています。
C_GET 色のA,R,G,Bを取得
C 画像配列の一個
C_SET 画像配列の一個を作成
A,R,G,Bの対象ビットを超えないよう制御して返す
関数間での配列の受け渡し
配列名を渡して受け取った変数名で利用できます。
内部で値を変更した場合はそのまま設定されます。


もうひとつ各GPAGEを見るプログラムが隠れています。