Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9a029876 authored by sergeyv's avatar sergeyv
Browse files

Add createHardwareBitmap on GraphicBuffer for SysUI

Test: none
bug:30999911
Change-Id: Ic396e25d9e587665e634c3192e14ef4bc3dc78f7
parent 0ec10ac7
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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);
}
+16 −0
Original line number Diff line number Diff line
@@ -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) {
+15 −7
Original line number Diff line number Diff line
@@ -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:
+3 −1
Original line number Diff line number Diff line
@@ -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;