Merge changes Id701f7c7,I660bbcd1
* changes: Add Bitmap#getHardwareBuffer [HWUI] Remove private references to AHardwareBuffer
This commit is contained in:
committed by
Android (Google) Code Review
commit
3a67ac7f52
@@ -19,11 +19,10 @@
|
||||
#include <utils/Color.h>
|
||||
|
||||
#ifdef __ANDROID__ // Layoutlib does not support graphic buffer, parcel or render thread
|
||||
#include <binder/Parcel.h>
|
||||
#include <renderthread/RenderProxy.h>
|
||||
#include <android_runtime/android_graphics_GraphicBuffer.h>
|
||||
#include <android_runtime/android_hardware_HardwareBuffer.h>
|
||||
#include <private/android/AHardwareBufferHelpers.h>
|
||||
#include <binder/Parcel.h>
|
||||
#include <dlfcn.h>
|
||||
#include <renderthread/RenderProxy.h>
|
||||
#endif
|
||||
|
||||
#include "core_jni_helpers.h"
|
||||
@@ -1027,11 +1026,18 @@ static jobject Bitmap_copyPreserveInternalConfig(JNIEnv* env, jobject, jlong bit
|
||||
return createBitmap(env, bitmap.release(), getPremulBitmapCreateFlags(false));
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__ // Layoutlib does not support graphic buffer
|
||||
typedef AHardwareBuffer* (*AHB_from_HB)(JNIEnv*, jobject);
|
||||
AHB_from_HB AHardwareBuffer_fromHardwareBuffer;
|
||||
|
||||
typedef jobject (*AHB_to_HB)(JNIEnv*, AHardwareBuffer*);
|
||||
AHB_to_HB AHardwareBuffer_toHardwareBuffer;
|
||||
#endif
|
||||
|
||||
static jobject Bitmap_wrapHardwareBufferBitmap(JNIEnv* env, jobject, jobject hardwareBuffer,
|
||||
jlong colorSpacePtr) {
|
||||
#ifdef __ANDROID__ // Layoutlib does not support graphic buffer
|
||||
AHardwareBuffer* buffer = android_hardware_HardwareBuffer_getNativeHardwareBuffer(env,
|
||||
hardwareBuffer);
|
||||
AHardwareBuffer* buffer = AHardwareBuffer_fromHardwareBuffer(env, hardwareBuffer);
|
||||
sk_sp<Bitmap> bitmap = Bitmap::createFrom(buffer,
|
||||
GraphicsJNI::getNativeColorSpace(colorSpacePtr));
|
||||
if (!bitmap.get()) {
|
||||
@@ -1057,6 +1063,19 @@ static jobject Bitmap_createGraphicBufferHandle(JNIEnv* env, jobject, jlong bitm
|
||||
#endif
|
||||
}
|
||||
|
||||
static jobject Bitmap_getHardwareBuffer(JNIEnv* env, jobject, jlong bitmapPtr) {
|
||||
#ifdef __ANDROID__ // Layoutlib does not support graphic buffer
|
||||
LocalScopedBitmap bitmapHandle(bitmapPtr);
|
||||
LOG_ALWAYS_FATAL_IF(!bitmapHandle->isHardware(),
|
||||
"Hardware config is only supported config in Bitmap_getHardwareBuffer");
|
||||
|
||||
Bitmap& bitmap = bitmapHandle->bitmap();
|
||||
return AHardwareBuffer_toHardwareBuffer(env, bitmap.hardwareBuffer());
|
||||
#else
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
static jboolean Bitmap_isImmutable(CRITICAL_JNI_PARAMS_COMMA jlong bitmapHandle) {
|
||||
LocalScopedBitmap bitmapHolder(bitmapHandle);
|
||||
if (!bitmapHolder.valid()) return JNI_FALSE;
|
||||
@@ -1123,6 +1142,8 @@ static const JNINativeMethod gBitmapMethods[] = {
|
||||
(void*) Bitmap_wrapHardwareBufferBitmap },
|
||||
{ "nativeCreateGraphicBufferHandle", "(J)Landroid/graphics/GraphicBuffer;",
|
||||
(void*) Bitmap_createGraphicBufferHandle },
|
||||
{ "nativeGetHardwareBuffer", "(J)Landroid/hardware/HardwareBuffer;",
|
||||
(void*) Bitmap_getHardwareBuffer },
|
||||
{ "nativeComputeColorSpace", "(J)Landroid/graphics/ColorSpace;", (void*)Bitmap_computeColorSpace },
|
||||
{ "nativeSetColorSpace", "(JJ)V", (void*)Bitmap_setColorSpace },
|
||||
{ "nativeIsSRGB", "(J)Z", (void*)Bitmap_isSRGB },
|
||||
@@ -1140,6 +1161,18 @@ int register_android_graphics_Bitmap(JNIEnv* env)
|
||||
gBitmap_nativePtr = GetFieldIDOrDie(env, gBitmap_class, "mNativePtr", "J");
|
||||
gBitmap_constructorMethodID = GetMethodIDOrDie(env, gBitmap_class, "<init>", "(JIIIZ[BLandroid/graphics/NinePatch$InsetStruct;Z)V");
|
||||
gBitmap_reinitMethodID = GetMethodIDOrDie(env, gBitmap_class, "reinit", "(IIZ)V");
|
||||
|
||||
#ifdef __ANDROID__ // Layoutlib does not support graphic buffer
|
||||
void* handle_ = dlopen("libandroid.so", RTLD_NOW | RTLD_NODELETE);
|
||||
AHardwareBuffer_fromHardwareBuffer =
|
||||
(AHB_from_HB)dlsym(handle_, "AHardwareBuffer_fromHardwareBuffer");
|
||||
LOG_ALWAYS_FATAL_IF(AHardwareBuffer_fromHardwareBuffer == nullptr,
|
||||
"Failed to find required symbol AHardwareBuffer_fromHardwareBuffer!");
|
||||
|
||||
AHardwareBuffer_toHardwareBuffer = (AHB_to_HB)dlsym(handle_, "AHardwareBuffer_toHardwareBuffer");
|
||||
LOG_ALWAYS_FATAL_IF(AHardwareBuffer_toHardwareBuffer == nullptr,
|
||||
" Failed to find required symbol AHardwareBuffer_toHardwareBuffer!");
|
||||
#endif
|
||||
return android::RegisterMethodsOrDie(env, "android/graphics/Bitmap", gBitmapMethods,
|
||||
NELEM(gBitmapMethods));
|
||||
}
|
||||
|
||||
@@ -2243,6 +2243,19 @@ public final class Bitmap implements Parcelable {
|
||||
return nativeCreateGraphicBufferHandle(mNativePtr);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link HardwareBuffer} which is internally used by hardware bitmap
|
||||
*
|
||||
* Note: the HardwareBuffer does *not* have an associated {@link ColorSpace}.
|
||||
* To render this object the same as its rendered with this Bitmap, you
|
||||
* should also call {@link getColorSpace}.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public HardwareBuffer getHardwareBuffer() {
|
||||
return nativeGetHardwareBuffer(mNativePtr);
|
||||
}
|
||||
|
||||
//////////// native methods
|
||||
|
||||
private static native Bitmap nativeCreate(int[] colors, int offset,
|
||||
@@ -2308,6 +2321,7 @@ public final class Bitmap implements Parcelable {
|
||||
private static native Bitmap nativeWrapHardwareBufferBitmap(HardwareBuffer buffer,
|
||||
long nativeColorSpace);
|
||||
private static native GraphicBuffer nativeCreateGraphicBufferHandle(long nativeBitmap);
|
||||
private static native HardwareBuffer nativeGetHardwareBuffer(long nativeBitmap);
|
||||
private static native ColorSpace nativeComputeColorSpace(long nativePtr);
|
||||
private static native void nativeSetColorSpace(long nativePtr, long nativeColorSpace);
|
||||
private static native boolean nativeIsSRGB(long nativePtr);
|
||||
|
||||
Reference in New Issue
Block a user