From f504a2fa144504ca1efd39a4ef9208e3d4d336c5 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 26 May 2011 16:40:55 -0700 Subject: Correctly implement the CLEAR xfermode. The previous implementation was using glBlendFunc with the parameters GL_ZERO/GL_ZERO which doesn't work for text, paths and other alpha sources (anti-aliasing.) The correct implementation is GL_ZERO/ GL_ONE_MINUS_SRC_ALPHA. Change-Id: I4cca65e57b6a37bbf5a41d382cb0648ee8e11e79 --- libs/hwui/Debug.h | 2 ++ libs/hwui/OpenGLRenderer.cpp | 4 ++-- libs/hwui/Patch.cpp | 32 ++++++++++++++++++++++++++++---- libs/hwui/Patch.h | 6 ++++++ 4 files changed, 38 insertions(+), 6 deletions(-) (limited to 'libs/hwui') diff --git a/libs/hwui/Debug.h b/libs/hwui/Debug.h index f74238e..2cdc8c3 100644 --- a/libs/hwui/Debug.h +++ b/libs/hwui/Debug.h @@ -37,6 +37,8 @@ // Turn on to display debug info about 9patch objects #define DEBUG_PATCHES 0 +// Turn on to "explode" 9patch objects +#define DEBUG_EXPLODE_PATCHES 0 // Turn on to display vertex and tex coords data about 9patch objects // This flag requires DEBUG_PATCHES to be turned on #define DEBUG_PATCHES_VERTICES 0 diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 560c1f9..8cf325b 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -63,7 +63,7 @@ struct Blender { // In this array, the index of each Blender equals the value of the first // entry. For instance, gBlends[1] == gBlends[SkXfermode::kSrc_Mode] static const Blender gBlends[] = { - { SkXfermode::kClear_Mode, GL_ZERO, GL_ZERO }, + { SkXfermode::kClear_Mode, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA }, { SkXfermode::kSrc_Mode, GL_ONE, GL_ZERO }, { SkXfermode::kDst_Mode, GL_ZERO, GL_ONE }, { SkXfermode::kSrcOver_Mode, GL_ONE, GL_ONE_MINUS_SRC_ALPHA }, @@ -81,7 +81,7 @@ static const Blender gBlends[] = { // this array's SrcOver blending mode is actually DstOver. You can refer to // createLayer() for more information on the purpose of this array. static const Blender gBlendsSwap[] = { - { SkXfermode::kClear_Mode, GL_ZERO, GL_ZERO }, + { SkXfermode::kClear_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ZERO }, { SkXfermode::kSrc_Mode, GL_ZERO, GL_ONE }, { SkXfermode::kDst_Mode, GL_ONE, GL_ZERO }, { SkXfermode::kSrcOver_Mode, GL_ONE_MINUS_DST_ALPHA, GL_ONE }, diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp index 11eb953..f7dacae 100644 --- a/libs/hwui/Patch.cpp +++ b/libs/hwui/Patch.cpp @@ -152,12 +152,12 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, float previousStepY = 0.0f; float y1 = 0.0f; + float y2 = 0.0f; float v1 = 0.0f; for (uint32_t i = 0; i < mYCount; i++) { float stepY = mYDivs[i]; - float y2 = 0.0f; if (i & 1) { const float segment = stepY - previousStepY; y2 = y1 + floorf(segment * stretchY + 0.5f); @@ -167,8 +167,15 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, float v2 = fmax(0.0f, stepY - 0.5f) / bitmapHeight; if (stepY > 0.0f) { +#if DEBUG_EXPLODE_PATCHES + y1 += i * EXPLODE_GAP; + y2 += i * EXPLODE_GAP; +#endif generateRow(vertex, y1, y2, v1, v2, stretchX, right - left, bitmapWidth, quadCount); +#if DEBUG_EXPLODE_PATCHES + y2 -= i * EXPLODE_GAP; +#endif } y1 = y2; @@ -178,7 +185,12 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, } if (previousStepY != bitmapHeight) { - generateRow(vertex, y1, bottom - top, v1, 1.0f, stretchX, right - left, + y2 = bottom - top; +#if DEBUG_EXPLODE_PATCHES + y1 += mYCount * EXPLODE_GAP; + y2 += mYCount * EXPLODE_GAP; +#endif + generateRow(vertex, y1, y2, v1, 1.0f, stretchX, right - left, bitmapWidth, quadCount); } @@ -202,13 +214,13 @@ void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, fl float previousStepX = 0.0f; float x1 = 0.0f; + float x2 = 0.0f; float u1 = 0.0f; // Generate the row quad by quad for (uint32_t i = 0; i < mXCount; i++) { float stepX = mXDivs[i]; - float x2 = 0.0f; if (i & 1) { const float segment = stepX - previousStepX; x2 = x1 + floorf(segment * stretchX + 0.5f); @@ -218,7 +230,14 @@ void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, fl float u2 = fmax(0.0f, stepX - 0.5f) / bitmapWidth; if (stepX > 0.0f) { +#if DEBUG_EXPLODE_PATCHES + x1 += i * EXPLODE_GAP; + x2 += i * EXPLODE_GAP; +#endif generateQuad(vertex, x1, y1, x2, y2, u1, v1, u2, v2, quadCount); +#if DEBUG_EXPLODE_PATCHES + x2 -= i * EXPLODE_GAP; +#endif } x1 = x2; @@ -228,7 +247,12 @@ void Patch::generateRow(TextureVertex*& vertex, float y1, float y2, float v1, fl } if (previousStepX != bitmapWidth) { - generateQuad(vertex, x1, y1, width, y2, u1, v1, 1.0f, v2, quadCount); + x2 = width; +#if DEBUG_EXPLODE_PATCHES + x1 += mXCount * EXPLODE_GAP; + x2 += mXCount * EXPLODE_GAP; +#endif + generateQuad(vertex, x1, y1, x2, y2, u1, v1, 1.0f, v2, quadCount); } } diff --git a/libs/hwui/Patch.h b/libs/hwui/Patch.h index 0f0ffa2..28c9048 100644 --- a/libs/hwui/Patch.h +++ b/libs/hwui/Patch.h @@ -31,6 +31,12 @@ namespace android { namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// +// Defines +/////////////////////////////////////////////////////////////////////////////// + +#define EXPLODE_GAP 4 + +/////////////////////////////////////////////////////////////////////////////// // 9-patch structures /////////////////////////////////////////////////////////////////////////////// -- cgit v1.1