Mobile:NEWS 2003年11月28日 10:46 PM 更新

BREW プログラミング入門(6)
ビットマップを描画してみよう(2/2)


前のページ

ビットマップを描画してみる

 では、IBitmapやIImageの取得方法が分かったところで、ビットマップを画面に描画してみましょう。ビットマップを描画するには、IDISPLAY_BitBlt関数やIBITMAP_BltIn関数を使用します。イメージを描画するにはIImage_Draw関数を使用します。

 以下のコードは、リソースからビットマップを取得してきて画面に描画する2通りの方法を示しています。

IShell* shell = app->a.m_pIShell;
IDisplay* display = app->a.m_pIDisplay;
IBitmap* bmp;
IBitmap* dev;
// IDISPLAY_BitBlt を使用する方法
// リソースファイルからビットマップを取得
bmp = ISHELL_LoadResBitmap(shell,DRAWBMP_RES_FILE,TILE);
if (bmp != NULL) {
  // IDisplay インターフェースを使用して描画
  IDISPLAY_BitBlt(display,      // オブジェクト
                  0,            // 転送先の X 座標
                  0,            // 転送先の Y 座標
                  100,          // 転送先の幅
                  100,          // 転送先の高さ
                  bmp,          // 転送元のビットマップ
                  0,            // 転送元の転送開始 X 座標
                  0,            // 転送元の転送開始 Y 座標
                  AEE_RO_COPY); // 転送方法
  // 画面更新
  IDISPLAY_Update(display);
  // ビットマップ破棄
  IBITMAP_Release(bmp);
}
// IBITMAP_BltIn を使用する方法
// リソースファイルからビットマップを取得
bmp = ISHELL_LoadResBitmap(shell,DRAWBMP_RES_FILE,TILE);
if (bmp != NULL) {
  // デバイスのビットマップを取得
  IDISPLAY_GetDeviceBitmap(display,&dev);
  // IBitmap インターフェースを使用して描画
  IBITMAP_BltIn(dev,            // オブジェクト
                0,              // 転送先の X 座標
                0,              // 転送先の Y 座標
                100,            // 転送先の幅
                100,            // 転送先の高さ
                bmp,            // 転送元のビットマップ
                0,              // 転送元の転送開始 X 座標
                0,              // 転送元の転送開始 Y 座標
                AEE_RO_COPY);   // 転送方法
  // 画面更新
  IDISPLAY_Update(display);
  // デバイスビットマップ破棄
  IBITMAP_Release(dev);
  // ビットマップ破棄
  IBITMAP_Release(bmp);
}

 次に、リソースからビットマップをイメージとして取得してきて画面に描画する方法を示します。

IShell* shell = app->a.m_pIShell;
IDisplay* display = app->a.m_pIDisplay;
IImage* img;
// リソースファイルからビットマップをイメージとして取得
img = ISHELL_LoadResImage(shell,DRAWBMP_RES_FILE,TILE);
if (img != NULL) {
  // IImage インターフェースを使用して描画
  IIMAGE_Draw(img,              // オブジェクト
              0,                // 描画先の X 座標
              0);               // 描画先の Y 座標
  // 画面更新
  IDISPLAY_Update(display);
  // イメージ破棄
  IIMAGE_Release(img);
}

 以上のようにBREWではビットマップ一つを描画するにもいくつかの方法があることが分かってもらえたかと思います。どの方法を選択するかは、どこまでの処理を手動で行いたいかと処理速度の兼ね合いで変わってくると思います。またリソースから取得する方法のほかに、ISHELL_LoadBitmap関数を使用してファイルから取得する方法や、IFileインタフェースを使用してファイルから単なるデータ列として取得して、上記にも示したCONVERTBMP関数を使用してIBITMAPに変換する方法もあります。

 下にビットマップを表示するいくつかの方法について図にまとめてみました。図中の矢印はどういう流れで画像を表示するかの経路です。上からたどって一つの経路で画像を表示することができます。


ビットマップを描画するためのいくつかの方法

 例えば、ビットマップデータ→リソースファイル→ISHELL_LoadResBitmap→IBitmap→画面というのはビットマップデータをリソースファイルとして格納し、ISHELL_LoadResBitmap関数を使用して実行時にデータを取得し、IBitmapインタフェースを使用して画面に描画するということをあらわしています。

透過色を使ってみる

 BREWの描画では透過色を使用することができます。透過色は転送元のビットマップに対してIBITMAP_SetTransparencyColor関数で設定することができます。またデフォルトでマゼンタ色(R:255, G:0, B:255)になっています。透過処理は、画像の描画時に転送元の透過色は転送先にコピーされないという処理となっています。

 よって描画したくない部分を透過色で描画したビットマップを用意してIDISPLAY_BitBlt関数などを呼び出すときの引数に、AEE_RO_TRANSPARENTを指定しておけば透過色の部分は描画されなくなります。


透過色を使用したビットマップの転送

 以下に透過色を使用した描画のコードを示しておきます。

IShell* shell = app->a.m_pIShell;
IDisplay* display = app->a.m_pIDisplay;
IBitmap* bmp;
// まず背景を描画
// リソースファイルから背景のビットマップを取得
bmp = ISHELL_LoadResBitmap(shell,DRAWBMP_RES_FILE,TILE);
if (bmp != NULL) {
  // AEE_RO_COPY モードで描画
  IDISPLAY_BitBlt(display,0,0,100,100,bmp,0,0,AEE_RO_COPY);
  // ビットマップ破棄
  IBITMAP_Release(bmp);
}
// 次に透過色を含んだ画像を重ねて描画
// リソースファイルから透過色を含んだビットマップを取得
bmp = ISHELL_LoadResBitmap(shell,DRAWBMP_RES_FILE,ICON);
if (bmp != NULL) {
  // 描画するビットマップの透過色をマゼンタ色に設定
  IBITMAP_SetTransparencyColor(bmp,IBITMAP_RGBToNative(bmp,MAKE_RGB(255,0,255)));
  // AEE_RO_TRANSPARENT モードで描画
  IDISPLAY_BitBlt(display,0,0,100,100,bmp,0,0,AEE_RO_TRANSPARENT);
  // ビットマップ破棄
  IBITMAP_Release(bmp);
}
// 画面更新
IDISPLAY_Update(display);

 今回はBREWにファイルシステムが存在することの説明と、リソースファイルの作成方法、リソースファイルから読み込んだビットマップを画面に表示するいくつかの方法について解説しました。

 BREWの描画周りはいろいろな方法があり、一見ややこしく見えそうですが、実際はそうでもありません。それより、C言語形のインタフェースでずらずらと描画処理を記述しなければならないことのほうが、面倒で混乱の元になると思われます。最近はそれを解決してくれる製品もあるようです。

※今回の記事のソースコードは、ソフィア・クレイドル のサイトからダウンロードできます。

著者紹介
堀口淳史:ソフィア・クレイドル研究開発部チーフ ソフトウェアアーキテクト。ソフィア・クレイドルは、2002年2月京都市にて、無限の可能性を秘めたソフトウェア職人たちが楽しく集い、自ずと自己実現が達成される場になることを目指して創業。在籍スタッフの平均年齢は20代前半と若いが、その大半がプログラミング歴10年以上とそのプロフェッショナリティは極めて濃い集団である。

 これまでにBREW用アプリケーションフレームワークケータイJavaプログラム圧縮技術ケータイJavaブラウザ技術、ケータイメッセンジャー技術などを総合的に研究開発し、「高品質な共通プラットフォーム」の実現を目指してきた。

ご感想、ご質問はこちら(zdnet-contact@s-cradle.com)まで。



関連記事
▼ BREW プログラミング入門(5):イベント処理って何だ?
前回は文字列の扱い方について解説しました。今回はBREWのイベント処理について学びます。

▼ BREW プログラミング入門(4):BREW の文字列について知ろう
前回は画面描画のAPI、インタフェースやアプレット構造体についての理解を深めました。今回は文字列の扱い方について解説します。

▼ BREW プログラミング入門(3):画面に描画をしてみよう
前回の連載では、HelloWorldアプレットを作成することで、BREWアプリケーションのおおまかな構造について学びました。今回は画面描画のAPIについて詳しく説明するとともに、インタフェースやアプレット構造体についての理解を深めます。

▼ BREW プログラミング入門(2):“HelloWorld”プログラムを作ろう
前回の連載では、BREW SDK 2.1をインストールするところまで解説しました。今回は実際にソースコードを書き、BREWエミュレータで動かしてみましょう。画面に "Hello World" と表示する簡単なBREWアプリを作成します。

▼ BREW プログラミング入門(1):BREW SDKをインストールしよう
本連載は、BREWに興味がありプログラミングを始めてみたいけれど、どこから手をつけてよいか分からない方々を対象に、ステップ・バイ・ステップでBREWプログラミングを行う方法を解説していきます。

▼ Qualcomm、携帯電話向けプラットフォーム「BREW」発表──au端末に搭載
▼ “携帯電話のOS”を目指すBREW──国内でも1号機
▼ BREWとは何か?──Javaとの違い
▼ 連載バックナンバー

[堀口淳史, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

前のページ | 2/2 | 最初のページ



モバイルショップ

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!