summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author sergeyv <sergeyv@google.com> 2016-11-29 10:13:28 -0800
committer sergeyv <sergeyv@google.com> 2016-11-30 10:47:12 -0800
commit9a029876422926e313f646f44ab3592cfd4f9933 (patch)
treeb7e357e8a31c5b8f5f1b7863479dbc990b00f930
parent0ec10ac7cf551853272299c6e15bcf37b336e329 (diff)
Add createHardwareBitmap on GraphicBuffer for SysUI
Test: none bug:30999911 Change-Id: Ic396e25d9e587665e634c3192e14ef4bc3dc78f7
-rw-r--r--core/java/android/view/GraphicBuffer.java12
-rw-r--r--core/jni/android_view_GraphicBuffer.cpp16
-rw-r--r--libs/hwui/hwui/Bitmap.cpp22
-rw-r--r--libs/hwui/hwui/Bitmap.h4
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;