Loading core/jni/android/graphics/Bitmap.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -243,7 +243,8 @@ Bitmap* GraphicsJNI::getNativeBitmap(JNIEnv* env, jobject bitmap) { return localBitmap.valid() ? &localBitmap->bitmap() : nullptr; } SkImageInfo GraphicsJNI::getBitmapInfo(JNIEnv* env, jobject bitmap, uint32_t* outRowBytes) { SkImageInfo GraphicsJNI::getBitmapInfo(JNIEnv* env, jobject bitmap, uint32_t* outRowBytes, bool* isHardware) { SkASSERT(env); SkASSERT(bitmap); SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class)); Loading @@ -252,6 +253,9 @@ SkImageInfo GraphicsJNI::getBitmapInfo(JNIEnv* env, jobject bitmap, uint32_t* ou if (outRowBytes) { *outRowBytes = localBitmap->rowBytes(); } if (isHardware) { *isHardware = localBitmap->isHardware(); } return localBitmap->info(); } Loading core/jni/android/graphics/GraphicsJNI.h +2 −1 Original line number Diff line number Diff line Loading @@ -62,7 +62,8 @@ public: static android::Canvas* getNativeCanvas(JNIEnv*, jobject canvas); static android::Bitmap* getNativeBitmap(JNIEnv*, jobject bitmap); static SkImageInfo getBitmapInfo(JNIEnv*, jobject bitmap, uint32_t* outRowBytes); static SkImageInfo getBitmapInfo(JNIEnv*, jobject bitmap, uint32_t* outRowBytes, bool* isHardware); static SkRegion* getNativeRegion(JNIEnv*, jobject region); /* Loading core/jni/android/graphics/apex/android_bitmap.cpp +24 −6 Original line number Diff line number Diff line Loading @@ -78,7 +78,7 @@ static SkColorType getColorType(AndroidBitmapFormat format) { } } static uint32_t getInfoFlags(const SkImageInfo& info) { static uint32_t getAlphaFlags(const SkImageInfo& info) { switch (info.alphaType()) { case kUnknown_SkAlphaType: LOG_ALWAYS_FATAL("Bitmap has no alpha type"); Loading @@ -92,6 +92,14 @@ static uint32_t getInfoFlags(const SkImageInfo& info) { } } static uint32_t getInfoFlags(const SkImageInfo& info, bool isHardware) { uint32_t flags = getAlphaFlags(info); if (isHardware) { flags |= ANDROID_BITMAP_FLAGS_IS_HARDWARE; } return flags; } ABitmap* ABitmap_copy(ABitmap* srcBitmapHandle, AndroidBitmapFormat dstFormat) { SkColorType dstColorType = getColorType(dstFormat); if (srcBitmapHandle && dstColorType != kUnknown_SkColorType) { Loading @@ -108,19 +116,19 @@ ABitmap* ABitmap_copy(ABitmap* srcBitmapHandle, AndroidBitmapFormat dstFormat) { return nullptr; } static AndroidBitmapInfo getInfo(const SkImageInfo& imageInfo, uint32_t rowBytes) { static AndroidBitmapInfo getInfo(const SkImageInfo& imageInfo, uint32_t rowBytes, bool isHardware) { AndroidBitmapInfo info; info.width = imageInfo.width(); info.height = imageInfo.height(); info.stride = rowBytes; info.format = getFormat(imageInfo); info.flags = getInfoFlags(imageInfo); info.flags = getInfoFlags(imageInfo, isHardware); return info; } AndroidBitmapInfo ABitmap_getInfo(ABitmap* bitmapHandle) { Bitmap* bitmap = TypeCast::toBitmap(bitmapHandle); return getInfo(bitmap->info(), bitmap->rowBytes()); return getInfo(bitmap->info(), bitmap->rowBytes(), bitmap->isHardware()); } ADataSpace ABitmap_getDataSpace(ABitmap* bitmapHandle) { Loading @@ -131,8 +139,9 @@ ADataSpace ABitmap_getDataSpace(ABitmap* bitmapHandle) { AndroidBitmapInfo ABitmap_getInfoFromJava(JNIEnv* env, jobject bitmapObj) { uint32_t rowBytes = 0; SkImageInfo imageInfo = GraphicsJNI::getBitmapInfo(env, bitmapObj, &rowBytes); return getInfo(imageInfo, rowBytes); bool isHardware = false; SkImageInfo imageInfo = GraphicsJNI::getBitmapInfo(env, bitmapObj, &rowBytes, &isHardware); return getInfo(imageInfo, rowBytes, isHardware); } void* ABitmap_getPixels(ABitmap* bitmapHandle) { Loading Loading @@ -290,3 +299,12 @@ int ABitmap_compress(const AndroidBitmapInfo* info, ADataSpace dataSpace, const return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } } AHardwareBuffer* ABitmap_getHardwareBuffer(ABitmap* bitmapHandle) { Bitmap* bitmap = TypeCast::toBitmap(bitmapHandle); AHardwareBuffer* buffer = bitmap->hardwareBuffer(); if (buffer) { AHardwareBuffer_acquire(buffer); } return buffer; } core/jni/android/graphics/apex/include/android/graphics/bitmap.h +15 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ #include <jni.h> #include <sys/cdefs.h> struct AHardwareBuffer; __BEGIN_DECLS /** Loading Loading @@ -62,6 +64,18 @@ jobject ABitmapConfig_getConfigFromFormat(JNIEnv* env, AndroidBitmapFormat forma int ABitmap_compress(const AndroidBitmapInfo* info, ADataSpace dataSpace, const void* pixels, AndroidBitmapCompressFormat format, int32_t quality, void* userContext, AndroidBitmap_compress_write_fn); /** * Retrieve the native object associated with a HARDWARE Bitmap. * * Client must not modify it while a Bitmap is wrapping it. * * @param bitmap Handle to an android.graphics.Bitmap. * @return on success, a pointer to the * AHardwareBuffer associated with bitmap. This acquires * a reference on the buffer, and the client must call * AHardwareBuffer_release when finished with it. */ AHardwareBuffer* ABitmap_getHardwareBuffer(ABitmap* bitmap); __END_DECLS Loading Loading @@ -116,6 +130,7 @@ namespace graphics { ADataSpace getDataSpace() const { return ABitmap_getDataSpace(mBitmap); } void* getPixels() const { return ABitmap_getPixels(mBitmap); } void notifyPixelsChanged() const { ABitmap_notifyPixelsChanged(mBitmap); } AHardwareBuffer* getHardwareBuffer() const { return ABitmap_getHardwareBuffer(mBitmap); } private: // takes ownership of the provided ABitmap Loading native/graphics/jni/bitmap.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,21 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) { return ANDROID_BITMAP_RESULT_SUCCESS; } int AndroidBitmap_getHardwareBuffer(JNIEnv* env, jobject jbitmap, AHardwareBuffer** outBuffer) { if (NULL == env || NULL == jbitmap || NULL == outBuffer) { return ANDROID_BITMAP_RESULT_BAD_PARAMETER; } android::graphics::Bitmap bitmap(env, jbitmap); if (!bitmap.isValid()) { return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } *outBuffer = bitmap.getHardwareBuffer(); return *outBuffer == NULL ? ANDROID_BITMAP_RESULT_BAD_PARAMETER : ANDROID_BITMAP_RESULT_SUCCESS; } int AndroidBitmap_compress(const AndroidBitmapInfo* info, int32_t dataSpace, const void* pixels, Loading Loading
core/jni/android/graphics/Bitmap.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -243,7 +243,8 @@ Bitmap* GraphicsJNI::getNativeBitmap(JNIEnv* env, jobject bitmap) { return localBitmap.valid() ? &localBitmap->bitmap() : nullptr; } SkImageInfo GraphicsJNI::getBitmapInfo(JNIEnv* env, jobject bitmap, uint32_t* outRowBytes) { SkImageInfo GraphicsJNI::getBitmapInfo(JNIEnv* env, jobject bitmap, uint32_t* outRowBytes, bool* isHardware) { SkASSERT(env); SkASSERT(bitmap); SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class)); Loading @@ -252,6 +253,9 @@ SkImageInfo GraphicsJNI::getBitmapInfo(JNIEnv* env, jobject bitmap, uint32_t* ou if (outRowBytes) { *outRowBytes = localBitmap->rowBytes(); } if (isHardware) { *isHardware = localBitmap->isHardware(); } return localBitmap->info(); } Loading
core/jni/android/graphics/GraphicsJNI.h +2 −1 Original line number Diff line number Diff line Loading @@ -62,7 +62,8 @@ public: static android::Canvas* getNativeCanvas(JNIEnv*, jobject canvas); static android::Bitmap* getNativeBitmap(JNIEnv*, jobject bitmap); static SkImageInfo getBitmapInfo(JNIEnv*, jobject bitmap, uint32_t* outRowBytes); static SkImageInfo getBitmapInfo(JNIEnv*, jobject bitmap, uint32_t* outRowBytes, bool* isHardware); static SkRegion* getNativeRegion(JNIEnv*, jobject region); /* Loading
core/jni/android/graphics/apex/android_bitmap.cpp +24 −6 Original line number Diff line number Diff line Loading @@ -78,7 +78,7 @@ static SkColorType getColorType(AndroidBitmapFormat format) { } } static uint32_t getInfoFlags(const SkImageInfo& info) { static uint32_t getAlphaFlags(const SkImageInfo& info) { switch (info.alphaType()) { case kUnknown_SkAlphaType: LOG_ALWAYS_FATAL("Bitmap has no alpha type"); Loading @@ -92,6 +92,14 @@ static uint32_t getInfoFlags(const SkImageInfo& info) { } } static uint32_t getInfoFlags(const SkImageInfo& info, bool isHardware) { uint32_t flags = getAlphaFlags(info); if (isHardware) { flags |= ANDROID_BITMAP_FLAGS_IS_HARDWARE; } return flags; } ABitmap* ABitmap_copy(ABitmap* srcBitmapHandle, AndroidBitmapFormat dstFormat) { SkColorType dstColorType = getColorType(dstFormat); if (srcBitmapHandle && dstColorType != kUnknown_SkColorType) { Loading @@ -108,19 +116,19 @@ ABitmap* ABitmap_copy(ABitmap* srcBitmapHandle, AndroidBitmapFormat dstFormat) { return nullptr; } static AndroidBitmapInfo getInfo(const SkImageInfo& imageInfo, uint32_t rowBytes) { static AndroidBitmapInfo getInfo(const SkImageInfo& imageInfo, uint32_t rowBytes, bool isHardware) { AndroidBitmapInfo info; info.width = imageInfo.width(); info.height = imageInfo.height(); info.stride = rowBytes; info.format = getFormat(imageInfo); info.flags = getInfoFlags(imageInfo); info.flags = getInfoFlags(imageInfo, isHardware); return info; } AndroidBitmapInfo ABitmap_getInfo(ABitmap* bitmapHandle) { Bitmap* bitmap = TypeCast::toBitmap(bitmapHandle); return getInfo(bitmap->info(), bitmap->rowBytes()); return getInfo(bitmap->info(), bitmap->rowBytes(), bitmap->isHardware()); } ADataSpace ABitmap_getDataSpace(ABitmap* bitmapHandle) { Loading @@ -131,8 +139,9 @@ ADataSpace ABitmap_getDataSpace(ABitmap* bitmapHandle) { AndroidBitmapInfo ABitmap_getInfoFromJava(JNIEnv* env, jobject bitmapObj) { uint32_t rowBytes = 0; SkImageInfo imageInfo = GraphicsJNI::getBitmapInfo(env, bitmapObj, &rowBytes); return getInfo(imageInfo, rowBytes); bool isHardware = false; SkImageInfo imageInfo = GraphicsJNI::getBitmapInfo(env, bitmapObj, &rowBytes, &isHardware); return getInfo(imageInfo, rowBytes, isHardware); } void* ABitmap_getPixels(ABitmap* bitmapHandle) { Loading Loading @@ -290,3 +299,12 @@ int ABitmap_compress(const AndroidBitmapInfo* info, ADataSpace dataSpace, const return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } } AHardwareBuffer* ABitmap_getHardwareBuffer(ABitmap* bitmapHandle) { Bitmap* bitmap = TypeCast::toBitmap(bitmapHandle); AHardwareBuffer* buffer = bitmap->hardwareBuffer(); if (buffer) { AHardwareBuffer_acquire(buffer); } return buffer; }
core/jni/android/graphics/apex/include/android/graphics/bitmap.h +15 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ #include <jni.h> #include <sys/cdefs.h> struct AHardwareBuffer; __BEGIN_DECLS /** Loading Loading @@ -62,6 +64,18 @@ jobject ABitmapConfig_getConfigFromFormat(JNIEnv* env, AndroidBitmapFormat forma int ABitmap_compress(const AndroidBitmapInfo* info, ADataSpace dataSpace, const void* pixels, AndroidBitmapCompressFormat format, int32_t quality, void* userContext, AndroidBitmap_compress_write_fn); /** * Retrieve the native object associated with a HARDWARE Bitmap. * * Client must not modify it while a Bitmap is wrapping it. * * @param bitmap Handle to an android.graphics.Bitmap. * @return on success, a pointer to the * AHardwareBuffer associated with bitmap. This acquires * a reference on the buffer, and the client must call * AHardwareBuffer_release when finished with it. */ AHardwareBuffer* ABitmap_getHardwareBuffer(ABitmap* bitmap); __END_DECLS Loading Loading @@ -116,6 +130,7 @@ namespace graphics { ADataSpace getDataSpace() const { return ABitmap_getDataSpace(mBitmap); } void* getPixels() const { return ABitmap_getPixels(mBitmap); } void notifyPixelsChanged() const { ABitmap_notifyPixelsChanged(mBitmap); } AHardwareBuffer* getHardwareBuffer() const { return ABitmap_getHardwareBuffer(mBitmap); } private: // takes ownership of the provided ABitmap Loading
native/graphics/jni/bitmap.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,21 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) { return ANDROID_BITMAP_RESULT_SUCCESS; } int AndroidBitmap_getHardwareBuffer(JNIEnv* env, jobject jbitmap, AHardwareBuffer** outBuffer) { if (NULL == env || NULL == jbitmap || NULL == outBuffer) { return ANDROID_BITMAP_RESULT_BAD_PARAMETER; } android::graphics::Bitmap bitmap(env, jbitmap); if (!bitmap.isValid()) { return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } *outBuffer = bitmap.getHardwareBuffer(); return *outBuffer == NULL ? ANDROID_BITMAP_RESULT_BAD_PARAMETER : ANDROID_BITMAP_RESULT_SUCCESS; } int AndroidBitmap_compress(const AndroidBitmapInfo* info, int32_t dataSpace, const void* pixels, Loading