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

Commit 996fe656 authored by Chris Craik's avatar Chris Craik
Browse files

Correct bitmap merging logic

bug:10863163

This fixes two issues

The check for pure translation was incorrect. It was fixed and renamed
for clarity.

Certain matrix paths weren't setting kTypePositiveScale. For
simplicity (and because positive scale is simple to check) removed
flag in favor of dynamic checking.

Change-Id: Ic5ce235653ef49a68b8b242bd89fc2e95874ecc9
parent 564c45b9
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -772,7 +772,7 @@ public:
        TextureVertex* vertex = &vertices[0];

        const bool hasLayer = renderer.hasLayer();
        bool transformed = false;
        bool pureTranslate = true;

        // TODO: manually handle rect clip for bitmaps by adjusting texCoords per op,
        // and allowing them to be merged in getBatchId()
@@ -782,7 +782,7 @@ public:
            // When we reach multiDraw(), the matrix can be either
            // pureTranslate or simple (translate and/or scale).
            // If the matrix is not pureTranslate, then we have a scale
            if (state.mMatrix.isPureTranslate()) transformed = true;
            pureTranslate &= state.mMatrix.isPureTranslate();

            Rect texCoords(0, 0, 1, 1);
            ((DrawBitmapOp*) ops[i].op)->mUvMapper.map(texCoords);
@@ -801,7 +801,7 @@ public:
        }

        return renderer.drawBitmaps(mBitmap, mEntry, ops.size(), &vertices[0],
                transformed, bounds, mPaint);
                pureTranslate, bounds, mPaint);
    }

    virtual void output(int level, uint32_t logFlags) const {
+1 −5
Original line number Diff line number Diff line
@@ -110,10 +110,6 @@ uint8_t Matrix4::getType() const {
                mType |= kTypeRectToRect;
            }
        }

        if (m00 > 0.0f && m11 > 0.0f) {
            mType |= kTypePositiveScale;
        }
    }
    return mType;
}
@@ -127,7 +123,7 @@ bool Matrix4::rectToRect() const {
}

bool Matrix4::positiveScale() const {
    return getType() & kTypePositiveScale;
    return (data[kScaleX] > 0.0f && data[kScaleY] > 0.0f);
}

bool Matrix4::changesBounds() const {
+1 −2
Original line number Diff line number Diff line
@@ -64,8 +64,7 @@ public:
        kTypeAffine = 0x4,
        kTypePerspective = 0x8,
        kTypeRectToRect = 0x10,
        kTypePositiveScale = 0x20,
        kTypeUnknown = 0x40,
        kTypeUnknown = 0x20,
    };

    static const int sGeometryMask = 0xf;
+2 −2
Original line number Diff line number Diff line
@@ -2096,7 +2096,7 @@ void OpenGLRenderer::drawAlphaBitmap(Texture* texture, float left, float top, Sk
 * The caller is responsible for properly dirtying the current layer.
 */
status_t OpenGLRenderer::drawBitmaps(SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount,
        TextureVertex* vertices, bool transformed, const Rect& bounds, SkPaint* paint) {
        TextureVertex* vertices, bool pureTranslate, const Rect& bounds, SkPaint* paint) {
    mCaches.activeTexture(0);
    Texture* texture = entry ? entry->texture : mCaches.textureCache.get(bitmap);
    if (!texture) return DrawGlInfo::kStatusDone;
@@ -2108,7 +2108,7 @@ status_t OpenGLRenderer::drawBitmaps(SkBitmap* bitmap, AssetAtlas::Entry* entry,
    getAlphaAndMode(paint, &alpha, &mode);

    texture->setWrap(GL_CLAMP_TO_EDGE, true);
    texture->setFilter(transformed ? FILTER(paint) : GL_NEAREST, true);
    texture->setFilter(pureTranslate ? GL_NEAREST : FILTER(paint), true);

    const float x = (int) floorf(bounds.left + 0.5f);
    const float y = (int) floorf(bounds.top + 0.5f);
+1 −1
Original line number Diff line number Diff line
@@ -285,7 +285,7 @@ public:
    virtual status_t drawLayer(Layer* layer, float x, float y);
    virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
    status_t drawBitmaps(SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount,
            TextureVertex* vertices, bool transformed, const Rect& bounds, SkPaint* paint);
            TextureVertex* vertices, bool pureTranslate, const Rect& bounds, SkPaint* paint);
    virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
    virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
            float srcRight, float srcBottom, float dstLeft, float dstTop,