From de25a672b18171a3d14315b34dc7c8fcf46ae91e Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Tue, 30 Jun 2015 13:12:24 -0700 Subject: [PATCH] Saturate alpha values when overlaying glyphs bug:19062769 Glyphs were stored to the output buffer with the assumption of non-overlap, which is incorrect for certain fonts/strings. Instead, blend src into dst, so new glyphs don't clobber existing content. Change-Id: I6e22037500e67d5348ee2a43d939416c23c4d1ea --- libs/hwui/font/Font.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp index b07a3c8bdd677..5de64a4b16545 100644 --- a/libs/hwui/font/Font.cpp +++ b/libs/hwui/font/Font.cpp @@ -228,15 +228,15 @@ void Font::drawCachedGlyphBitmap(CachedGlyphInfo* glyph, int x, int y, uint8_t* for (uint32_t cacheY = startY, bitmapY = dstY * bitmapWidth; cacheY < endY; cacheY += srcStride, bitmapY += bitmapWidth) { - if (formatSize == 1) { - memcpy(&bitmap[bitmapY + dstX], &cacheBuffer[cacheY + glyph->mStartX], glyph->mBitmapWidth); - } else { - for (uint32_t i = 0; i < glyph->mBitmapWidth; ++i) { - bitmap[bitmapY + dstX + i] = cacheBuffer[cacheY + (glyph->mStartX + i)*formatSize + alpha_channel_offset]; - } + for (uint32_t i = 0; i < glyph->mBitmapWidth; ++i) { + uint8_t* dst = &(bitmap[bitmapY + dstX + i]); + const uint8_t& src = cacheBuffer[ + cacheY + (glyph->mStartX + i)*formatSize + alpha_channel_offset]; + // Add alpha values to a max of 255, full opacity. This is done to handle + // fonts/strings where glyphs overlap. + *dst = std::min(*dst + src, 255); } } - } void Font::drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,