WorkPad 用プログラムの組み方(7)

Prev 1 , 2 , 3 , 4 , 5 , 6 , 7


このページの目次


何かを表示するプログラム

そろそろ、何かを表示するプログラムを書いてみよう。

ここまでで、PalmOS に失望した人は多いはずであり、 逆に言えばここまで到達した人は、 自分が作りたいものが PalmOS で実装可能かどうか、 ある程度の判断がつくようになっているはずだ。

ここまでで PalmOS が必要な機能を持っていることを確信できている人は、

だろうから、 使うべきではない用途には、使おうとはしないだろう。


何か を表示する、 と考えた場合やはり一番簡単なのは「絵」だろう。

今回利用するのは、

WinDrawBitmap( BitmapPtr bitmapP, SWord x, SWord y );

という API である。

WinDrawBitmap( bitmapP, x, y )

この API は bitmapP で指定されたビットマップを、 その左上が ( x, y ) で指定した座標になるように描画する、 というものである。

Palm デバイスは現在のところすべて、 左上を ( 0, 0 ) とする、 160 × 160 ドットの描画画面を持っている。 この範囲を越えた始点からの描画、 この大きさを越えた bitmap の描画に関して、 PalmOS を信頼してはいけない。 どのようなときに何が起こるのかは、 OSのバージョン依存である。 ついでに言うと、「新しければより柔軟」というわけではない。 画面描画に関する限り、 PalmOS3.5 が最もバグレポート数が多い、という事実がある。

この API で最大の難関は bitmapP が指し示すポインターの先にあるもの、 bitmap の構造である。 一応、 Windows.h WindowsNew.h と言ったへッダーファイルには、 ある程度 bitmap に関する構造が記されている。 構造体 BitmapType などがそれだ。 が、 そこにあるのは bitmap データの「へッダー部」の構造であって、 データ本体の構造はどこにも記されていない。 データ本体に関しては類推するしかないのだ。


まずは bitmap 構造体を元に バイト列のフォーマットとして bitmap 構造体 のへッダー部 がどのように宣言されているのか、 見ていくことにしよう。

Bitmap Header
offset in byte
from header top
size in byte format meaning
+0x0000 2 width

bitmap の x 軸方向のビットマップサイズ。 単位は pixel 数。

+0x0002 2 height

bitmap の y 軸方向のビットマップサイズ。 単位は pixel 数。

+0x0004 2 rowBytes

x軸方向1列辺りのバイト数を指定する。 ただし、ここに奇数を指定することはできない。 また、これは圧縮モードの場合、伸長後のバイト数である。

+0x0006 2 flags

これは実際には 2byte の bit field です。 C では次のように宣言されている。

typedef struct {
    Word    compressed:1;       // Data format:  0=raw; 1=compressed
    Word    hasColorTable:1;    // if true, color table stored before bits[]
    Word    reserved :14;
} BitmapFlagsType;

これと等価な値は次のようにして得られる。

bit 名前 意味
0x8000 compressed データフォーマット。
0 であれば素のビットマップデータが、 1 の場合は圧縮されたビットマップデータが、 Bitmap Header の後ろに来る事を意味する。
0x4000 hasColorTable これが 0 の場合、 与えられるイメージビットマップはそのまま素の色情報が そのまま記述されていることを意味する。
これが 1 の場合、 Bitmap Header 部の後ろに存在するカラーマップ情報が有効になる。 さらにその後ろに「カラーマップ記述された」イメージビットマップが 続くことを意味する。
0x3fff reserved. リザーブ領域。今現在は意味を持たない。
+0x0008 1 pixelSize 1 pixel 当たりのビット数を記述する。
+0x0009 1 version Bitmap フォーマットのバージョンを表す。 ここは 1 以外を入れるべきではない。
+0x000a 2 nextDepthOffset この Bitmap Header の先頭から数えて (nextDepthOffset * 4)バイト先に 次の Bitmap Header が存在する事を表す。 「次はない」場合は 0 を格納する。
+0x000c 4 reserved 予約されている領域。 使われていないので 0 で埋めておくべき。

Bitmap Header は全部で 0x10 byte になるように調整されている。

この Bitmap Header の後に続くデータはいくつかの条件によって 一意に決定される。

もし pixelSize が 1 の場合、 Bitmap Header の直後から pixel 情報が続く。

もし pixelSize が 2 以上の場合、ColorTableType が続く。 これは、たとえ BitmapHeader の hasColorTable が 0 であっても 必ず存在する、と記載されている。



Prev 1 , 2 , 3 , 4 , 5 , 6 , 7