0

我是新来的——提出问题、android 开发和 NDK。我希望我足够清楚。

我需要能够创建多个表面/位图。例如

Surface s = new Surface (width, height)
  • 它们可以相互复制 s->copy (s2) 将表面 s 复制到 s2(包括 RGBA 和 alpha-text 表面之间的格式转换以及调整大小/缩放)
  • 使用 fill (x, u, w, h, color) - 用颜色填充矩形(类似于 glClear)

据我了解,您只有一个由 android_app->window 变量提供给您的 ANativeWindow,如果我使用 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_getInfo提供有关格式(ARGB_8888或仅 alpha)、尺寸、步幅或间距的信息。

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自己实现,因为位图只有基于像素的 getter 和 setter(请参阅 参考资料setPixels(..)

于 2012-08-02T14:12:43.437 回答