OSDN Git Service

Draw text drop shadows even when the text color is transparent
authorRomain Guy <romainguy@google.com>
Wed, 27 Feb 2013 21:50:45 +0000 (13:50 -0800)
committerRomain Guy <romainguy@google.com>
Wed, 27 Feb 2013 21:52:26 +0000 (13:52 -0800)
This matches Skia's behavior.

Change-Id: Ibf0a52611f5801cfa68169f66ab0ec06f256600f

libs/hwui/OpenGLRenderer.cpp
libs/hwui/OpenGLRenderer.h

index 34d1c98..ee54462 100644 (file)
@@ -2555,10 +2555,14 @@ void OpenGLRenderer::drawTextShadow(SkPaint* paint, const char* text, int bytesC
     glDrawArrays(GL_TRIANGLE_STRIP, 0, gMeshCount);
 }
 
+bool OpenGLRenderer::canSkipText(const SkPaint* paint) const {
+    float alpha = (mDrawModifiers.mHasShadow ? 1.0f : paint->getAlpha()) * mSnapshot->alpha;
+    return alpha == 0.0f && getXfermode(paint->getXfermode()) == SkXfermode::kSrcOver_Mode;
+}
+
 status_t OpenGLRenderer::drawPosText(const char* text, int bytesCount, int count,
         const float* positions, SkPaint* paint) {
-    if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
-            (paint->getAlpha() * mSnapshot->alpha == 0 && paint->getXfermode() == NULL)) {
+    if (text == NULL || count == 0 || mSnapshot->isIgnored() || canSkipText(paint)) {
         return DrawGlInfo::kStatusDone;
     }
 
@@ -2630,8 +2634,7 @@ status_t OpenGLRenderer::drawPosText(const char* text, int bytesCount, int count
 
 status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
         float x, float y, const float* positions, SkPaint* paint, float length) {
-    if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
-            (paint->getAlpha() * mSnapshot->alpha == 0 && paint->getXfermode() == NULL)) {
+    if (text == NULL || count == 0 || mSnapshot->isIgnored() || canSkipText(paint)) {
         return DrawGlInfo::kStatusDone;
     }
 
@@ -2735,8 +2738,7 @@ status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
 
 status_t OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
         float hOffset, float vOffset, SkPaint* paint) {
-    if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
-            (paint->getAlpha() == 0 && paint->getXfermode() == NULL)) {
+    if (text == NULL || count == 0 || mSnapshot->isIgnored() || canSkipText(paint)) {
         return DrawGlInfo::kStatusDone;
     }
 
index 80f2081..45c97fa 100644 (file)
@@ -779,6 +779,11 @@ private:
     void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2);
 
     /**
+     * Returns true if the specified paint will draw invisible text.
+     */
+    bool canSkipText(const SkPaint* paint) const;
+
+    /**
      * Binds the specified texture. The texture unit must have been selected
      * prior to calling this method.
      */