diff options
| author | 2016-11-29 10:13:28 -0800 | |
|---|---|---|
| committer | 2016-11-30 10:47:12 -0800 | |
| commit | 9a029876422926e313f646f44ab3592cfd4f9933 (patch) | |
| tree | b7e357e8a31c5b8f5f1b7863479dbc990b00f930 | |
| parent | 0ec10ac7cf551853272299c6e15bcf37b336e329 (diff) | |
Add createHardwareBitmap on GraphicBuffer for SysUI
Test: none
bug:30999911
Change-Id: Ic396e25d9e587665e634c3192e14ef4bc3dc78f7
| -rw-r--r-- | core/java/android/view/GraphicBuffer.java | 12 | ||||
| -rw-r--r-- | core/jni/android_view_GraphicBuffer.cpp | 16 | ||||
| -rw-r--r-- | libs/hwui/hwui/Bitmap.cpp | 22 | ||||
| -rw-r--r-- | libs/hwui/hwui/Bitmap.h | 4 |
4 files changed, 46 insertions, 8 deletions
diff --git a/core/java/android/view/GraphicBuffer.java b/core/java/android/view/GraphicBuffer.java index 5f2a9cd45eda..64611d0bfd68 100644 --- a/core/java/android/view/GraphicBuffer.java +++ b/core/java/android/view/GraphicBuffer.java @@ -16,6 +16,7 @@ package android.view; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.PixelFormat; import android.graphics.Rect; @@ -264,6 +265,16 @@ public class GraphicBuffer implements Parcelable { nWriteGraphicBufferToParcel(mNativeObject, dest); } + /** + * Create hardware bitmap backed by this GraphicBuffer. + * + * @return Bitmap or null if this GraphicBuffer has unsupported PixelFormat. + * currently PIXEL_FORMAT_RGBA_8888 is the only supported format + */ + public Bitmap createHardwareBitmap() { + return nCreateHardwareBitmap(mNativeObject); + } + public static final Parcelable.Creator<GraphicBuffer> CREATOR = new Parcelable.Creator<GraphicBuffer>() { public GraphicBuffer createFromParcel(Parcel in) { @@ -289,4 +300,5 @@ public class GraphicBuffer implements Parcelable { private static native long nReadGraphicBufferFromParcel(Parcel in); private static native boolean nLockCanvas(long nativeObject, Canvas canvas, Rect dirty); private static native boolean nUnlockCanvasAndPost(long nativeObject, Canvas canvas); + private static native Bitmap nCreateHardwareBitmap(long nativeObject); } diff --git a/core/jni/android_view_GraphicBuffer.cpp b/core/jni/android_view_GraphicBuffer.cpp index b9376d8c6e66..4b105ca6276c 100644 --- a/core/jni/android_view_GraphicBuffer.cpp +++ b/core/jni/android_view_GraphicBuffer.cpp @@ -22,6 +22,7 @@ #include "android_os_Parcel.h" #include "android_view_GraphicBuffer.h" #include "android/graphics/GraphicsJNI.h" +#include "Bitmap.h" #include <android_runtime/AndroidRuntime.h> @@ -32,6 +33,7 @@ #include <gui/IGraphicBufferAlloc.h> #include <gui/ISurfaceComposer.h> +#include <hwui/Bitmap.h> #include <SkCanvas.h> #include <SkBitmap.h> @@ -247,6 +249,17 @@ static jlong android_view_GraphiceBuffer_read(JNIEnv* env, jobject clazz, return NULL; } +static jobject android_view_GraphicBuffer_createHardwareBitmap(JNIEnv* env, jobject, + jlong wrapperHandle) { + GraphicBufferWrapper* wrapper = reinterpret_cast<GraphicBufferWrapper*>(wrapperHandle); + sk_sp<Bitmap> bitmap = Bitmap::createFrom(wrapper->buffer); + if (!bitmap.get()) { + ALOGW("failed to create hardware bitmap from graphic buffer"); + return NULL; + } + return bitmap::createBitmap(env, bitmap.release(), android::bitmap::kBitmapCreateFlag_None); +} + // ---------------------------------------------------------------------------- // External helpers // ---------------------------------------------------------------------------- @@ -282,6 +295,9 @@ static const JNINativeMethod gMethods[] = { (void*) android_view_GraphicBuffer_lockCanvas }, { "nUnlockCanvasAndPost", "(JLandroid/graphics/Canvas;)Z", (void*) android_view_GraphicBuffer_unlockCanvasAndPost }, + { "nCreateHardwareBitmap", "(J)Landroid/graphics/Bitmap;", + (void*) android_view_GraphicBuffer_createHardwareBitmap + } }; int register_android_view_GraphicBuffer(JNIEnv* env) { diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp index d6b6548c47e2..d3e765dbfbd1 100644 --- a/libs/hwui/hwui/Bitmap.cpp +++ b/libs/hwui/hwui/Bitmap.cpp @@ -246,7 +246,7 @@ sk_sp<Bitmap> Bitmap::allocateHardwareBitmap(uirenderer::renderthread::RenderThr if (!uploadBitmapToGraphicBuffer(caches, bitmap, *buffer, format, type)) { return nullptr; } - return sk_sp<Bitmap>(new Bitmap(std::move(buffer), info)); + return sk_sp<Bitmap>(new Bitmap(buffer.get(), info)); } sk_sp<Bitmap> Bitmap::allocateHardwareBitmap(SkBitmap& bitmap) { @@ -301,6 +301,16 @@ sk_sp<Bitmap> Bitmap::createFrom(const SkImageInfo& info, SkPixelRef& pixelRef) info, pixelRef.rowBytes(), pixelRef.colorTable())); } +sk_sp<Bitmap> Bitmap::createFrom(sp<GraphicBuffer> graphicBuffer) { + PixelFormat format = graphicBuffer->getPixelFormat(); + if (!graphicBuffer.get() || format != PIXEL_FORMAT_RGBA_8888) { + return nullptr; + } + SkImageInfo info = SkImageInfo::Make(graphicBuffer->getWidth(), graphicBuffer->getHeight(), + kRGBA_8888_SkColorType, kPremul_SkAlphaType); + return sk_sp<Bitmap>(new Bitmap(graphicBuffer.get(), info)); +} + void Bitmap::reconfigure(const SkImageInfo& newInfo, size_t rowBytes, SkColorTable* ctable) { if (kIndex_8_SkColorType != newInfo.colorType()) { ctable = nullptr; @@ -360,16 +370,14 @@ Bitmap::Bitmap(void* address, int fd, size_t mappedSize, reconfigure(info, rowBytes, ctable); } -Bitmap::Bitmap(sp<GraphicBuffer>&& buffer, const SkImageInfo& info) +Bitmap::Bitmap(GraphicBuffer* buffer, const SkImageInfo& info) : SkPixelRef(info) , mPixelStorageType(PixelStorageType::Hardware) { - auto rawBuffer = buffer.get(); - mPixelStorage.hardware.buffer = rawBuffer; - if (rawBuffer) { - rawBuffer->incStrong(rawBuffer); - } + mPixelStorage.hardware.buffer = buffer; + buffer->incStrong(buffer); mRowBytes = bytesPerPixel(buffer->getPixelFormat()) * buffer->getStride(); } + Bitmap::~Bitmap() { switch (mPixelStorageType) { case PixelStorageType::External: diff --git a/libs/hwui/hwui/Bitmap.h b/libs/hwui/hwui/Bitmap.h index 663238ca43f2..518be032c0eb 100644 --- a/libs/hwui/hwui/Bitmap.h +++ b/libs/hwui/hwui/Bitmap.h @@ -52,6 +52,8 @@ public: static sk_sp<Bitmap> allocateAshmemBitmap(size_t allocSize, const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable); + static sk_sp<Bitmap> createFrom(sp<GraphicBuffer> graphicBuffer); + static sk_sp<Bitmap> createFrom(const SkImageInfo&, SkPixelRef&); static sk_sp<Bitmap> allocateHardwareBitmap(uirenderer::renderthread::RenderThread&, @@ -63,7 +65,6 @@ public: const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable); Bitmap(void* address, int fd, size_t mappedSize, const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable); - Bitmap(sp<GraphicBuffer>&& buffer, const SkImageInfo& info); int width() const { return info().width(); } int height() const { return info().height(); } @@ -113,6 +114,7 @@ protected: virtual void onUnlockPixels() override { }; virtual size_t getAllocatedSizeInBytes() const override; private: + Bitmap(GraphicBuffer* buffer, const SkImageInfo& info); virtual ~Bitmap(); void* getStorage() const; |