クリッピングとは ?
クリッピングとは、描画を行う際に、 特定の範囲からはみだした部分を表示しないようにする処理のことです。 例えば、ウィンドウの表示領域を超えて図形が描画された場合でも、 図形がウィンドウからはみだすことはなく、 ウィンドウの境界で切り取られます。 これは、ウィンドウの表示領域の範囲でクリッピングされているためです。
クリッピングとは、描画を行う際に、 特定の範囲からはみだした部分を表示しないようにする処理のことです。 例えば、ウィンドウの表示領域を超えて図形が描画された場合でも、 図形がウィンドウからはみだすことはなく、 ウィンドウの境界で切り取られます。 これは、ウィンドウの表示領域の範囲でクリッピングされているためです。
IGraphics インターフェイスの IGRAPHICS_SetClip 関数や、IDisplay インターフェイスの IDISPLAY_SetClipRect 関数を使用してクリッピングの範囲を設定できます。
SophiaFramework では、 SFXGraphics::SetClip 関数やSFBGraphics::SetClip 関数や SFBDisplay::SetClipRect 関数を使用します。
// // クリッピングを使用して、円形の表示領域内に四角形を描画します。 // 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);
// // クリッピングを使用して、円形の表示領域内に四角形を描画します。 // 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 では、SFBGraphics や SFXGraphics の各関数を使用します。
図形の描画をするため、以下の関数を記載します。
関数名 [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 |
扇形を描画します。 |
角の丸い四角形を描画するサンプル コードを、以下に示します。
// // 角の丸い四角形を描画します。 // 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);
// // 角の丸い四角形を描画します。 // 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 |
※ 読み込み時間は、あくまで目安です。
BREW 2.1 では、JPEG や PNG の拡大、縮小はサポートされていませんが、 ビットマップの拡大、縮小はサポートされています。 そこで、JPEG や PNG を拡大して描画する場合はビットマップに画像を描画し、 ITRANSFORM_TransformBltComplex() や ITRANSFORM_TransformBltSimple() を使用します。
SophiaFramework では、 SFBTransform::TransformBltSimple 関数や SFBTransform::TransformBltComplex 関数を使用して、ビットマップに描画後の PNG イメージを拡大します。
以下のサンプルコードでは、 PNG イメージをリソースファイルから読み込み、 2 倍に拡大して表示します。
// リソース ファイルから読み込む 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);
// リソース ファイルから読み込む 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();
BREW 2.1 の IGraphics インターフェイスには、IGRAPHICS_DrawLine や IGRAPHICS_DrawRect などで描画される図形の線の太さを変更する関数はありません。
I3D インターフェイスは、Q3D 形式のファイルを使用します。Q3D ファイル形式とは、Qualcomm 社独自の 3D モデリングデータを扱うファイル形式のことです。
また、Qualcomm 社は、3D Studio MAX (3D モデリング ソフト) の形式 (.3ds) からQ3D 形式 (.q3d) へのコンバータを提供しており、Qualcomm 社のホームページからダウンロードできます。