Prev 1 , 2 , 3 , 4 , 5 , 6 , 7
そろそろ、何かを表示するプログラムを書いてみよう。
ここまでで、PalmOS に失望した人は多いはずであり、 逆に言えばここまで到達した人は、 自分が作りたいものが PalmOS で実装可能かどうか、 ある程度の判断がつくようになっているはずだ。
ここまでで PalmOS が必要な機能を持っていることを確信できている人は、
だろうから、 使うべきではない用途には、使おうとはしないだろう。
何か を表示する、 と考えた場合やはり一番簡単なのは「絵」だろう。
今回利用するのは、
という API である。
この 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 構造体 のへッダー部 がどのように宣言されているのか、 見ていくことにしよう。
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; これと等価な値は次のようにして得られる。
|
||||||||||||
+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