TextureHelper: add overload with a release callback.

Fixes #2909.
This commit is contained in:
Philip Rideout
2020-08-05 14:56:33 -07:00
parent 4f239c3e3c
commit 2727cddd7a
5 changed files with 100 additions and 4 deletions

View File

@@ -404,7 +404,36 @@ public:
}
}
AutoBitmap(JNIEnv* env, jobject bitmap, jobject handler, jobject runnable) noexcept
: mEnv(env)
, mBitmap(env->NewGlobalRef(bitmap))
, mHandler(env->NewGlobalRef(handler))
, mCallback(env->NewGlobalRef(runnable))
{
initCallbackJni(env, mCallbackUtils);
if (mBitmap) {
AndroidBitmap_getInfo(mEnv, mBitmap, &mInfo);
AndroidBitmap_lockPixels(mEnv, mBitmap, &mData);
}
}
~AutoBitmap() noexcept {
if (mHandler && mCallback) {
#ifdef ANDROID
if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.handlerClass)) {
mEnv->CallBooleanMethod(mHandler, mCallbackUtils.post, mCallback);
}
#endif
if (mEnv->IsInstanceOf(mHandler, mCallbackUtils.executorClass)) {
mEnv->CallVoidMethod(mHandler, mCallbackUtils.execute, mCallback);
}
}
mEnv->DeleteGlobalRef(mHandler);
mEnv->DeleteGlobalRef(mCallback);
#ifdef ANDROID
mEnv->DeleteGlobalRef(mCallbackUtils.handlerClass);
#endif
mEnv->DeleteGlobalRef(mCallbackUtils.executorClass);
if (mBitmap) {
AndroidBitmap_unlockPixels(mEnv, mBitmap);
mEnv->DeleteGlobalRef(mBitmap);
@@ -453,11 +482,19 @@ public:
return new AutoBitmap(env, bitmap);
}
static AutoBitmap* make(Engine* engine, JNIEnv* env, jobject bitmap,
jobject handler, jobject runnable) {
return new AutoBitmap(env, bitmap, handler, runnable);
}
private:
JNIEnv* mEnv;
void* mData = nullptr;
jobject mBitmap = nullptr;
jobject mHandler = nullptr;
jobject mCallback = nullptr;
AndroidBitmapInfo mInfo;
CallbackJni mCallbackUtils;
};
extern "C"
@@ -483,4 +520,27 @@ Java_com_google_android_filament_android_TextureHelper_nSetBitmap(JNIEnv* env, j
std::move(desc));
}
extern "C"
JNIEXPORT void JNICALL
Java_com_google_android_filament_android_TextureHelper_nSetBitmapWithCallback(JNIEnv* env, jclass,
jlong nativeTexture, jlong nativeEngine, jint level, jint xoffset, jint yoffset,
jint width, jint height, jobject bitmap, jint format, jobject handler, jobject runnable) {
Texture* texture = (Texture*) nativeTexture;
Engine *engine = (Engine *) nativeEngine;
auto* autoBitmap = AutoBitmap::make(engine, env, bitmap, handler, runnable);
Texture::PixelBufferDescriptor desc(
autoBitmap->getData(),
autoBitmap->getSizeInBytes(),
autoBitmap->getFormat(format),
autoBitmap->getType(format),
&AutoBitmap::invoke, autoBitmap);
texture->setImage(*engine, (size_t) level,
(uint32_t) xoffset, (uint32_t) yoffset,
(uint32_t) width, (uint32_t) height,
std::move(desc));
}
#endif