From 996fe656340ede058a6f0e6b18f9ec525ddb4e27 Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Fri, 20 Sep 2013 17:13:18 -0700 Subject: [PATCH] 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 --- libs/hwui/DisplayListOp.h | 6 +++--- libs/hwui/Matrix.cpp | 6 +----- libs/hwui/Matrix.h | 3 +-- libs/hwui/OpenGLRenderer.cpp | 4 ++-- libs/hwui/OpenGLRenderer.h | 2 +- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h index b0524615b73f1..326805a5894b5 100644 --- a/libs/hwui/DisplayListOp.h +++ b/libs/hwui/DisplayListOp.h @@ -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 { diff --git a/libs/hwui/Matrix.cpp b/libs/hwui/Matrix.cpp index 1948778ceb7c5..ba22071d620bf 100644 --- a/libs/hwui/Matrix.cpp +++ b/libs/hwui/Matrix.cpp @@ -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 { diff --git a/libs/hwui/Matrix.h b/libs/hwui/Matrix.h index e2c5b2088e7ad..b861ba4abb254 100644 --- a/libs/hwui/Matrix.h +++ b/libs/hwui/Matrix.h @@ -64,8 +64,7 @@ public: kTypeAffine = 0x4, kTypePerspective = 0x8, kTypeRectToRect = 0x10, - kTypePositiveScale = 0x20, - kTypeUnknown = 0x40, + kTypeUnknown = 0x20, }; static const int sGeometryMask = 0xf; diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 89a82fdc4a84f..35fc804594b5d 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -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); diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index f74df9736d40c..9afb7ad4f2d2f 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -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,