2006/05/17(水)susie32 plugin モジュール
susie plug-in をHSP3から利用するモジュール。
ぷましゃんのやつと比べて、
短所はパレットモードに対応していない。
長所はDPMファイル内の画像データも読み込める(はず)。
まぁ、なんつかどうでもいいですね。
コレを作るのに徹夜まがいなことをしてしまい、今もなかなか(というかかなり)眠いです。
このモジュールはスクリプトに組み込んで自由に使用できます。
#module
#uselib "kernel32.dll"
#cfunc LoadLibrary "LoadLibraryA" sptr
#cfunc GetProcAddr "GetProcAddress" int,sptr
#cfunc LocalLock "LocalLock" int
#func LocalUnlock "LocalUnlock" int
#func LocalFree "LocalFree" int
#func VirtualProtect "VirtualProtect" var, int, int, var
#define mdim(%1,%2)dim %1,%2 :VirtualProtect %1,(%2)*4,$40,AZSD
#uselib "gdi32.dll"
#func SetDIBitsToDevice "SetDIBitsToDevice" \\
int,int,int,int,int,int,int,int,int,int,int,int
#deffunc GetBmpSize str fn, array val_sz, local bmpsz
bmpsz = 0,0,0
bload fn,bmpsz, 12,14
if bmpsz = 40 : val_sz = bmpsz.1, bmpsz.2 : return 0
if bmpsz = 12 : val_sz = wpeek(bmpsz,4), wpeek(bmpsz,6) : return 1
return -1
;// 初期化
#deffunc _spi_init
LoadedPlugins = 0
mdim cbfunc,2
cbfunc = 0x0CC2C033,0x00000000 ;// xor eax,eax : ret 12
pfnCallback = varptr(cbfunc)
return
;// 単一DLL読み込み
#deffunc spi_Load str _dllname, local hDll ,\\
local pfn, local prm, local ret
hDll = LoadLibrary(_dllname)
if hDll = 0 : return -1 ;// Load失敗
pfn = GetProcAddr(hDll,"GetPluginInfo")
if pfn = 0 : return -2 ;// susie pluginじゃない
sdim buf,256
prm = 0,varptr(buf), 256
ret = callfunc(prm,pfn,3)
;// 4E493030 = '00IN' 画像読み込みプラグインじゃない
if lpeek(buf,0) != 0x4E493030 : return -3
hModule.LoadedPlugins = hDll
LoadedPlugins++
return 0
;// フォルダ内DLL全読み込み
#deffunc spi_LoadAll str _dlldir ,local curdir, local rdptr, local list, local dllfn
curdir = dir_cur : chdir _dlldir
rdptr = 0
dirlist list, "*.spi"
repeat stat
getstr dllfn,list,rdptr : rdptr += strsize
spi_Load dllfn
loop
chdir curdir
return LoadedPlugins
#defcfunc spi_IsSupported int _hModule, str _filename, int _dw, local fn, \\
local pfn, local prm, local ret
fn = _filename
pfn = GetProcAddr(_hModule,"IsSupported")
if pfn = 0 : return 0
prm = varptr(fn), _dw
return callfunc(prm,pfn,2)
#deffunc spi_GetPicture int _hModule, int _buf, int _len, int _mode ,\\
local pfn, local prm, local ret
pfn = GetProcAddr(_hModule,"GetPicture")
;LPSTR buf, long len, unsigned int 1, HANDLE *pHBInfo, HANDLE *pHBm, pfnCallback, 0
prm = _buf, _len, 1, varptr(HBi), varptr(HBm), pfnCallback, 0
ret = callfunc(prm,pfn,7)
if ret ! 0 : return ret
pbi = LocalLock(HBi)
pbm = LocalLock(HBm)
dupptr bi,pbi+4,8,vartype("int")
w = bi.0
h = bi.1
curgsel = ginfo_sel
repeat 1
if _mode ! 0 : break
mref bmscr,67 ;// ぷましゃんスクリを参考にしてみた
if bmscr.17=1 : buffer ginfo_sel, w, h : break
if bmscr.17=2 : screen ginfo_sel, w, h, bmscr.19&$ffff<<1 : break
bgscr ginfo_sel, w, h, 0
loop
SetDIBitsToDevice hdc,ginfo_cx,ginfo_cy,w,h,0,0,0,h,pbm,pbi,0
redraw
LocalUnlock HBi
LocalUnlock HBm
LocalFree HBi
LocalFree HBm
return 0
;// 画像ロード ファイル名, picload モード
;// ……とてつもなく中途半端
#deffunc spi_Picload str _fn, int _mode, local fn ,\\
local pfn, local prm, local ret
fn = _fn
exist fn : if strsize = -1 : return -1 : else : sz = strsize
if getpath(fn,18)=".bmp" : picload fn,_mode : return 0
ret = -2
sdim filebuffer,sz
bload fn,filebuffer
repeat LoadedPlugins
if spi_IsSupported(hModule.cnt, fn, varptr(filebuffer)) {
spi_GetPicture hModule.cnt, varptr(filebuffer), sz, _mode
if stat = 0 { ret = 0 : break }
}
if spi_IsSupported(hModule.cnt, fn, varptr(filebuffer)+128) {
spi_GetPicture hModule.cnt, varptr(filebuffer)+128, sz-128, _mode
if stat = 0 { ret = 0 : break }
}
loop
return ret
#global
_spi_init
//////////////////////////////////////////////////
spi_LoadAll "." ;// カレントフォルダのDLL全読み込み
chdir "e:\\my documents\\My Pictures"
spi_Picload "ccsakura_0800.jpg";// 画像ロード
;// stat=0なら成功、-1ならファイルが見つからない、-2はそれ以外のエラー