PPMをC#で解析の続き

*今回は、自分でも何を言っているかよくわかりません。いろいろと変でも気にしないでください。*

とりあえず、読み込む。

u.animeOffsetSize = br.ReadUInt32();
u.animeSpecialInfo = br.ReadUInt32();
u.animeOffsetTable = new uint[u.frameLength + 1];
for (int i = 0; i < u.frameLength + 1; i++)
{
 u.animeOffsetTable[i] = br.ReadUInt32();
}

さて、これを表示しよう。

MessageBox.Show(u.animationSize.ToString() + "\n" + u.animeOffsetSize + "\n" + string.Join(",",( from x in u.animeOffsetTable select x.ToString()).ToArray()));

・・・エラー。
そうか。ターゲットフレームワークを下げたからLINQが使えないのか。
LINQが使えないなんて、困るので再びフレームワークを3.5に引き上げ。
無事表示されました。


それでいくつか研究を。
まず、animeOffsetSizeは、やはりオフセットテーブルのサイズでした。
ページ数*4になります。
ちなみに、frameLengthはページ数-1なので注意。

オフセットテーブルはパス。

その後のフレームヘッダです。
簡単なメモで試した結果を2進表示
10010011
色を反転したもの
10010010
やはり最後のビットは紙の色ですね。
さらに、上紙の色を青に。
10010110

確認してみます。
1 => 前のページとの差分があるか(1 => あり)
00 => 不明
10 => 下紙の色(10 => 2 => 赤)
11 => 上紙の色(11 => 3 => 青)
となっています。
どうやら、正しいようですね。

続いて、画面に入っていきます。
最初の48byteの意味が前翻訳したときにはわかりませんでしたが、どうやら、ラインエンコード方式(2bit)が、192ライン分 => 48byteのようです。
ちなみに、一度同フォルダのメモ、強制消去に出会いました。

改めて、もっとわかりやすい実験メモを作り、研究再開。
この画像のイメージ図。青いのは画面の端ということ

なんと、フレームが後ろのページから保存されているっぽいことを発見。
これはハメなんじゃないだろうか。
00,00,00,00,10,01,00,11,10,00,10,00,10,00,00,10,00,00,10,10このうしろは0(上が詰まっていないほう)
00,00,00,00,10,01,00,11,10,10,00,10,10,10,00,00,00,00,00,10このうしろは0(上が詰まっている方)

                                                      • !!,!!,!!,--,!!,--,!!,-----,!!,-- <= 違うところ

前の翻訳によると
00 スキップ
01 符号化
10 反転符号化
11 そのまま
ということでした。スキップも描画しないのか変化が無いのか。符号化とは?反転符号化とは(もしや、前のラインの色違いとか)?そのままとは、前のと変化が同じ?それとも生データのこと?
となぞだらけ。


とりあえず、もう少し研究。その結果、なんとなくつかめた。
まず、最初の2byte(10,01,00,11)はちがうデータっぽい気がする。
なので、それを読み飛ばす。

さらに、バイトごとにbitを総入れ替えすると、その下のものになる。
これは、上が詰まっている画像
10,00,10,00,10,00,00,10,00,00,10,10,
00,01,00,01,01,00,00,01,01,01,00,00,

これは上が開いている画像
10,10,00,10,10,10,00,00,00,00,00,10,
01,00,01,01,00,00,01,01,01,00,00,00,

これを01が黒、00が白と考えると!!!
そう、元の画像と同じになります。
やはり、00はスキップ、01は描画対象がある、ということのようです。(もしかすると、ライン分ごとひっくり返すのかもしれません。そうしたら、01は10です。)
ですが、結局10と11は出てこず。いったいこの二つとはなんだ。


で、ビット反転。p.line1に48の大きさのバイナリ配列です。

for (int i = 0; i < p.line1.Length; i++)
{
p.line1[i] = (byte)(((byte)((p.line1[i] << 7) & 0x80)) | ((byte)((p.line1[i] << 5) & 0x40)) | ((byte)((p.line1[i] << 3) & 0x20)) | ((byte)((p.line1[i] << 1) & 0x10))
    | ((byte)((p.line1[i] >> 1) & 0x08)) | ((byte)((p.line1[i] >> 3) & 0x04)) | ((byte)((p.line1[i] >> 5) & 0x02)) | ((byte)((p.line1[i] >> 7) & 0x01)));
}

書いていることもぐちゃぐちゃだけど疲れた。続いて本データの読み込みに挑戦してみようか。