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

Commit c1e6a12a authored by Sergei Vasilinetc's avatar Sergei Vasilinetc Committed by Android (Google) Code Review
Browse files

Merge "Add createHardwareBitmap on GraphicBuffer for SysUI"

parents 325fa50d 9a029876
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;