ビットマップを描画してみよう - 1 / 2 -
ファイルやリソースに関する事柄とビットマップやイメージの描画について解説します。
ファイルシステム
BREW には JAVA (J2ME) とは違い PC のようなファイルシステムが存在します。このファイルシステムはファイル名の最大長が64文字であるという制限を除けば、ディレクトリも作成できるなど便利な構造になっています。ファイルを扱うインタフェースには IFileMgr や IFile などがあります。
BREW のファイルシステムの例
上の図は、エミュレータ上でのファイルの構成を表しています。 BREW のファイルシステムでは、アプリごとにフォルダが存在し、アプリは自分のフォルダの中と共有ディレクトリ (shared) のみアクセスすることが可能です。つまり、ほかのアプリのディレクトリを操作することはできません。
実際には、共有ディレクトリが操作可能かどうかは実装依存の部分があります。エミュレータの場合は、エミュレータの設定のアプレットディレクトリが Brew File System フォルダとなります。また、実機上では .dll ファイルではなく .mod ファイルが存在し、 .sig ファイルという認証ファイルも存在します。
リソースファイル
リソースファイルとはアプリで使う、文字列や画像やダイアログのデザインなど動的に変更されない、実行コード以外のアプリの部品を一つのファイルにまとめたものです。リソースファイルは一つのアプリに一つである必要はありません。リソースファイルを持たないアプリも作成できますし、 1 つのアプリで 2 つ以上のリソースファイルを使用することもできます。 BREW のリソースファイルは拡張子 .bar を持っており、これは BREW SDK に含まれる BREW リソースエディタで作成することができます。
今回はビットマップの表示についても学習する予定なので、リソースファイルに関してはビットマップを含んだリソースファイルの作成をメインに解説します。
リソースファイルを作成する
それでは、ビットマップを含んだリソースファイルを作成してみましょう。ビットマップは画像エディタなどであらかじめ作成しておきます。ここで注意点ですが、 BREW で推奨されているビットマップの形式は、圧縮なしの色深度 1・2・4・8 ビットのビットマップです。
BREW リソースエディタを起動して、画像の項目を選択し、 [リソース] メニューから [新規画像] を選択します。リソース ID やリソース名などの項目を埋めてからあらかじめ用意しておいたビットマップファイルを選択して [OK] ボタンを押します。
リソース ID は後で API を使用してリソースを取得するときに必要になる ID です。ビットマップを選択した時点で、画像情報の欄に警告表示が出る場合は画像の形式が BREW 準拠ではないということです。この場合、実行時に正確に画像が扱われるかどうかは実装依存の部分があるようです。
画像リソースの追加中の画面
画像の追加が終了したら、 [ファイル] メニューから [保存] 項目を選択してアプリを開発しているディレクトリに .bri ファイルとして保存します。 .bri ファイルは編集可能な状態でのリソースの情報をファイルにしたもので BREW リソースエディタしか扱いません。
次に、 [作成] メニューの [QUALCOMM .BAR/.H ファイルを作成] 項目を選択して .bar ファイルとリソース ID などの情報の入ったヘッダファイルを書き出します。実際に、アプリ側から使用するのは .bar ファイルと .h ファイルです。
リソースファイルからデータを取り出すには
アプリ側では、ソースコード上で .h ファイルをインクルードして、 IShell インタフェースの API を使用して .bar ファイルからリソースを取り出すという処理をします。 IShell インタフェースのリソースに関する API は以下のようなものがあります。
関数名 | 説明 |
---|---|
ISHELL_LoadResBitmap | リソースからビットマップを取得します。 |
ISHELL_LoadResImage | リソースからイメージを取得します。 |
ISHELL_LoadResString | リソースから文字列を取得します。 |
ISHELL_LoadResSound | リソースからサウンドデータを取得します(現在のバージョンではサポートされていないようです)。 |
以下の関数はあまり使うことはないでしょう。
関数名 | 説明 |
---|---|
ISHELL_LoadResObject | リソースからデータを取得してデータを操作するインターフェースを返す。 |
ISHELL_LoadResData | リソースからIDとリソースの種類を元にデータを取得する。 |
ISHELL_LoadResDataEx | リソースから ID とリソースの種類を元にデータを取得する。 |
ここではそれぞれの API については詳しく解説しませんが、ビットマップを取得するには ISHELL_LoadResBitmap 関数もしくは ISHELL_LoadResImage 関数を使用します。下記のコードは drawbmp.bar リソースファイルから RES_ID_TILE=1000 のビットマップリソースを取得して、 IBitmap* を返します。
ISHELL_LoadResBitmap(shell,"drawbmp.bar",RES_ID_TILE);
IBitmap と IImage
ところで、 ISHELL_LoadResBitmap 関数を使用するとリソースのビットマップを IBitmap として取得し、 ISHELL_LoadResImage 関数を使用するとリソースのビットマップを IImage として取得することができます。 IImage はビットマップに加えて、 jpeg や png などのデータも扱うことができるハイレベルなインタフェースです。
IImage クラスを使用するとデータの変換などを気にすることなく扱えますが、ビットマップに限った場合は、 IBitmap を直接扱うほうが、より高速な処理ができます。ただし IBitmap を使用する場合は、以下のような少し込み入った話も存在します。
ビットマップの込み入った話
BREW にはデバイスデペンデントビットマップ (DDB) とデバイスインディペンデントビットマップ (DIB) というものがあります。デバイスデペンデントビットマップとは携帯電話の内部実装上でのビットマップの形式であり、これは機種依存性があり、一般的なビットマップファイルの構造と比べると、構造自体やデータの扱い方が違う可能性があります。
それと対照に、デバイスインディペンデントビットマップは機種間の依存性や違いをなくして抽象化したビットマップのことを指します。通常、ビットマップのパレット情報やピクセルデータを直接参照して修正したりする場合は、 DIB 形式のデータを修正します。描画 API に渡すデータは DDB 形式でないといけないため、 DIB と DDB を変換する CONVERTBMP というヘルパー関数も存在します。
逆に、 DDB から DIB に変換するには IBitmap クラスの QueryInterface 関数を使用しないといけません。
また普段はあまり使用しませんが、 IBitmap レベルで IBITMAP_BltIn 関数などを使用してデータの転送を行う場合、転送元と転送先のビットマップの形式が同じでないと、思うようにデータが転送されないこともありますが、かなり細かい話になってくるので詳細は BREW のリファレンスやより詳しい情報サイトを参照して下さい。