0

私はこれが初めてです-質問、Android開発、NDKを求めています。私は十分に明確であることを願っています。

複数のサーフェス/ビットマップを作成できる必要があります。例えば

Surface s = new Surface (width, height)
  • s->copy (s2) サーフェス s を s2 にコピー (RGBA とアルファテキスト サーフェス間のフォーマット変換とサイズ変更/スケーリングを含む)
  • fill (x, u, w, h, color) を使用 - 四角形を色で塗りつぶします (glClear のようなもの)

私が理解している限り、android_app->window 変数によって提供される ANativeWindow は 1 つしかなく、EGL を使用する場合は最大 1 つの EGLSurface を作成できます。多くのサーフェス (たとえば ~ 100) を作成できる必要があります。これはどのように可能ですか?そして、それらすべてをウィンドウフレームバッファにブリットします

android/bitmap.h もありますが、正確な操作方法がわかりません。しかし、すでに作成されているか、このようなものを取得するためだけに、サーフェスを作成するための API は提供されませんか?

4

2 に答える 2

1

JNI 呼び出しでビットマップを作成できます。

// setup bitmap class
jclass bitmap_class = (jclass)env->FindClass ("android/graphics/Bitmap");
// setup create method
jmethodID bitmap_create_method = env->GetStaticMethodID (bitmap_class, "createBitmap", "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
// get_enum_value return jobject corresponding in our case to Bitmap.Config.ARGB_8888. (the implentation is irrelevant here)
jobject bitmap_config_ARGB = get_enum_value ("android/graphics/Bitmap$Config", "ARGB_8888");
// Do not forget to call DeleteLocalRef where appropriate

// create the bitmap by calling the CreateBitmap method
// Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
jobject bitmap =  env->CallStaticObjectMethod (bitmap_class, bitmap_create_method, width, height, bconfig);

// at the end of course clean-up must be done
env->DeleteLocalRef (bitmap);

の API を介して、いくつかのビットマップ プロパティと生のピクセルにアクセスできます。android/bitmap.h

AndroidBitmap_getInfoARGB_8888形式 (またはアルファのみ)、寸法、歩幅、またはピッチに関する情報を提供します。

AndroidBitmap_lockPixels生のピクセルを与えます。ピクセルの操作が終了したら、呼び出す必要がありますAndroidBitmap_unlockPixels


作るfill (color, dimension)

JNI がお手伝いします。これは、JNI 呼び出しを介して記述できます (Java を使用します。これは、記述が簡単で読みやすいためです)。

canvas.save ();
canvas.setBitmap (bitmap);
canvas.clipRect (left, top, right, bottom, Region.Op.REPLACE);
canvas.drawColor (color,  PorterDuff.Mode.SRC);
canvas.restore ();

あるビットマップを別のビットマップにコピーするには -copy (src_bitmap, src_rect, dest_rect)

canvas.save ();
canvas.setBitmap (dest_bitmap);
canvas.clipRect (left, top, right, bottom, Region.Op.REPLACE);
canvas.drawBitmap (src_bitmap, src_rect, dest_rect, null);
canvas.restore ();
于 2013-03-12T13:40:08.130 に答える
0

ビットマップを作成して jnigraphics ライブラリ (android/bitmap.h) を使用するか、複数の EGL テクスチャを使用できます。

fillビットマップにはピクセルベースのゲッターとセッターしかないため、ビットマップを使用する場合は自分で実装する必要があります(「 」を参照setPixels(..)) 。

于 2012-08-02T14:12:43.437 に答える