BMP・BGA プレビューウィンドウ

プレビュー領域には例として、BMS “GRAB BACK” (by ARMYTOM a.k.a Atomic Sphere) の BMP からジーンズジャンパーカエルマンが表示されています。このプレビューウィンドウは他に 7 つの数値入力枠、5 つのボタン、2 つのチェックボックスを持ちます。

#BMP タブや #BGA (座標定義) タブのパネル下部にある 表示ボタン を左クリックすると、選択した定義内容をプレビュー表示する子ウィンドウが開きます。

プレビューウィンドウはモードレスです。このウィンドウを最前面に開いたまま、BMSE メインウィンドウを操作することができます。

プレビューウィンドウはサイズを変更できます。プレビューウィンドウの外周にリサイズ判定があります。(リサイズ判定幅は OS により異なります。Windows XP では 4 pixels でした)

プレビュー領域 (背景が黒い部分) に BMP・JPG・GIF ファイルをドロップすると、簡易表示します。簡易プレビュー機能は定義リストとは無関係です。

アイコン (ICO の一部)、Windows メタファイル (WMF など)、拡張メタファイル (EMF など) も、ドロップすれば限定的に簡易プレビューできます。

プレビュー領域中央の矩形範囲がぴったり表示される大きさが、プレビューウィンドウの初期サイズです。

“BG-Line” が無効のとき、緑色の水平線は表示されません。

プレビュー領域の中央 256 pixels 四方は、一般的な BMS アプリケーションにおける “実際に映像が表示される領域” を示します。本稿ではキャンバスと呼びます。

この例ではプレビューウィンドウをリサイズして、プレビュー領域に 1024 × 768 pixels の画像を表示しています。

BG-Line” が有効のとき、キャンバスの外は緑色の水平線で覆われます。#BGA 座標定義などで 256 × 256 pixels より大きい画像を使用する場合、非表示領域の情報も参考にすることができます。

座標を明示せずに画像を表示したとき、キャンバスにおいて、X 軸は画像全体の幅から自動センタリングされ、Y 軸は常に上寄せされます。これは多くの BMS アプリケーションと同じ挙動です。

  • 幅か高さが 256 pixels を超える画像を一切表示しない機種や、センタリングせず拡大縮小する機種、フリーサイズ BGA 対応機種などもあります。それらについて本稿では触れません。

Lock

チェックボックスやラベル行を左クリックするか、もしくはチェックボックスにフォーカスして Space キーを押下すると、このオプションの有効・無効が切り替わります。初期状態では “Lock” は無効になっています。

“Lock” が無効のとき、定義リストカーソルを移動すると、選択されたオブジェクトの内容がプレビュー領域に即時描画されます。

オブジェ単体選択時にプレビューする” が有効なら、メインパネル上の映像オブジェクトを単体選択したときも、プレビュー内容が更新されます。

(音声オブジェクトをプレビューする場合とは異なり、左クリックした映像オブジェクトが既に選択された状態なら、プレビュー内容は更新されません。)

“Lock” が有効である間は、座標入力フォームへの入力時のみ、描画内容が更新されます。それ以外の操作では描画内容は更新されません。新規作成や、表示中の定義の消去や、画像ファイル自体の削除などを行ったとしてもです。

座標入力フォーム

座標入力フォーム (X1, Y1, X2, Y2, dX, dY) は、#BGA を定義する際に指定します。10 進数整数でピクセル座標を指定できます。X 軸は右方向が正の方向です。Y 軸は下方向が正の方向です。

  • フォームに入力した座標は即座にプレビューに反映されます。
  • 無効な値を入力すると不具合が発生するのでご注意ください。
画像ファイルの座標系:
画像ファイルの (X1, Y1) から (X2, Y2) までをトリミングします。
キャンバスの座標系:
キャンバスの (dX, dY) から描画を開始します。
  • 座標 X1, Y1, X2, Y2 は、画像ファイルの左上隅を原点 (0, 0) とします。
  • 座標 (X1, Y1) は、#BGA がトリミングする領域の、左上頂点です。
  • 座標 (X2, Y2) は、#BGA がトリミングする領域の、右下頂点です。
  • 座標 dX, dY は、キャンバスの左上隅を原点 (0, 0) とします。
  • 座標 (dX, dY) は、トリミング領域をキャンバスに描画する位置です。

#BGA は、任意の画像から任意の矩形領域をコピーして、それをキャンバスの任意位置に貼り付けるようなものと考えてください。この切り抜き操作を本稿ではトリミングと呼んでいますが、英語ではクロップと呼ぶようです。

座標指定の具体例

(サンプル画像: bga_320-64.bmp)

bga_320-64.bmp は、64 pixels 四方の正方形を縦横に敷き詰めた、320 pixels 四方の画像です。これを #BMP01 に定義し、座標 (64, 64) ~ (128, 128) をトリミングすると、この領域を新たな映像オブジェクトとして使用することが可能になります。

“X1=64, Y1=64, X2=128, Y2=128, dX=0, dY=0” のとき、トリミングした矩形領域はキャンバスの左上角から描画されます。

ここで描画座標 (dX, dY) を (96, 96) と指定すると、トリミングした領域をキャンバスの (96, 96) の位置から描画します。

ここで “Copy” ボタンから コピーして #BGA に定義すると (後述)、コピーした時点におけるプレビュー状態を「#BMP と同様の画像オブジェクト」として配置することができます。これによって、シンプルなアニメーションは画像 1 枚だけで表現でき、アーカイブ容量を削減できます。

たとえばトリミング範囲を固定し、描画座標だけを少しずつ変更しながら複数定義して配置すれば、トリミング範囲の図像を縦横無尽に動かせるでしょう。

描画座標を固定し、トリミング範囲だけを少しずつ変更しながら複数定義して配置すれば、クレジット等のスクロールが画像 1 枚で実現するでしょう。

他にも様々な応用ができます。座標指定のみで表現できる種類のアニメーション (単純なフレームリサイズやスクロールなど) なら、低容量で実現できます。

座標入力フォームの入力範囲と読み込み範囲

文字列長
  • 半角・全角問わず 8 文字まで (9 文字以上は切り捨てる)
文字列値
  • 半角英数字を入力可 (IME は常に無効になる)
  • 貼り付けにより、マルチバイト文字なども入力可
  • プレビュー時、文字列は値 0 とみなす (値自体は文字列から変化せず)
  • 文字列値も座標として コピーできてしまう
負数の値
  • #BGA 仕様では禁止されていないが、入力不可
  • 負数の値がフォームに現れた瞬間、値を 0 に書き換える
  • (この書き換えは、フォーム有効範囲の判定よりも優先される)
小数の値
  • 入力可・プレビュー可・コピー可
  • 値はそのままで整数に丸めて表示 (0.500001 なら 1 とみなす)
  • 境界の値は偶数側に丸める (0.501.522.523.54)
空の値
  • プレビュー時は値 0 とみなし、コピー時は値 0 としてコピーする
描画可能範囲
  • [Windows 11/10/8.1/8/7] 幅・高さ上限 65534 pixels (座標 065534)
  • [Windows Vista/XP/2000] 幅・高さ上限 32767 pixels (座標 032767)
  • [Windows ME/98/95] 幅・高さ上限 16383 pixels (超えると強制終了)
  • 実際の表示可能サイズはメモリやビデオメモリによっても異なる模様
  • Windows 2000/XP 以降、表示できなかった領域は黒で塗り潰される

#BMP の自動センタリングの基準は「表示できた幅」。幅 65534 pixels を表示できたなら、画像の実際の幅が 70000 pixels であれ 80000 pixels であれ、センタリング座標 X1, X2 は必ず 3263932895 になる。

Windows 95/98/ME 上で、ファイルサイズが12000000 bytes (約 11.4 MiB) よりも大きい画像を表示すると、BMSE が強制終了する。バックアップは作成されない。2000 × 2000 pixels × 24 bpp が目安。CreateDIBitmap 関数の 16 MiB 制限 [https://web.archive.org/web/20170710155112/https://msdn.microsoft.com/ja-jp/library/cc428343.aspx] (外部リンク)と関係がありそう。

有効範囲
  • 座標入力フォームの有効範囲は、符号つき 32 ビット整数
  • (-2147483648 ~ 2147483647)
  • 2.147E+9 を超える値がフォームに現れた瞬間、BMSE が強制終了する
  • 強制終了時、編集作業の一時バックアップファイルは生成されない
対応形式
  • BMP、GIF、JPEG、アイコンファイル (ICO) の一部、メタファイル (WMF)、拡張メタファイル (EMF)
  • Visual Basic 6.0 の機能で読み込みを行うため、PNG は表示しない
  • 非対応形式の画像を参照する #BGA や、無効な値が指定された #BGA を初回に表示すると、プレビューウィンドウが空っぽになる
備考
  • 一部機種は負数座標も解釈するが、BMSE は負数座標を扱わない

#BGA 定義リストに座標を定義する作業手順の例

  1. プレビューウィンドウ上で、トリミング座標や描画位置座標を調整する
  2. “Copy” ボタン を左クリックして、現在プレビュー中の表示状態をコピー
  3. #BGA タブの入力フォームに、コピーした情報を貼り付けて 「入力」ボタンを押す

プレビューウィンドウを介さず、#BGA タブの入力フォームに値を直接入力することも可能です。しかし通常は、必要な情報をプレビューウィンドウからコピーするほうが簡単でしょう。

単純な動きやパターンであれば、テキストエディタ上などでマクロを組んで、#BGA を一括定義することもできるでしょう。

プレビューウィンドウまとめ

タイトルバー
定義番号とファイル名 (#BGA の場合は参照元画像のフルパス) を表示
Num
#BMP の定義番号を表示
X1, Y1
#BGA における、参照元画像のトリミング始点 (左上) 座標
X2, Y2
#BGA における、参照元画像のトリミング終点 (右下) 座標
dX, dY
#BGA における、トリミング領域をキャンバスに描画する位置の座標 (キャンバス左上隅からの相対座標)
“Copy” ボタン
現在のプレビュー状態の定義番号と座標情報を #BGA 書式でコピー
BG-Line
  • 有効時、 映像が表示されない領域に、緑の水平線を 8 pixels 間隔で表示
  • 無効時、 映像が表示されない領域に、緑の水平線を表示しない
Lock
  • 有効時、 プレビュー表示内容を固定 (座標入力時のみ表示を更新)
  • 無効時、 プレビュー表示内容を常に更新
“01” ボタン
#BMP01 または #BGA01 の定義内容を表示 (未定義なら黒を表示)
“<” ボタン

前の番号の内容を表示 (未定義なら定義がある番号までスキップ)

“>” ボタン

次の番号の内容を表示 (未定義なら定義がある番号までスキップ)

“ZZ” ボタン / “FF” ボタン

定義リスト末尾番号の内容を表示 (未定義なら黒を表示)


#BGA タブ

#BGA は、#BMP に定義した画像の座標を指定してトリミングや表示位置変更を行い、これを新たに「配置可能な画像オブジェクト」として定義する拡張命令です。

#BGA は定義番号を #BMP と共有しています。便宜上 #BMP タブと #BGA タブは分かれていますが、じつのところ両者は同一のリスト、同一のパレット、同一のタブとみなすことができます。

値の書式は “Num X1 Y1 X2 Y2 dX dY” です。値は半角空白区切りで記述します。

Num
#BGA がトリミングするために参照する #BMP の定義番号
X1 Y1
#BGA がトリミングする領域の左上頂点の座標
X2 Y2
#BGA がトリミングする領域の右下頂点の座標
dX dY
#BGA がトリミングした領域をキャンバスに描画する位置の座標

#BMP#BGA の定義番号を重複させないでください

たとえば、番号が重複する映像オブジェクト 01 番を配置すると、

  • BMSE を含む大半の #BGA 対応機種は #BGA01 を表示します。
  • ただし MixWaver とナナシグルーヴは #BMP01 を表示します。
  • いうまでもなく、#BGA 非対応機種は #BMP01 を表示します。

このように互換性が損なわれるため、ある番号の #BMP#BGA について、どちらか一方は常に定義を空けておくスタイルが推奨されます。

よくない例
#BMP01 bga_320-64.bmp
#BGA01 01 0 64 128 144 64 80
よい例 1
#BMP01 bga_320-64.bmp
#BGA02 01 0 64 128 144 64 80
よい例 2
#BMP02 bga_320-64.bmp
#BGA01 02 0 64 128 144 64 80

#BGA タブの操作

#BGA タブの操作は #BMP タブとほぼ同じです。異なる部分だけ解説します。

リスト上で左クリック

リストアイテムを選択します。(HomeEndPage UpPage Down矢印キーも同様)

選択した番号の定義内容は #BGA 入力枠に表示されます。

#BGA#BMP と定義番号を共有しているため、両者の定義リストカーソルは連動します

右クリック

#BGA 定義リスト上で右クリックしても何も起きません。

#BGA 入力枠ではコンテキストメニューを開きます。(アプリケーションキーや [Shift + F10] も同様)

(Shift +) テンキー ±

#BGA ではなく、#BMP の定義リストカーソルが移動します。[Shift + テンキー±] では 3 行分移動します。

この操作だけは #BMP#BGA の定義リストカーソルが連動しません。バグかもしれません。

上下方向交換ボタンCtrl + (Shift +) テンキー ±

選択カーソル行の定義内容を、1 行先の定義と入れ替えます。

[Ctrl + Shift + テンキー±] なら 3 行先まで入れ替えます。

#BMP#BGA のリスト順は連動して入れ替わります#BGA の最初の値も連動します。#BMP#BGA は定義番号を共有するため、これは正しい挙動です。この操作で再生内容が狂うことはありません

  • 拡張命令タブには影響を及ぼしません。拡張命令タブ内に存在する定義や配置は、この操作によって内容が狂う可能性があります。

[Ctrl + Shift + テンキー±] は Undo Counter を 3 進めます。つまり “元に戻す/やり直し” は 3n 回分の実行が必要です。

#BGA 入力枠

妥当な値は [Num X1 Y1 X2 Y2 dX dY] (半角空白区切り) です。

プレビューウィンドウの表示内容を、“Copy” ボタン を左クリックしてコピーし、このフォームに貼り付ければ、妥当な値となります。

  • 妥当でない値も直接入力できてしまいます。これらは BMS アプリケーションに不具合をもたらすでしょう。

テキストボックス内の操作は、ダイレクト入力枠を参照。

消去 ボタン押下

選択カーソル行の #BGA 定義内容を消去します。(#BGA 入力枠の内容は消去しません。)

ボタンを左クリックするか、ボタン領域にフォーカスがあるとき Space/Enter キーで、ボタンを押下します。

入力ボタン 押下

現在の #BGA 入力枠の内容を、選択カーソル行に定義します。(このとき入力枠を空にします。)

ボタンを左クリックするか、ボタン領域にフォーカスがあるとき Space/Enter キーで、ボタンを押下します。

#BGA の互換性に関する問題

詳細は外部資料 [https://hitkey.nekokan.dyndns.info/cmdsJP.htm#ABOUT-THE-COMPATIBILITY-OF-BGAXX] (外部リンク)をご覧ください。この場では要約を列挙します。

  • そもそもあまりサポートされていません
  • BM98de/DDR の #BGA は、他機種が採用する書式とは微妙に異なります。
  • MixWaver は、#BMP 定義番号を [00-03] しか参照できません。
  • MixWaver は、#BMP を座標 (637, 437) までしかトリムできません。
  • #BMP#BGA の定義番号重複時、ナナシグルーヴは #BMP を表示します。
  • WAview は、キャンバス表示位置の原点座標があからさまに奇妙です。
  • BMSE/uBMplay (1.5.0 未満) は負数座標に対応していません。
  • BM98de/DDR は、トリム座標に「端の 1 pixel」を含めます。
  • #BGA00#BMP00 代わりに使えるかどうかが、機種ごとに異なります。
  • #BMP00 を参照してトリムできるかどうかが、機種ごとに異なります。
  • #BMP01 を番号 1 として参照できるかどうかも機種ごとに異なります。
  • #BGA の値区切り文字を連続できるかどうかも機種ごとに異なります。

【外部資料に書き損ねた事柄】 「256 pixels 四方のキャンバス」より大きなサイズを切り抜いた場合に、キャンバスから溢れる領域を表示するかどうかが機種ごとに異なります。BM98de・DDR・MixWaver・BGAEncAdvance・uBMplay (1.5.0+) はそのまま溢れて表示させるでしょう。

「キャンバスより大きいトリム画像」の描画開始位置を指定するために、負数座標が必要になる場合があります。再び 320 pixels 四方の画像 を例示します。

#TITLE Cropped 320
#BPM 120
#BMP01 bga_320-64.bmp
#BGA02 01 32 0 288 256 0 0
#BGA03 01 0 0 320 320 0 0
#BGA04 01 0 0 320 320 -32 0
#00104:01020304
#00204:01020304
#00211:01
  • #BGA02 は、#BMP01 をプレビューウィンドウに表示してそのまま コピー しただけです。明示的に 256 pixels 四方を切り抜いたともいえます。
  • #BGA03 は、#BMP01 の画像そのものの幅と高さを切り抜いたものです。
  • #BGA04 は、#BGA03 を手動でセンタリングしようと試みたものです。

前述の BMS コードは、BM98de・DDR・MixWaver・BGAEncAdvance・uBMplay (1.5.0+) のそれぞれで異なる結果になります。オーバーサイズの画像、オーバーサイズの切り抜き、キャンバスへの負数座標指定、いずれも仕様で規定されていない特徴ですが、uBMplay・BGAEncAdvance は破綻なく解釈してくれます。

BGAEncAdvance [https://yaruki0.net/programs/bgaencadv.html] (外部リンク)動画も静止画と同様に座標でトリミングできるので、互換性はさておき、BMS をゲーム以外の用途に利用する際にはとても便利です。