ホーム > デベロッパ > BREW FAQ

BREW FAQ : 描画

クリッピングとは ?

クリッピングとは、描画を行う際に、 特定の範囲からはみだした部分を表示しないようにする処理のことです。 例えば、ウィンドウの表示領域を超えて図形が描画された場合でも、 図形がウィンドウからはみだすことはなく、 ウィンドウの境界で切り取られます。 これは、ウィンドウの表示領域の範囲でクリッピングされているためです。

      

クリッピングを行うには ?

IGraphics インターフェイスの IGRAPHICS_SetClip 関数や、IDisplay インターフェイスの IDISPLAY_SetClipRect 関数を使用してクリッピングの範囲を設定できます。

SophiaFramework では、 SFXGraphics::SetClip 関数やSFBGraphics::SetClip 関数や SFBDisplay::SetClipRect 関数を使用します。

[ BREW API のみを使用したコード ]

//
//  クリッピングを使用して、円形の表示領域内に四角形を描画します。
//

IGraphics*      graphics = app->g;
AEEClip         clip;
AEERect         rect;

// 画面を緑色でクリアします。
IGRAPHICS_SetBackground(graphics, 0xCC, 0xFF, 0xCC);
IGRAPHICS_ClearViewport(graphics);

// クリッピング領域を円に設定します。
clip.type = CLIPPING_CIRCLE;
clip.shape.circle.cx = 60;
clip.shape.circle.cy = 60;
clip.shape.circle.r  = 40;
IGRAPHICS_SetClip(graphics, &clip,0);

// 塗り潰しモードを設定します。
IGRAPHICS_SetFillMode(graphics, TRUE);

// 描画色を赤色に設定します。
IGRAPHICS_SetColor(graphics, 0xFF, 0x88, 0x88, 0x00);
IGRAPHICS_SetFillColor(graphics, 0xFF, 0xCC, 0xCC, 0x00);

// 四角形を描画します。
rect.x  = 10;
rect.y  = 10;
rect.dx = 60;
rect.dy = 50;
IGRAPHICS_DrawRect(graphics, &rect);

// クリッピング領域をリセットします。
IGRAPHICS_SetClip(graphics, NULL, 0);

// 画面を更新します。
IGRAPHICS_Update(graphics);

[ SophiaFramework を使用したコード ]

//
//  クリッピングを使用して、円形の表示領域内に四角形を描画します。
//

SFXClip       clip;
SFXRectangle  rect;

// SFBGraphics インスタンスを作成します。
SFBGraphicsSmp  graphics = SFBGraphics::NewInstance();

// 画面を緑色でクリアします。
graphics->SetBackground(SFXRGBColor(0xCC, 0xFF, 0xCC, 0x00));
graphics->ClearViewport();

// クリッピング領域を円に設定します。
clip.Set(SFXCircle(60, 60, 40));
graphics->SetClip(&clip, 0);

// 塗り潰しモードを設定します。
graphics->SetFillMode(true);

// 描画色を赤色に設定します。
graphics->SetColor(SFXRGBColor(0xFF, 0x88, 0x88, 0x00));
graphics->SetFillColor(SFXRGBColor(0xFF, 0xCC, 0xCC, 0x00));

// 四角形を描画します。
rect.Set(10, 10, 60, 50);
graphics->DrawRect(&rect);

// クリッピング領域をリセットします。
graphics->ClearClip();

// 画面を更新します。
graphics->Update();
      

図形を描画するには ?

図形を描画するには、IGraphics インターフェイスの関数を使用します。

SophiaFramework では、SFBGraphicsSFXGraphics の各関数を使用します。

図形の描画をするため、以下の関数を記載します。

関数名 [BREW] 関数名 [SophiaFramework] 処理概要
IGRAPHICS_DrawLine SFBGraphics::DrawLine
SFXGraphics::DrawLine
線を描画します。
IGRAPHICS_DrawPolyline SFBGraphics::DrawPolyline
SFXGraphics::DrawPolyline
連結された線を描画します。
IGRAPHICS_DrawTriangle SFBGraphics::DrawTriangle
SFXGraphics::DrawTriangle
三角形を描画します。
IGRAPHICS_DrawRect SFBGraphics::DrawRect
SFXGraphics::DrawRectangle
四角形を描画します。
IGRAPHICS_DrawRoundRectangle SFBGraphics::DrawRoundRectangle
SFXGraphics::DrawRoundRectangle
角の丸い四角形を描画します。
IGRAPHICS_DrawPolygon SFBGraphics::DrawPolygon
SFXGraphics::DrawPolygon
多角形を描画します。
IGRAPHICS_DrawCircle SFBGraphics::DrawCircle
SFXGraphics::DrawCircle
円を描画します。
IGRAPHICS_DrawEllipse SFBGraphics::DrawEllipse
SFXGraphics::DrawEllipse
楕円を描画します。
IGRAPHICS_DrawPie SFBGraphics::DrawPie
SFXGraphics::DrawPie
扇形を描画します。

角の丸い四角形を描画するサンプル コードを、以下に示します。

[ BREW API のみを使用したコード ]

//
// 角の丸い四角形を描画します。
//

IGraphics*      graphics = app->g;
AEERect         rect     = {0};

// 画面を緑色でクリアします。
IGRAPHICS_SetBackground(graphics, 0xCC, 0xFF, 0xCC);
IGRAPHICS_ClearViewport(graphics);

// 塗り潰しモードを設定します。
IGRAPHICS_SetFillMode(graphics, TRUE);

// 描画色を赤色に設定します。
IGRAPHICS_SetColor(graphics, 0xFF, 0x88, 0x88, 0x00);
IGRAPHICS_SetFillColor(graphics, 0xFF, 0xCC, 0xCC, 0x00);

// 角の丸い四角形を描画します。
rect.x  = 10;
rect.y  = 10;
rect.dx = 60;
rect.dy = 50;
IGRAPHICS_DrawRoundRectangle(graphics, &rect, 15, 15);

// 画面を更新します。
IGRAPHICS_Update(graphics);

[ SophiaFramework を使用したコード ]

//
// 角の丸い四角形を描画します。
//

SFBGraphicsSmp  graphics;
SFXRectangle    rect;

// SFBGraphics インスタンスを作成します。
graphics = SFBGraphics::NewInstance();

// 画面を緑色でクリアします。
graphics->SetBackground(SFXRGBColor(0xCC, 0xFF, 0xCC, 0x00));
graphics->ClearViewport();

// 塗り潰しモードを設定します。
graphics->SetFillMode(true);

// 描画色を赤色に設定します。
graphics->SetColor(SFXRGBColor(0xFF, 0x88, 0x88, 0x00));
graphics->SetFillColor(SFXRGBColor(0xFF, 0xCC, 0xCC, 0x00));

// 角の丸い四角形を描画します。
rect.Set(10,10,60,50);
graphics->DrawRoundRectangle(&rect, 15, 15);

// 画面を更新します。
graphics->Update();
      

どのような画像形式で画像を扱うとパフォーマンスが向上しますか ?

画像の読み込み速度や描画速度は機種に依存しますので、 一概にどの形式が良いとは言えません。

以下の対比表に BMP、PNG、JPEG の各形式の読み込み時間の比較値を記載します。 この表は BMP を 1 とした場合の値で、値が大きいほど読み込みに時間が掛かります。

機種 BMP PNG JPEG
A5304T 1 8.5 100
A5501T 1 4.5 5.5

※ 読み込み時間は、あくまで目安です。

      

JPEG や PNG を拡大して描画するには ?

BREW 2.1 では、JPEG や PNG の拡大、縮小はサポートされていませんが、 ビットマップの拡大、縮小はサポートされています。 そこで、JPEG や PNG を拡大して描画する場合はビットマップに画像を描画し、 ITRANSFORM_TransformBltComplex() や ITRANSFORM_TransformBltSimple() を使用します。

SophiaFramework では、 SFBTransform::TransformBltSimple 関数や SFBTransform::TransformBltComplex 関数を使用して、ビットマップに描画後の PNG イメージを拡大します。

以下のサンプルコードでは、 PNG イメージをリソースファイルから読み込み、 2 倍に拡大して表示します。

[ BREW API のみを使用したコード ]

// リソース ファイルから読み込む PNG イメージのリソース ID
#define IDP_MY_PICTURE  0x0001


IShell*         shell       = app->a.m_pIShell;
IDisplay*       display     = app->a.m_pIDisplay;
IImage*         pngimg      = NULL;
IBitmap*        tmpBmp      = NULL;
IBitmap*        dst         = NULL;
ITransform*     trans       = NULL;
AEEImageInfo    info        = {0};

// リソース ファイルから PNG イメージを読み込みます。
pngimg = ISHELL_LoadResImage(shell, MYRESOURCE_RES_FILE, IDP_MY_PICTURE);

if (pngimg != NULL) {
    // PNG イメージの情報を取得します。
    IIMAGE_GetInfo(pngimg, &info);

    // 一時保存用のビットマップを作成します。
    IDISPLAY_GetDeviceBitmap(display, &dst);
    IBITMAP_CreateCompatibleBitmap(dst, &tmpBmp, info.cx, info.cy);
    // 描画先のビットマップを設定します。
    IDISPLAY_SetDestination(display, tmpBmp);

    // 一時保存用のビットマップに描画します。
    IIMAGE_Draw(pngimg, 0, 0);

    // 描画先のビットマップをデフォルトに戻します。
    IDISPLAY_SetDestination(display, NULL);

    // ITransform インターフェイスを取得します。
    IBITMAP_QueryInterface(dst, AEECLSID_TRANSFORM, &trans);
    // 一時保存用のビットマップに描画した画像を、2 倍に拡大してデバイス画面に描画します。
    ITRANSFORM_TransformBltSimple(trans, 0, 0, tmpBmp, 0, 0, info.cx, info.cy, TRANSFORM_SCALE_2, COMPOSITE_OPAQUE);

    // インターフェイスを破棄します。
    ITRANSFORM_Release(trans);
    IBITMAP_Release(tmpBmp);
    IBITMAP_Release(dst);
    IIMAGE_Release(pngimg);
}

// 画面を更新します。
IDISPLAY_Update(display);

[ SophiaFramework を使用したコード ]

// リソース ファイルから読み込む PNG イメージのリソース ID
#define IDP_MY_PICTURE  0x0001

SFBShellSmp      shell   = SFBShell::GetInstance();
SFBDisplaySmp    display = SFBDisplay::GetInstance();
SFBImageSmp      pngimg;
SFBBitmapSmp     tmpBmp;
SFBBitmapSmp     dst;
SFBTransformSmp  trans;
AEEImageInfo     info    = {0};

// リソース ファイルから PNG イメージを読み込みます。
pngimg = shell->LoadResImage(MYRESOURCE_RES_FILE, IDP_MY_PICTURE);

if (pngimg != NULL) {
    // PNG イメージの情報を取得します。
    pngimg->GetInfo(&info);

    // 一時保存用のビットマップを作成します。
    display->GetDeviceBitmap(&dst);
    dst->CreateCompatibleBitmap(&tmpBmp, info.cx, info.cy);
    // 描画先のビットマップを設定します。
    display->SetDestination(tmpBmp);

    // 一時保存用のビットマップに描画します。
    pngimg->Draw(0, 0);

    // 描画先のビットマップをデフォルトに戻します。
    display->ResetDestination();

    // SFBTransform インスタンスを生成します。
    trans = SFBTransform::NewInstance(dst);
    // 一時保存用のビットマップに描画した画像を、2 倍に拡大してデバイス画面に描画します。
    trans->TransformBltSimple(0, 0, tmpBmp, 0, 0, info.cx, info.cy, TRANSFORM_SCALE_2, COMPOSITE_OPAQUE);
}

// 画面を更新します。
display->Update();
      

IGraphics インターフェースの IGRAPHICS_DrawLine や IGRAPHICS_DrawRect などで描画される図形の線の太さは、変更できますか ?

BREW 2.1 の IGraphics インターフェイスには、IGRAPHICS_DrawLine や IGRAPHICS_DrawRect などで描画される図形の線の太さを変更する関数はありません。

      

I3D の読み込みフォーマットとしては何が使われるんでしょうか?

I3D インターフェイスは、Q3D 形式のファイルを使用します。
Q3D ファイル形式とは、Qualcomm 社独自の 3D モデリングデータを扱うファイル形式のことです。

また、Qualcomm 社は、3D Studio MAX (3D モデリング ソフト) の形式 (.3ds) からQ3D 形式 (.q3d) へのコンバータを提供しており、Qualcomm 社のホームページからダウンロードできます。