2009-12-13
HSP gmode 7用 アルファブレンド画像作成モジュール
概要
プログラミング言語HSPには,命令 gmodeの第一パラメータ gmode 7 にピクセルアルファブレンドコピーという機能がありますが,このピクセルアルファブレンドコピー用の画像を作成するためのモジュールです。
PNG画像を読み込み,画像を作成します。作成されたピクセルアルファブレンドコピー用画像はモジュール内部で生成されたbufferに描画されます。
背景を黒色として処理しているので明るい画像は黒く縁取りされて表示される場合があります。仕様です。
注意事項
このモジュールはIE7以上でのみ正常に動作します。このモジュールを直接ソフトウェアに組み込む場合は,ソフトウェアに対し動作環境をIE7以上として明記する必要があります。
これを望まない場合は,モジュールを使って作成したピクセルアルファブレンドコピー用画像をBMP等に出力したものを直接ソフトウェアに組み込み仕様すると良いです。
ただし,内部で使用しているimgloadの部分を外部のPNG読み込みプラグインに置き換えることで動作環境を限定せずに使用することができます。
詳細
| ライセンス | ご自由にお使いください。(NYSL) |
| 対応 | Hot Soup Processor ver.3.0 以上 IE7以上 |
| 種別 | HSPモジュール |
必須モジュール
別途バイナリ解析モジュールが必要です。
zip!zip!
mod_pngtomask.hsp
//imgload HSPサンプルスクリプトより抜粋(位置指定Ver) #ifndef __mod_img__ #define __mod_img__ #module "mod_imgctx" #define IID_IImgCtx "{3050f3d7-98b5-11cf-bb82-00aa00bdce0b}" #define CLSID_IImgCtx "{3050f3d6-98b5-11cf-bb82-00aa00bdce0b}" #usecom ImgCtx IID_IImgCtx CLSID_IImgCtx #comfunc IImgCtx_Load 3 wstr,int #comfunc IImgCtx_GetStateInfo 8 var,var,int #comfunc IImgCtx_StretchBlt 12 int,int,int,int,int,int,int,int,int,int #deffunc imgload str _p1 ; ; ImgCtxを利用して画像ファイルを読み込みます ; imgload "ファイル名" ; (BMP,JPEG,GIF,ICO,PNGフォーマットを読み込み可能) ; fname=_p1 fpath=getpath( fname,32 ) if fpath="" : fname = dir_cur + "\\" + fname ; newcom pImage,ImgCtx IImgCtx_Load pImage,fname,0 dim size,4 repeat IImgCtx_GetStateInfo pImage,flg,size,1 if ( flg & 0x00200000 )==0 : break wait 4 loop IImgCtx_GetStateInfo pImage,flg,size,0 IImgCtx_StretchBlt pImage,hdc,ginfo_cx,ginfo_cy,size(0),size(1),0,0,size(0),size(1),0xCC0020 redraw 1 delcom pImage return #global #endif //mod_pngtomask #include "mod_binary.hsp" #module #uselib "gdi32.dll" #cfunc GetPixel "GetPixel" sptr,sptr,sptr #func SetPixel "SetPixel" sptr,sptr,sptr,sptr #define ctype pngtomask_crgb(%1, %2, %3) (%1|(%2<<8)|(%3<<16)) #deffunc pngtomask str _PngFile, int _hspwinid, var _width, var _height, local l1, local l2, local xcnt, local ycnt, local px, local py, local lgsel binaryload _PngFile, bin, 128 //先頭部分のみバイナリファイルの読み込み if binaryget(bin,"",0,8,2) != "89504E470D0A1A0A" : return 1 //PNGファイルではない _width = binaryget(bin,"49 48 44 52",0,4,1) //画像の横の長さ _height = binaryget(bin,"49 48 44 52",-1,4,1) //画像の縦の長さ lgsel = ginfo_sel buffer _hspwinid, _width*2, _height color : boxf 0, 0, _width, _height imgload _PngFile color 255: boxf _width, 0, _width*2, _height pos _width, 0 : imgload _PngFile l1 = GetPixel(hdc, 0, 0), 0 for ycnt, 0, _height, 1 for xcnt, 0, _width, 1 l1 = GetPixel(hdc, xcnt, ycnt) l2 = GetPixel(hdc, xcnt+_width, ycnt) l1 = peek(l1, 0) l2 = peek(l2, 0) l1 = (abs(l1 - l2)^255) l1 = pngtomask_crgb (l1, l1, l1) SetPixel hdc, xcnt+_width, ycnt, l1 next next pos 0, 0 redraw 1 gsel lgsel return #global //SAMPLE #if 1 pngtomask "a.png", 1, px, py randomize repeat x = rnd(640)-px/2 y = rnd(480)-py/2 repeat 1 gmode 7, px, py pos x , y : gcopy 1 wait 10 loop loop stop #endif

