がらくたモジュール、ぽんこつサンプル、未整理資料とか
このページでは、実験中のモジュール・小さなソース・調査中の資料などを不定期に公開しています(//▽//)。
雑多な情報を詰め込んでいるため、検索サイトなどからのミスヒット率が高くなっているようです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ルールを基準に作成していますので読み解く手助けになれば幸いです。
- 変数の容量は自動で拡張されます
が、突っ走ってすぐ落ちる天然ちゃんです。
- 進数表記
16進数表記の場合、先頭に『$』か『0x』が付きます
2進数表記の場合、先頭に『%』か『0b』が付きます
- 構造体が無いのです
必要な場合は配列変数などに擬似的に構築します
- 割り算のあまりを求める演算子は『\』です
一般的な % や mod ではありません
- sizeof()というものがありません
当サイトのmemfile+existはこれの代用です
- コメント表記
// の後、行末までがコメントになります(お馴染みですね)
/* から */ で囲まれた部分がコメントになります(これもお馴染みですね)
; の後、行末までもコメントです(命令区切り記号ではありません)
移動、または削除しました m(_ _)m
以下は迷走の履歴です。
このページから分離したものは専用ページを作ったか、どこかに紛れ込んだか、削除したか、幻となりました。
- HSPプロコン2013 オススメ!フリーソフト
ナイスな作品を当サイトからプッシュしていました。
公開期間:2013/11/25〜12/31
- JPEG形式で画像を保存するサンプル(GDI+、圧縮率指定つき)
モジュールに組み込む前に、ここで公開。
公開期間:2011/ 4/24〜 4/30
- MCI講座
当サイト開設時にてきとーに置いていたもの。
公開期間:2011/ 2/ 6〜 2/27
- WindowsAPIで拡張してみる?(ExtTextOut,GetTextExtentPoint32編)
結局のところHSP標準命令で十分です。もっと良い関数見つけた。
公開期間:2011/ 6/19〜 6/25
- WindowsAPIで拡張してみる?(スクロールバー編)
使い辛いスクロールバー。需要の高いスクロールバー。モジュールにしてみたけれど…ページになりました。
公開期間:2011/ 7/31〜 8/ 6
- ZIP形式ファイルフォーマット
ページにまとめる前に、ここで公開。
公開期間:2011/ 7/31〜11/11
- アルファ付画像をgmode 7で使う
モジュール化はしないって言ってたのに…
公開期間:2014/ 2/ 6〜 6/30
- ドラッグ&ドロップを受け取るためのモジュール
ページにまとめる前に、ここで公開。
- ファイル情報モジュール
ページにまとめる前に、ここで公開。
- プログレスバー モジュール
ページにまとめる前に、ここで公開。
公開期間:2011/ 8/ 7〜11/20
- 画像を90°回転したり、上下左右反転したり(GDI+)
モジュールに組み込む前に、ここで公開。
公開期間:2011/ 9/25〜10/ 1
- 楕円と矩形とベジェ曲線を回転したり軌跡を求めたり
ページ化前にここで公開。公開期間:2014/ 5/27〜 6/30
- 符号付き64bit整数の計算モジュール
ページ化前にここで公開。公開期間:2014/ 5/17〜 6/30
管理人への連絡はこちらから