HSP | 透過 PNG で gmode 7 する (その2)
HSP | 透過 PNG で gmode 7 する (その2)
モジュール
/**
* モジュール
*/
#module Pixela//
// フィールド
//
#define global picload_pixela(%1) picload_pixela@Pixela %1/**
* 画像ファイルをピクセルアルファブレンドコピーに対応させて読み込み
*
* gmode 7
*/
#deffunc local picload_pixela str fnameload@Pixela fname
draw@Pixelareturn
/**
* 画像読み込み
*/
#deffunc local load str fname// 出力ウィンドウ
BUFFER_ID_PIXELA = ginfo_sel// 背景黒バッファ
BUFFER_ID_BG_BLACK = ginfo_newidbuffer BUFFER_ID_BG_BLACK
picload fname, 2
/* 画像サイズ取得 */
img_height = ginfo_winy
img_width = ginfo_winx// 背景白バッファ
BUFFER_ID_BG_WHITE = ginfo_newidbuffer BUFFER_ID_BG_WHITE, img_width, img_height
pos 0, 0 : picload fname, 1
// 出力ウィンドウ 初期化
type = ginfo_type(BUFFER_ID_PIXELA)
if ( type == 1 ) {
buffer BUFFER_ID_PIXELA, img_width * 2, img_height
} else : if ( type == 2 ) {
screen BUFFER_ID_PIXELA, img_width * 2, img_height
} else : if ( type == 3 ) {
bgscr BUFFER_ID_PIXELA, img_width * 2, img_height
}return
/**
* ウィンドウの種類取得
*
* 1 = buffer, 2 = screen, 3 = bgscr
*/
#defcfunc local ginfo_type int id
mref bmscr, 96 + id // mref bmscr, 67
return bmscr.17/**
* RGBA を計算し出力
*/
#deffunc local drawgsel BUFFER_ID_PIXELA
mref img_rgba, 66// アルファ値
gmode 6, , , 256
pos img_width, 0 : gcopy BUFFER_ID_BG_WHITE, 0, 0, img_width, img_height
gmode 5, , , 256
pos img_width, 0 : gcopy BUFFER_ID_BG_BLACK, 0, 0, img_width, img_height// RGB
gmode 0
pos 0, 0 : gcopy BUFFER_ID_BG_BLACK, 0, 0, img_width, img_height // VRAM のインデックス算出高速化のためにもコピーindex = 0
index_width = img_width * 3
repeat img_height
repeat img_width * 3
alpha = peek(img_rgba, index + index_width)
if ( alpha ) : poke img_rgba, index, 255 * peek(img_rgba, index) / alpha
index++
loop
index += index_width
loopreturn
#global