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

Commit 2298fe22 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Avoid unnecessary copy when invoking drawBitmap(int[]) Bug #6483390" into jb-dev

parents 78cb7cf7 49c5fc0b
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -357,19 +357,26 @@ static void android_view_GLES20Canvas_drawBitmapMatrix(JNIEnv* env, jobject claz
static void android_view_GLES20Canvas_drawBitmapData(JNIEnv* env, jobject clazz,
        OpenGLRenderer* renderer, jintArray colors, jint offset, jint stride,
        jfloat left, jfloat top, jint width, jint height, jboolean hasAlpha, SkPaint* paint) {
    SkBitmap bitmap;
    SkBitmap::Config config = hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config;
    bitmap.setConfig(config, width, height);
    SkBitmap* bitmap = new SkBitmap;
    bitmap->setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config : SkBitmap::kRGB_565_Config,
            width, height);

    if (!bitmap.allocPixels()) {
    if (!bitmap->allocPixels()) {
        delete bitmap;
        return;
    }

    if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, bitmap)) {
    if (!GraphicsJNI::SetPixels(env, colors, offset, stride, 0, 0, width, height, *bitmap)) {
        delete bitmap;
        return;
    }

    renderer->drawBitmapData(&bitmap, left, top, paint);
    renderer->drawBitmapData(bitmap, left, top, paint);

    // If the renderer is a deferred renderer it will own the bitmap
    if (!renderer->isDeferred()) {
        delete bitmap;
    }
}

static void android_view_GLES20Canvas_drawBitmapMesh(JNIEnv* env, jobject clazz,
+32 −11
Original line number Diff line number Diff line
@@ -162,6 +162,13 @@ void DisplayList::clearResources() {
    }
    mBitmapResources.clear();

    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
        caches.resourceCache.decrementRefcount(bitmap);
        caches.resourceCache.destructor(bitmap);
    }
    mOwnedBitmapResources.clear();

    for (size_t i = 0; i < mFilterResources.size(); i++) {
        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
    }
@@ -224,6 +231,13 @@ void DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorde
        caches.resourceCache.incrementRefcount(resource);
    }

    const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
    for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
        SkBitmap* resource = ownedBitmapResources.itemAt(i);
        mOwnedBitmapResources.add(resource);
        caches.resourceCache.incrementRefcount(resource);
    }

    const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
    for (size_t i = 0; i < filterResources.size(); i++) {
        SkiaColorFilter* resource = filterResources.itemAt(i);
@@ -1036,10 +1050,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
                SkPaint* paint = getPaint(renderer);
                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
                        bitmap, x, y, paint);
                if (bitmap) {
                renderer.drawBitmap(bitmap, x, y, paint);
                    delete bitmap;
                }
            }
            break;
            case DrawBitmapMesh: {
@@ -1295,6 +1306,12 @@ void DisplayListRenderer::reset() {
    }
    mBitmapResources.clear();

    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
        caches.resourceCache.decrementRefcount(bitmap);
    }
    mOwnedBitmapResources.clear();

    for (size_t i = 0; i < mFilterResources.size(); i++) {
        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
    }
@@ -1336,6 +1353,10 @@ DisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
    return displayList;
}

bool DisplayListRenderer::isDeferred() {
    return true;
}

void DisplayListRenderer::setViewport(int width, int height) {
    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);

+15 −22
Original line number Diff line number Diff line
@@ -398,7 +398,6 @@ public:

private:
    void init();

    void initProperties();

    void clearResources();
@@ -424,16 +423,7 @@ private:
    }

    SkBitmap* getBitmapData() {
        SkBitmap* bitmap = new SkBitmap;
        bitmap->setConfig((SkBitmap::Config) getInt(), getInt(), getInt());
        if (!bitmap->allocPixels()) {
            delete bitmap;
            return NULL;
        }

        bitmap->setPixels((void*) mReader.skip(bitmap->height() * bitmap->rowBytes()));

        return bitmap;
        return (SkBitmap*) getInt();
    }

    SkiaShader* getShader() {
@@ -497,6 +487,7 @@ private:
    }

    Vector<SkBitmap*> mBitmapResources;
    Vector<SkBitmap*> mOwnedBitmapResources;
    Vector<SkiaColorFilter*> mFilterResources;

    Vector<SkPaint*> mPaints;
@@ -552,6 +543,8 @@ public:

    ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);

    virtual bool isDeferred();

    virtual void setViewport(int width, int height);
    virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
    virtual void finish();
@@ -634,6 +627,10 @@ public:
        return mBitmapResources;
    }

    const Vector<SkBitmap*>& getOwnedBitmapResources() const {
        return mOwnedBitmapResources;
    }

    const Vector<SkiaColorFilter*>& getFilterResources() const {
        return mFilterResources;
    }
@@ -719,17 +716,6 @@ private:
        mWriter.write(values, count * sizeof(int32_t));
    }

    void addBitmapData(SkBitmap* bitmap) {
        mWriter.writeInt(bitmap->config());
        mWriter.writeInt(bitmap->width());
        mWriter.writeInt(bitmap->height());

        SkAutoLockPixels alp(*bitmap);
        void* src = bitmap->getPixels();

        mWriter.write(src, bitmap->rowBytes() * bitmap->height());
    }

    void addUInts(const uint32_t* values, int8_t count) {
        mWriter.writeInt(count);
        mWriter.write(values, count * sizeof(uint32_t));
@@ -825,6 +811,12 @@ private:
        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
    }

    void addBitmapData(SkBitmap* bitmap) {
        addInt((int) bitmap);
        mOwnedBitmapResources.add(bitmap);
        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
    }

    inline void addShader(SkiaShader* shader) {
        if (!shader) {
            addInt((int) NULL);
@@ -851,6 +843,7 @@ private:
    }

    Vector<SkBitmap*> mBitmapResources;
    Vector<SkBitmap*> mOwnedBitmapResources;
    Vector<SkiaColorFilter*> mFilterResources;

    Vector<SkPaint*> mPaints;
+4 −0
Original line number Diff line number Diff line
@@ -144,6 +144,10 @@ uint32_t OpenGLRenderer::getStencilSize() {
    return STENCIL_BUFFER_SIZE;
}

bool OpenGLRenderer::isDeferred() {
    return false;
}

void OpenGLRenderer::setViewport(int width, int height) {
    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);

+2 −0
Original line number Diff line number Diff line
@@ -63,6 +63,8 @@ public:
    ANDROID_API OpenGLRenderer();
    virtual ~OpenGLRenderer();

    virtual bool isDeferred();

    virtual void setViewport(int width, int height);

    ANDROID_API void prepare(bool opaque);
+2 −2

File changed.

Contains only whitespace changes.

Loading