diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/Patch.cpp | 24 | ||||
-rw-r--r-- | libs/hwui/Patch.h | 4 |
2 files changed, 17 insertions, 11 deletions
diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp index abc88fa..b3631df 100644 --- a/libs/hwui/Patch.cpp +++ b/libs/hwui/Patch.cpp @@ -118,7 +118,10 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, const uint32_t yStretchCount = (mYCount + 1) >> 1; float stretchX = 0.0f; - float stretchY = 0.0; + float stretchY = 0.0f; + + float rescaleX = 1.0f; + float rescaleY = 1.0f; const float meshWidth = right - left; @@ -129,8 +132,9 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, } const float xStretchTex = stretchSize; const float fixed = bitmapWidth - stretchSize; - const float xStretch = right - left - fixed; + const float xStretch = fmaxf(right - left - fixed, 0.0f); stretchX = xStretch / xStretchTex; + rescaleX = fminf(fmaxf(right - left, 0.0f) / fixed, 1.0f); } if (yStretchCount > 0) { @@ -140,8 +144,9 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, } const float yStretchTex = stretchSize; const float fixed = bitmapHeight - stretchSize; - const float yStretch = bottom - top - fixed; + const float yStretch = fmaxf(bottom - top - fixed, 0.0f); stretchY = yStretch / yStretchTex; + rescaleY = fminf(fmaxf(bottom - top, 0.0f) / fixed, 1.0f); } TextureVertex* vertex = mVertices; @@ -160,7 +165,7 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, if (i & 1) { y2 = y1 + floorf(segment * stretchY + 0.5f); } else { - y2 = y1 + segment; + y2 = y1 + segment * rescaleY; } float vOffset = y1 == y2 ? 0.0f : 0.5 - (0.5 * segment / (y2 - y1)); @@ -172,7 +177,7 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, y1 += i * EXPLODE_GAP; y2 += i * EXPLODE_GAP; #endif - generateRow(vertex, y1, y2, v1, v2, stretchX, right - left, + generateRow(vertex, y1, y2, v1, v2, stretchX, rescaleX, right - left, bitmapWidth, quadCount); #if DEBUG_EXPLODE_PATCHES y2 -= i * EXPLODE_GAP; @@ -191,7 +196,8 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, y1 += mYCount * EXPLODE_GAP; y2 += mYCount * EXPLODE_GAP; #endif - generateRow(vertex, y1, y2, v1, 1.0f, stretchX, right - left, bitmapWidth, quadCount); + generateRow(vertex, y1, y2, v1, 1.0f, stretchX, rescaleX, right - left, + bitmapWidth, quadCount); } if (verticesCount > 0) { @@ -212,7 +218,7 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, } void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, float v2, - float stretchX, float width, float bitmapWidth, uint32_t& quadCount) { + float stretchX, float rescaleX, float width, float bitmapWidth, uint32_t& quadCount) { float previousStepX = 0.0f; float x1 = 0.0f; @@ -227,7 +233,7 @@ void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, fl if (i & 1) { x2 = x1 + floorf(segment * stretchX + 0.5f); } else { - x2 = x1 + segment; + x2 = x1 + segment * rescaleX; } float uOffset = x1 == x2 ? 0.0f : 0.5 - (0.5 * segment / (x2 - x1)); @@ -272,7 +278,7 @@ void Patch::generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, f if (y2 < 0.0f) y2 = 0.0f; // Skip degenerate and transparent (empty) quads - if ((mColorKey >> oldQuadCount) & 0x1) { + if (((mColorKey >> oldQuadCount) & 0x1) || x1 >= x2 || y1 >= y2) { #if DEBUG_PATCHES_EMPTY_VERTICES PATCH_LOGD(" quad %d (empty)", oldQuadCount); PATCH_LOGD(" left, top = %.2f, %.2f\t\tu1, v1 = %.4f, %.4f", x1, y1, u1, v1); diff --git a/libs/hwui/Patch.h b/libs/hwui/Patch.h index 28c9048..0518d91 100644 --- a/libs/hwui/Patch.h +++ b/libs/hwui/Patch.h @@ -75,8 +75,8 @@ private: void copy(const int32_t* yDivs); void generateRow(TextureVertex*& vertex, float y1, float y2, - float v1, float v2, float stretchX, float width, float bitmapWidth, - uint32_t& quadCount); + float v1, float v2, float stretchX, float rescaleX, + float width, float bitmapWidth, uint32_t& quadCount); void generateQuad(TextureVertex*& vertex, float x1, float y1, float x2, float y2, float u1, float v1, float u2, float v2, |