2006/05/17(Wed)susie32 plugin モジュール

はてブ数 2006/05/17 19:36 プログラミング::HSP3 つーさ

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はそれ以外のエラー