ラスタ/ベクタ、2Dグラフィックスの基礎のキソBREWアプリケーション開発入門(4)

» 2009年10月28日 15時45分 公開
[末永 貴一/エイチアイ,@IT MONOist]


 前回までは、「HelloWorld」プログラムを題材にした「BREW(Binary Runtime Environment for Wireless)」アプリケーション開発の基礎について解説してきましたが、今回からは“グラフィックス”をテーマにした内容をお届けします。

 単純な「HelloWorld」プログラムでは少し退屈だったかもしれませんが、グラフィックスであれば、見た目にも分かりやすく、BREWアプリケーションの楽しさをより実感していただけると思います。

 というわけで、今回は比較的扱いやすく、利用範囲の広い「2Dグラフィックス」を題材に解説を進めていきたいと思います。

ラスタデータとベクタデータ

2Dグラフィックスのデータは大きく「ラスタ」と「ベクタ」の2つに分類できます。

 ラスタは単純なドットの集合体としてグラフィックスを表現するデータです。一方、ベクタは点で結ばれたさまざまな線を演算するなどして絵を表現するデータです。

 それぞれ用途が異なり、どちらが優れているというわけではありません。しかし、一般的に絵を高精細なまま回転・拡大・縮小するような“スケーラブルな表現”に対してはベクタが向いており、単純に高精細な絵を“軽量に表現”する場合にはラスタが向いているといえます。もちろん、ベクタでも高精細な絵を表現することはできますが、複雑な形状ですと計算量が大きくなってしまいますので、計算能力の低い機器では実現が困難といえるでしょう。

 BREWの標準API(Application Programming Interface)は、ラスタ/ベクタのどちらの2Dグラフィックス描画もサポートしています。

 ラスタデータの場合、何らかの画像フォーマットのデータを読むことになりますが、BREWでは「BMP」「PNG」「JPEG」「BCI(BREWオリジナルフォーマット)」がサポートされており、用途に応じて使い分けるようになっています。

 また、BMPデータは大きく環境依存の「DDB(Device Dependent Bitmap)」と環境非依存の「DIB(Device Independent Bitmap)」に分かれますが、最終的に携帯電話の画面に対して出力するためにはDDBである必要があります。逆に、内部形式を変更するデータ操作を行う場合は、DIBである必要があります。このため色情報などの変更を行う場合は、DIBで変更を行い、それからDDBに変換するという手順になります。

2Dベクタグラフィックの描画

 2Dベクタグラフィックスを描画するためには「IDisplayインタフェース」と「IGraphicsインタフェース」を利用します。それぞれ描画できる形状が異なり、用途で使い分けたり、組み合わせて利用したりすることになります。

IDisplayインタフェースを利用する

 まずは、IDisplayインタフェースによる描画について見ていきましょう。IDisplayインタフェースでは、以下の関数で形状を描画できます(表1)

表1 IDisplayインタフェースの描画関数
関数名
描画できる形状
IDISPLAY_DrawHLine() 水平直線を描画
IDISPLAY_DrawVLine() 垂直直線を描画
IDISPLAY_DrawRect() 長方形を描画

 IDisplayインタフェースは、文字描画の「IDISPLAY_DrawText()」で利用しました(注1)が、基本的に使い方は一緒です。スクリーン座標を指定して、グラフィックスを描画するだけです。

注1:IDISPLAY_DrawText()」については、連載第3回「BREWアプリケーションの構成を理解しよう!」の3ページ目をご覧ください。

 以下は直線を描画するサンプルです(ソース1)

int vector2d_Display(AEEApplet* app){


AEEDeviceInfo devInfo;                  // 端末情報格納
int d_width, d_hight;                   // スクリーン座標格納 
IDisplay* display = app->m_pIDisplay;   // IDisplay格納


// 端末情報の取得
ISHELL_GetDeviceInfo(app->m_pIShell, &devInfo);


// スクリーン座標の取得
d_width = devInfo.cxScreen;
d_hight = devInfo.cyScreen;


// 直線描画
IDISPLAY_DrawHLine(display, 0, 10, d_width);
IDISPLAY_DrawVLine(display, 10, 0, d_hight);



IDISPLAY_Update(display);
return 0;


}
ソース1 直線の描画

 実行する際には、「HelloWorld」プログラムと同様に関数宣言と適当なイベントハンドラ(例えば、EVT_APP_START)から関数を呼ぶコードも加えます。画像1「BREW Simulator」(注2)上での実行結果となります。

photo 画像1 ソース1の実行結果
注2:BREW Simulator」については、連載第2回「BREWアプリケーション開発の流れを押さえよう」をご覧ください。

 ソース1の中で、まず「ISHELL_GetDeviceInfo()」でデバイス情報を取得しています。この関数は「BREW AEE(Application Execution Environment)」に対して、さまざまな操作を行う「IShellインタフェース」が提供する関数です。文字通り、BREW AEEのシェルの役割を果たします。

 線描画を行う部分が「IDISPLAY_DrawHLine()」と「IDISPLAY_DrawVLine()」になりますが、2つの関数はそれぞれ以下のような定義になっています。

void IDISPLAY_DrawHLine(IDisplay* po, int16 x, int16 y, int16 len)

void IDISPLAY_DrawVLine(IDisplay* po, int16 x, int16 y, int16 len)

 第1引数にIDisplayのインスタンスを、第2、3引数で描画開始位置のX・Y座標を指定します。そして、線の長さを指定することによって水平・垂直の線が描画されます。最後に、文字描画と同様に画面更新をするために「IDISPLAY_Update()」を実行します。

 IDisplayインタフェースを利用する場合には、最初から「AEEApplet」構造体にIDisplayのインスタンスが入っているので、それをそのまま利用すれば問題ありません。しかし、次に紹介するIGraphicsインタフェースを利用する場合には、インスタンスを別途生成する必要があります。以降で詳しく見ていきましょう。

>>「IGraphicsインタフェース」による描画については次ページ(MONOistサイトに移ります)で解説します


Copyright © ITmedia, Inc. All Rights Reserved.

アクセストップ10

2026年09月16日 更新
  1. 15日配信「iOS 27」の新機能まとめ Siri AIの恩恵を受けられる機種は? 画像編集やSafariにも注目 (2026年09月14日)
  2. 「一瞬の退屈も我慢できない」SNS中毒“ドパガキ”ってなんだ? その心理と、日本以外の状況 (2026年09月15日)
  3. 出そろった「iPhone 18 Pro」の価格を4キャリアで比較 ソフトバンクが衝撃の安さ、楽天モバイルが異例の施策 (2026年09月13日)
  4. 折りたたみ「iPhone Duo」に、iPhone Proシリーズから乗り換えたら“失う”5つのこと (2026年09月15日)
  5. ドコモ、2027年度中に「5Gエリア=SA対応エリア」目指す 品質1位にこだわらず“体感品質”の向上を重視 (2026年09月15日)
  6. Apple、「iOS 27」と「iOS 26.7」を同時公開 セキュリティ修正はiOS 27が126件、26.7が82件 (2026年09月15日)
  7. なぜLINEは“ちょっとした気遣い”で重宝された「ミュートメッセージ」を有料化したのか? (2026年09月08日)
  8. 「iOS 27」配信開始 Siriを刷新、写真アプリやSafariにも新機能 アップデート内容をチェック (2026年09月15日)
  9. Apple Pencilが使える「iPhone Duo」は、iPad miniの代わりになるか? 必ず知っておきたい注意点 (2026年09月15日)
  10. iPhone Duoに競合メーカーが続々反応 「折りたたみの世界へようこそ」「Google Homeスピーカー21個買えます」 (2026年09月14日)
最新トピックスPR

過去記事カレンダー