鮪だ! MAG Loader Specifications ======================================================================== #### まぐろーだー仕様書・非売品 #### - MAKIchan Graphic loader is not 鮪だ! - By Woody RINN (MAKIchanNET #03) ======================================================================== ● まぐろーだーとは  MAGフォーマットは、まきちゃんNETにおいて開発された、98等用 の画像データフォーマットです。愛称は「まぐろーだー」です。  'MAKIchan Graphic loader is not 鮪だ!'という訳です(^^;)  MAKIフォーマットは皆様の御好評を頂き、予想外に広がってしまいま した。簡単な方式でそこそこの圧縮率が得られる、セーブロードが高速、移 植性の高さ、等々の特長を持つMAKIフォーマットですが、開発当初から いくつかの欠点も指摘されています。 ・単体での圧縮率がいまいち悪い。 ・部分セーブ、ロードが出来ない。640×400ドット16色に限定されている。  そこで新たに開発されたのが、このMAGフォーマットです。特長、MA KIからの改良点を箇条書きにしますと、 ・単体で MAKI+LZH に迫る高圧縮率。 ・更に LHa 等の二次圧縮によって小さくなる。 ・簡単なアルゴリズム。 ・16色と256色に対応。 ・サイズ可変。  とまあ、こんな感じです。 ● ピクセルの取扱い  MAGフォーマットでは1ピクセルは1ワードで表現されます。16色画 像の場合なら横4ドットがひとまとまりになって1ピクセルです。256色 画像なら横2ドットですね。  6万色画像なら1ドット・・といいたいところですが、MAGはタイルを 使用した画像に特化したフォーマットであり、また6万色以上の画像ではP ICフォーマットがほぼ標準であるため、当フォーマットではさしあたって 考えない事にします。  16色画像の場合は次のようになります。 MSB 1バイト目 LSB MSB 2バイト目 LSB I1 G1 R1 B1 I2 G2 R2 B2 I3 G3 R3 B3 I4 G4 R4 B4  要するにMSXのVRAMといっしょです。  垂直型で記録するのは何故か?と思う方もいらっしゃるかと思います。こ れは次のような理由からです。 - 1 - 鮪だ! MAG Loader Specifications ・88の場合、色コードがそのまま入っていた方が8色変換が楽である。 ・MSX、68の場合はもろに垂直型:) ・残る98も、これによってそんなに速度が落ちるということはない:) ・2次圧縮率が高くなる(水平で記録した場合より3~5K小さくなる)  640×400ドット16色画像では、横4ドットがひとまとめなので仮 想画面の座標系は160×400の範囲を取ります。 ● まぐろーだーの原理  今 (X,Y) のピクセルのデータを書き込みたいとします。ここで、もし周囲 に同じピクセルがあった場合は、その相対位置のみを符号化して記録します。 左隣と同じであれば、(X:-1,Y:0) とか記録する訳ですね。こうする事で、ピ クセルデータは初めて出現した時のみ記録すれば良い事になります。  あとはこの符号化された相対位置情報の連鎖をとります。「真上と同じも のが8ピクセル連なってる」とかやるわけです。2次元に拡張されたLZS Sみたいなものですね。この方法でセーブすべき画素の情報を極限近くまで 減らせます。  以上がまぐろーだーの原理です。  実際は、符号化された相対位置情報(以下フラグと呼びます)は4ビット からなり、0~15で表現されます。  フラグの圧縮はMAKIローダーと同様の方式で行ないます。フラグ部分 は単純な連長圧縮では効きづらいみたいで、かといってハフマン等の算術圧 縮は面倒ですし、LZSSとかは圧縮に時間がかかるので、この方法にしま した。  フラグは次のような意味を持ちます。 0 同じピクセルが周囲に無い。 1 1つ左隣と同じである。 2 2つ左隣と同じである。 3 4つ左隣と同じである。 4 1つ上と同じである。 : : - 2 - 鮪だ! MAG Loader Specifications   X→ Y ___!_______!_______!_______!_______!_______!____ ↓ ___!_______!_______!_______!_______!__15___!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!__14___!__13___!__12___!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!__11___!__10___!___9___!____ ___!_______!_______!_______!_______!_______!____ ___!_______!_______!___8___!___7___!___6___!____ ___!_______!_______!_______!___5___!___4___!____ ___!___3___!_______!___2___!___1___!___0___!____ ! ! ! ! ! !  フラグの番号と相対位置の関係を図で示すと上のようになります。  1マスが一つのピクセルで、1つのピクセルは横4ドットです。0の点は 今書き込もうとしているピクセルです。  例えばフラグが6と記録されていた場合、2つ真上の4ドットを現在のピ クセル(0の点)にコピーするという訳です。  最初は1ピクセルを2×2ドットの正方形としていました。実はこの方が 圧縮率が稼げるのですが、ロード時の手間がかかるので横4ドットひとまと めです。  また、左側だけでなく右上方向にも検索すれば更に圧縮率は良いのですが、 部分ロードとかの関係でやめにしました。  上の相対位置を示した図を見れば判るかと思いますが、2ドット、4ドッ ト毎などの規則正しいタイルを使用した画像に特化した形になっており、実 際スキャナー画像等の誤差拡散画像などではいまいち圧縮率が稼げません。  本当は、この相対位置情報を動的に変化するとかすれば、究極に小さくな るフォーマットが出来るのですが、いかんせんセーブの手間、時間がかかり 過ぎるので、これも辞めにしました。 - 3 - 鮪だ! MAG Loader Specifications ● MAGフォーマットのデータ形式  1)エリアの区分  データは次の6エリアに分けることが出来ます。 チェックデータ+コメント ヘッダ(32バイト) パレット フラグA フラグB ピクセルデータ  メモリの無い機種とかでセーブする場合、ピクセルからディスクに書き出 す方が楽なので、データは必ずこの順でなくても良いのではないか?という 意見もあったのですが、あくまで読み出しが基本ですからロードが楽になる ようにという事で、必ずこの順番でお願いします。  2)コメント領域 filename mode saved user memo -------- ------- ---- ------------------ -------------------------------------- POCHI MAKI01B PC98 W_RINN(MAKI #03) HAI! MAKI01A ESEQ W_RINN(MAKI #03) RINN97 MAKI02 X68K W_RINN(MAKI #03) すけべです。転載禁止。 RINN98 MAKI02 pstX W_RINN(MAKI #03) バニーっ娘です。 RINN99 MAKI02 MSX2 W_RINN(MAKI #03) 100まであと一つ! LOLO3 MAKI02 PC98 Hironon げしょげしょ:-) XXX MAKI02 98sc >謎< Magsc r1.05  まぐろーだーはオプションでファイル一覧とか表示した場合に、上のよう に表示したいので、これに添うようにお願いします。  まず、先頭8バイトがチェックデータで、"MAKI02 " となります(後ろの スペース2つもチェックに含まれます)。その後に機種コードが来ます。4 文字であればなんでもかまいません。(例:PC98,PC88,ESEQ,X68K,MSX2)  それからユーザー名登録があります。環境変数 USER の内容を記録するの がいいでしょう。文字数はMAKIに合わせて18文字です。もしUSERの登 録が無かった場合は、ユーザーの欄は '>謎<' とでもしておいて下さい :-)  その後、メモがあれば記録されます。セーブ時に mag -s rinn97 "すけべです。転載禁止。"  とかやれば上のように記録されるような形がいいかと思います。  メモがあれば、32バイト目から記録されるようにお願いします。上下揃 えたいので。また、メモの文字数制限はありません :-)  テキストデータの最後は EOF($1A) が入っておしまいとなります。  あ、当然ですが変なエスケープシーケンスやコントロールコード等は入れ ないようにお願いします。  3)ヘッダ領域  ヘッダ領域は32バイトからなります。 - 4 - 鮪だ! MAG Loader Specifications オフセット 内容 サイズ 説明 ------- ----------------------- ------- -------------------- 0 0 b ヘッダの先頭 1 0 b 機種コード 2 0 b 機種依存フラグ 3 0 b スクリーンモード 4 0 w 表示開始位置X 6 0 w 表示開始位置Y 8 639 w 表示終了位置X 10 399 w 表示終了位置Y 12 - l フラグAのオフセット 16 - l フラグBのオフセット 20 - l フラグBのサイズ 24 - l ピクセルのオフセット 28 - l ピクセルのサイズ  フラグAB、ピクセルの各オフセットは、ファイル先頭からではなくヘッ ダの先頭からの位置で記録されます。これはコメント領域の長さが不定であ るためです。ロード時はまず $00 まで読み捨てる事になります。  機種依存フラグは機種コードに依存します。実はこれ、何に使うのか良く 判らないのですが、MSX版の移植をして下さってるMERONさんの強い 要望があったんで、付けることになったものです :-)  例えばCGツールなんかで状態を記録したりとか、機種に合わせた表示を 行なうための判断の材料にしたりとか、まあ、あれば何かに使えるでしょう:)  機種コードは早い者勝ちです。勝手に使わないように :-)。今の所下記が 予約されてます:) $00 : 98/68その他多く $03 : MSX (Meron版) $88 : 88 (Argon版) $68 : PST68 (Kenna) $FF : 似非キース (Hironon)  機種依存の部分の内容は他機種には影響出ない範囲で(つまりそこを見な くてもどの機種でもロードが完璧に行なわれるように)お願いします。 - 5 - 鮪だ! MAG Loader Specifications  スクリーンモードは次のようになってます。 (00000000) 400ライン、アナログ16色 普通の98 (00000001) 200ライン、アナログ16色 MSXのSC7 (00000010) 400ライン、アナログ8色 VMな98 (00000011) 200ライン、アナログ8色 アナログパレット付き88 (00000100) 400ライン、デジタル16色 :-) (00000101) 200ライン、デジタル16色 :-) (00000110) 400ライン、デジタル8色 昔の98 (00000111) 200ライン、デジタル8色 普通の88 (10000101) 200ライン、アナログ16色 MSXのSC8 ! !!! ! !!+- b0 : 200ラインフラグ(ドットの縦横比が2:1) ! !+-- b1 : 8色フラグ ! +--- b2 : デジタルフラグ ! +-------- b7 : 256色フラグ  ここで200ラインというのは、ドットの縦横比率が2:1の縦長だと言 う意味です。200ラインまでしかデータがないという意味ではありません。 実際にセーブされたデータの大きさはサイズの部分に書かれます。  ワード、ロングワードのデーターはインテル式で、上位、下位が逆転して ます。  各オフセットはセーブ時に偶数バンダリ調整されている必要があります。 要するに全て偶数になっている筈です。  フラグAのサイズがありませんが、セーブサイズから計算出来ます。Bの オフセット-Aのオフセット、でも計算できます。  4)パレットデータ  パレットデーターはGRBの順で各1バイト、16色ならば全部で48バ イトです。256色の場合は768バイトになります。  0以外の時は下位ビットを1で埋めて、8ビットに拡張します。 0 ・・・ %00000000 1 ・・・ %00011111 2 ・・・ %00101111 例:16階調の場合 3 ・・・ %00111111 4 ・・・ %01001111 : : 15 ・・・ %11111111  デジタル画像でも、パレットは必ず設定して下さい。また8色でも16色 分必ず設定しておいて下さい。0番と8番、1番と9番が同じ・・という具 合で良いと思います。  デジタルフラグとかは要するに、88でロードする時、8色でセーブされ てるものをわざわざ誤差拡散して表示するなどという間抜けなことを避ける ためにあります。16色表示できる機種では関係ありません。  98等の16色表示機種でロードする時はパレットのみが意味を持ちます。 - 6 - 鮪だ! MAG Loader Specifications ● まぐろーだーの展開方法  まず、コメント領域を読み捨てます。しかる後にヘッダ、パレットを読ん で設定を行ないます。準備ができたらいよいよ展開です。  1)フラグデータの展開  フラグAを順番に1ビットづつ調べます。  もしビットが0であれば1バイト分クリアします。もしビットが立ってい ればフラグBより1バイト(つまりフラグ2つ分)読みます。  これをセーブされたサイズ分行ないます。640*400 ならば (160/2)*400 回 ですね。  終了したらXORを取って戻します。上から下に(Y方向のライン数-1) 回、1つ上のフラグと排他的差分を取ります。  2)ピクセルデータの展開  フラグをひとつ(4ビット)づつ調べます。  0なら2バイト読み、VRAMに書きます。16色なら4ドット、256 色なら2ドット分に相当します。そうでない場合は、VRAMの指定された 場所から4ドットコピーします。  詳しくは「まぐろーだーの原理」の項をお読み下さい。  3)実際のアルゴリズム  以上が基本的な展開方法ですが、実際はフラグをあらかじめ展開すると大 量のメモリを必要とします。1024×1024ドット画像まで対応しようとすると フラグだけで128Kのメモリを使ってしまい現実的ではありません。そこで、 フラグの展開とピクセルの展開を同時に行なうようにすれば、フラグ展開用 のバッファは1ライン分のみで済みます。  すでに発表になっているローダーのソースを見て研究して下さい :-) ● まぐろーだーの圧縮方法  展開の逆のプロセスを辿ります。  1)フラグデータの作成  まず、周囲に同じピクセルが無いか調べます。あればそのフラグを、なけ れば0をフラグバッファに書き出し更にピクセルをピクセルバッファに書き 出します。  この時、調べ方でフラグが変わってくるので、フラグの圧縮に影響します。  まず最初に1つ上のピクセルのフラグ値と同じにならないか調べて、なる べく縦に同じフラグが来るようにします。  又、調べる順番は色々やった結果、 1,4,5,6,7,9,10,2,8,11,12,13,14,3,15  とするのが良好なようです。  左右はループしないので注意して下さい。また、VRAMエリア外からコ ピーが起きないようにもお願いします。従って (0,0) の点のフラグは必ず0 になり、(1,0) の点のフラグは0もしくは1のみとなります。 - 7 - 鮪だ! MAG Loader Specifications  2)フラグデータの圧縮  まず、縦にXORを取ります。下から、1ライン上のフラグと排他的差分 を取ります。  その後、フラグを1バイトづつ調べます。  0ならフラグAを1ビット0にします。0でなければ、フラグデータ2つ (1バイト)フラグBに書き出し更にフラグAを1ビット立てます。  フラグA、フラグBのサイズが奇数であれば1足して下さい。  最後にコメント、ヘッダ、パレット、フラグAB、ピクセルデータの順に ファイルにセーブして終了です。 ● 部分セーブ・ロードに関して  あと部分セーブ時は、横は8ドット(2ピクセル)単位でセーブします。 つまり98で言えばひっかかってるバイトごとセーブしてしまおうという訳 です。  開始及び終了X座標が X1,X2 だった場合、実際にセーブされてる開始座標 は X1 & $FFF8、終了座標は X2 & $FFF8 + 7 です。開始の方は切り捨て、終 了の方は切り上げという事でセーブします。  98のVRAMイメージで言えば、早い話X方向の繰り返し回数は for x=0 to (X2 shr 3)-(x1 shr 3) do begin  です。(X2 - X1) shr 3 とかやってしまうとはまります:)  まあ、余力があれば左右をクリッピングして、実際に記録されてる開始座 標から終了座標までだけを表示するようにしてもいいですが、僕は面倒なの でそこまでやる気はありません:-) さしあたっては8ドット単位でも問題は 無いと思います。  部分セーブの時はフラグA、Bが奇数になることがあるので、その時は1 足して偶数境界に合わせるのを忘れずにお願いします。フラグAは更にビッ ト単位なので、ビット落ちしないように注意しましょう。 - 8 - 鮪だ! MAG Loader Specifications ● 権利、運用に関する既定  当フォーマットは使用においていかなる制限もなく全く自由です。  但しローダー/セーバー等の運用に関する権利はプログラム制作者に帰属 します。また当フォーマットの画像の権利は、画像制作者に帰属します。そ れぞれが定める条項に従って下さい。  当フォーマットのサポートはまきちゃんネット及びまきちゃんネットのメ ンバーが所属する各BBS上で行います。  当フォーマットの運用に依って発生したトラブルに関しての責任は、まき ちゃんネット並びにフォーマット制作に関わったメンバーは一切負いません。  ローダー/セーバーなどのユーティリティを作成・発表するのは自由です。  移植を希望する方は出来るだけまきちゃんネットまたはその所属メンバー に連絡をお願いします。 ● 最後に  この仕様書は配布自由です。  質問、バグレポートや希望、感想等は大歓迎です。メイルとかいただける とうれしいな、と思います。CGを愛好する方のお役にたてれば幸いに思い ます。  ではでは。  RINN ● 目次 ● まぐろーだーとは .......................................... 1 ● ピクセルの取扱い .......................................... 1 ● まぐろーだーの原理 ........................................ 2 ● MAGフォーマットのデータ形式 ............................ 4  1)エリアの区分 ............................................ 4  2)コメント領域 ............................................ 4  3)ヘッダ領域 .............................................. 4  4)パレットデータ .......................................... 6 ● まぐろーだーの展開方法 .................................... 7  1)フラグデータの展開 ...................................... 7  2)ピクセルデータの展開 .................................... 7  3)実際のアルゴリズム ...................................... 7 ● まぐろーだーの圧縮方法 .................................... 7  1)フラグデータの作成 ...................................... 7  2)フラグデータの圧縮 ...................................... 8 ● 部分セーブ・ロードに関して ................................ 8 ● 権利、運用に関する既定 .................................... 9 ● 最後に .................................................... 9 ● 目次 ...................................................... 9 - 9 -