がらくたモジュール、ぽんこつサンプル、未整理資料とか

このページでは、実験中のモジュール・小さなソース・調査中の資料などを不定期に公開しています(//▽//)。
雑多な情報を詰め込んでいるため、検索サイトなどからのミスヒット率が高くなっているようですm(_ _)m。 ここをポチっ!で元の場所に戻りますが、よろしければ他のページもご覧ください→タイトルロゴをクリックです。
このページの情報は、基本的にHSPというスクリプト言語を基準に作成しています。 また、バグや誤情報といったトラップがあるかもしれません。

PNG画像の構造を分析してみる

いよいよHSP3.31β1(2版)より標準命令のpicloadがPNG画像ファイルに対応しました\(^o^)/のでPNGファイルを走査して情報を抜き出してみます。
ちなみに、CRC32の算出部分は当サイトZIP構造のページにあるものを流用しています(というかPNG仕様書にあるコードをHSP向けに書き換えてそっちにのせている……)。
#define ctype ReverseLong(%1)   ((%1>>24&$FF)|(%1>>8&$FF00)|(%1<<8&$FF0000)|(%1<<24&$FF000000))

    dialog "png", 16  : FileName = refstr
    exist FileName  : FileSize = strsize
    if FileSize < 0  : dialog "ふぁいるないよーん"  : end

    sdim PngData, FileSize  : bload FileName, PngData, FileSize

    if lpeek(PngData, 0) != $474E5089 & lpeek(PngData, 4) != $0A1A0A0D  : mes "PNGじゃないよーん"  : stop
    mes "PNGファイルです。"

    index = 8
    BlockType = "    "

    dim CRCTable, 256   ;CRCテーブル(演算用固定値テーブル)
    repeat 256
        ib = cnt
        repeat 8
            ib = (ib >> 1 & $7FFFFFFF) ^ ((ib & 1) * $EDB88320)
        loop
        CRCTable(cnt) = ib
    loop

*BlockLoop
    getkey delcode, 27  : if delcode  : end
    ib = lpeek(PngData, index)
    BlockSize = ReverseLong(ib)
    memcpy BlockType, PngData, 4, 0, index + 4
    ib = lpeek(PngData, index + 4 + strlen(BlockType) + BlockSize)
    BlockCRCv = ReverseLong(ib)

    CRC32 = $FFFFFFFF   ;初期値
    repeat BlockSize + 4, index + 4
        CRC32 = (CRC32 >> 8 & $00FFFFFF) ^ CRCTable(peek(PngData, cnt) ^ (CRC32 & $FF))
    loop
    CRC32 = CRC32 ^ $FFFFFFFF   ;ファイル分割ロードのときは、この値を初期値に代入する
;   mes strf("%08X",CRC32)

    if CRC32 != BlockCRCv  : sb = "CRCが一致しません!"  : else  : sb = "OK!"
    mes strf("[%s] -> %7dbytes (0x%08X) %s", BlockType, BlockSize, BlockCRCv, sb)
    BlockOffset = index + 4 + 4
    index += 4 + 4 + BlockSize + 4

    if BlockType == "IHDR"  : gosub *BlockIHDR
    if BlockType == "PLTE"  : gosub *BlockPLTE
    if BlockType == "tEXt"  : gosub *BlocktEXt
    if BlockType == "IEND"  : mes "\tサーチを終了します。"  : stop
    goto *BlockLoop

*BlockIHDR
    ib = lpeek(PngData, BlockOffset), lpeek(PngData, BlockOffset + 4)   ;1〜2の31乗-1
    mes strf("\t画像サイズ: %4d x %4d", ReverseLong(ib), ReverseLong(ib(1)))
    mes strf("\tビット深度: %d", peek(PngData, BlockOffset + 8))        ;1,2,4,8,16
    ib = peek(PngData, BlockOffset + 9)  : sb = "\tカラータイプが不明です。"
    if ib == 0  : sb = "\tカラータイプは、グレースケールです。"
    if ib == 2  : sb = "\tカラータイプは、RGBです。"
    if ib == 3  : sb = "\tカラータイプは、パレットです。"
    if ib == 4  : sb = "\tカラータイプは、グレースケール + アルファです。"
    if ib == 6  : sb = "\tカラータイプは、RGB + アルファです。"
    mes sb
    ib = peek(PngData, BlockOffset + 10)  : sb = "\t圧縮方式が異常です。"
    if ib == 0  : sb = "\t圧縮方式は、デフレートです。"
    mes sb
    ib = peek(PngData, BlockOffset + 11)  : sb = "\tフィルター形式が異常です。"
    if ib == 0  : sb = "\tフィルター形式は、基本フィルターです。"
    mes sb
    ib = peek(PngData, BlockOffset + 12)  : sb = "\tインタレース不明です。"
    if ib == 0  : sb = "\tインタレースしていません。"
    if ib == 1  : sb = "\tAdam7でインタレースしています。"
    mes sb
    return

*BlockPLTE
    if BlockSize \ 3 {
        mes "\tエントリ数が異常です。"
    } else {
        mes strf("\t%d色がエントリーされています。", BlockSize / 3) ;RGB順
    }
    return

*BlocktEXt
    dupptr dp, varptr(PngData) + BlockOffset, BlockSize, 2
    memexpand sb, BlockSize + 1  : memset sb, 0, BlockSize + 1
    memcpy sb, dp, BlockSize - 1 - strlen(dp), 0, strlen(dp) + 1
    mes "\t" + dp + " -> " + sb
    return
; http://www.tvg.ne.jp/menyukko/ ; Copyright(C) 2012 衣日和 All rights reserved.

マウスホイールの回転量を取得するサンプル

多くのマウスで右と左のボタンの間に付いてるくるくるまわるやつをまわした時に情報を取得するサンプルです。 …ちなみに、HSP標準のシステム変数にmousewというものがあります。。。
#define WM_MOUSEWHEEL   $020A
#define WHEEL_DELTA     120     ;ホイール回転時のコリコリ(手ごたえ)1回分の量
#define MK_CONTROL      $0008   ;一緒に押されているボタン
#define MK_LBUTTON      $0001
#define MK_MBUTTON      $0010
#define MK_RBUTTON      $0002
#define MK_SHIFT        $0004
#define MK_XBUTTON1     $0020   ;first X button  ←マウスについてる戻るボタン
#define MK_XBUTTON2     $0040   ;second X button ←マウスについてる進むボタン

    screen 0, 480, 240  : boxf
    oncmd gosub *GetMesMouseWheel, WM_MOUSEWHEEL
    stop

*GetMesMouseWheel
    ;メッセージパラメータ取得
    WheelV = wparam >> 16 & $FFFF   ;ホイール回転量
    OptBtn = wparam       & $FFFF   ;一緒に押されていたボタン
    PointX = lparam       & $FFFF
    PointY = lparam >> 16 & $FFFF
    MCount ++                       ;メッセージを受け取った回数
    ;shortをlongにする(マイナスの処理)
    if WheelV & $8000  : WheelV = WheelV | $FFFF0000    ;回転方向
    if PointX & $8000  : PointX = PointX | $FFFF0000
    if PointY & $8000  : PointY = PointY | $FFFF0000
    redraw 0
    pos 0, 20  : gcopy 0, 0, 0, 480, 240    ;一段移動
    color 0, 0, 0  : boxf 0, 0, 480, 20     ;黒塗り
    sb  = strf("%2d回目 -> " , MCount)
    sb += strf("回転量:%2d  ", WheelV / WHEEL_DELTA)    ;高速回転すると増える
    sb += strf("座標:%04d,%04d  ", PointX, PointY)      ;ginfo_mx, ginfo_my的な
    if OptBtn & MK_LBUTTON  : sb += "左 "       ;マウスの左ボタンが押されている
    if OptBtn & MK_MBUTTON  : sb += "中 "       ;マウスの中央ボタンが押されている
    if OptBtn & MK_RBUTTON  : sb += "右 "       ;マウスの右ボタンが押されている
    if OptBtn & MK_CONTROL  : sb += "Ctrl "     ;コントロールキーが押されている
    if OptBtn & MK_SHIFT    : sb += "Shift "    ;シフトキーが押されている
    if OptBtn & MK_XBUTTON1 : sb += "FirX "     ;First Xが押されている
    if OptBtn & MK_XBUTTON2 : sb += "SecX "     ;Second Xが押されている
    color 255, 255, 0  : pos 1, 1  : mes sb
    redraw 1
    return
; http://www.tvg.ne.jp/menyukko/
; Copyright(C) 2011 衣日和 All rights reserved.

IEコンポーネントのCOMイベント

HSPのsample/comobjフォルダ内のcomtest2.hsp,comtest7.hsp,web.hspやマニュアルのCOMコンポ項目で使用されているIEコンポーネント。 comtest7.hspでいくつかのイベントは定義されているがcomevdisp()関数の返すイベントはほかにもいろいろあるし。
という訳(?)で関数の返値の定義を調べてみました。詳細はMSDNで確認できます。 MSDNにないものは今のIEコンポではまず見かけない(古い)と思うよ?
#define DISPID_BEFORENAVIGATE               100
#define DISPID_NAVIGATECOMPLETE             101
#define DISPID_STATUSTEXTCHANGE             102
#define DISPID_QUIT                         103
#define DISPID_DOWNLOADCOMPLETE             104
#define DISPID_COMMANDSTATECHANGE           105
#define DISPID_DOWNLOADBEGIN                106
#define DISPID_NEWWINDOW                    107
#define DISPID_PROGRESSCHANGE               108
#define DISPID_WINDOWMOVE                   109
#define DISPID_WINDOWRESIZE                 110
#define DISPID_WINDOWACTIVATE               111
#define DISPID_PROPERTYCHANGE               112
#define DISPID_TITLECHANGE                  113
#define DISPID_TITLEICONCHANGE              114
#define DISPID_FRAMEBEFORENAVIGATE          200
#define DISPID_FRAMENAVIGATECOMPLETE        201
#define DISPID_FRAMENEWWINDOW               204
#define DISPID_BEFORENAVIGATE2              250
#define DISPID_NEWWINDOW2                   251
#define DISPID_NAVIGATECOMPLETE2            252
#define DISPID_ONQUIT                       253
#define DISPID_ONVISIBLE                    254
#define DISPID_ONTOOLBAR                    255
#define DISPID_ONMENUBAR                    256
#define DISPID_ONSTATUSBAR                  257
#define DISPID_ONFULLSCREEN                 258
#define DISPID_DOCUMENTCOMPLETE             259
#define DISPID_ONTHEATERMODE                260
#define DISPID_ONADDRESSBAR                 261
#define DISPID_WINDOWSETRESIZABLE           262
#define DISPID_WINDOWCLOSING                263
#define DISPID_WINDOWSETLEFT                264
#define DISPID_WINDOWSETTOP                 265
#define DISPID_WINDOWSETWIDTH               266
#define DISPID_WINDOWSETHEIGHT              267
#define DISPID_CLIENTTOHOSTWINDOW           268
#define DISPID_SETSECURELOCKICON            269
#define DISPID_FILEDOWNLOAD                 270
#define DISPID_NAVIGATEERROR                271
#define DISPID_PRIVACYIMPACTEDSTATECHANGE   272
#define DISPID_NEWWINDOW3                   273;新しいウィンドウを作ろうとしている

超訳 HSPな言語

HSPソースコードを読解するための資料です。気付いたときに随時更新しています。項目名はそのうち変更するかも...
当サイトはHSPルールを基準に作成していますので読み解く手助けになれば幸いです。

移動、または削除しました m(_ _)m

以下は迷走の履歴です。 このページから分離したものは専用ページを作ったか、どこかに紛れ込んだか、削除したか、幻となりました。

管理人への連絡はこちらから