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
diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp
index b07a3c8..5de64a4 100644
--- a/libs/hwui/font/Font.cpp
+++ b/libs/hwui/font/Font.cpp
@@ -228,15 +228,15 @@
     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,