Loading core/java/android/view/GraphicBuffer.java +12 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.view; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.PixelFormat; import android.graphics.Rect; Loading Loading @@ -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) { Loading @@ -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); } core/jni/android_view_GraphicBuffer.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -32,6 +33,7 @@ #include <gui/IGraphicBufferAlloc.h> #include <gui/ISurfaceComposer.h> #include <hwui/Bitmap.h> #include <SkCanvas.h> #include <SkBitmap.h> Loading Loading @@ -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 // ---------------------------------------------------------------------------- Loading Loading @@ -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) { Loading libs/hwui/hwui/Bitmap.cpp +15 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -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: Loading libs/hwui/hwui/Bitmap.h +3 −1 Original line number Diff line number Diff line Loading @@ -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&, Loading @@ -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(); } Loading Loading @@ -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; Loading Loading
core/java/android/view/GraphicBuffer.java +12 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.view; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.PixelFormat; import android.graphics.Rect; Loading Loading @@ -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) { Loading @@ -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); }
core/jni/android_view_GraphicBuffer.cpp +16 −0 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -32,6 +33,7 @@ #include <gui/IGraphicBufferAlloc.h> #include <gui/ISurfaceComposer.h> #include <hwui/Bitmap.h> #include <SkCanvas.h> #include <SkBitmap.h> Loading Loading @@ -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 // ---------------------------------------------------------------------------- Loading Loading @@ -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) { Loading
libs/hwui/hwui/Bitmap.cpp +15 −7 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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; Loading Loading @@ -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: Loading
libs/hwui/hwui/Bitmap.h +3 −1 Original line number Diff line number Diff line Loading @@ -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&, Loading @@ -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(); } Loading Loading @@ -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; Loading