summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2014-09-16 17:32:13 -0700
committerChris Craik <ccraik@google.com>2014-09-17 10:00:34 -0700
commit73821c8d2bd453de6bf3f516e1f1cdb9a132f4a7 (patch)
treef77d9133dcf359aa2a1933d3894f8bce6a593c60 /libs
parentc1e1550bf489b5fafff70154232c24bc5026b7df (diff)
downloadframeworks_base-73821c8d2bd453de6bf3f516e1f1cdb9a132f4a7.zip
frameworks_base-73821c8d2bd453de6bf3f516e1f1cdb9a132f4a7.tar.gz
frameworks_base-73821c8d2bd453de6bf3f516e1f1cdb9a132f4a7.tar.bz2
Handle premultiplication correctly for ColorMatrixColorFilters
bug:17405627 Previously, the input content to the color matrix computation was left premultiplied. Since the color matrix could reduce the alpha channel, the alpha was re-multiplied, but this was incomplete, and incorrect. Instead, apply the color matrix in unpremultiplied space. Change-Id: I87b8e03d2e228e6ded81f7bbfea952605d7a095c
Diffstat (limited to 'libs')
-rw-r--r--libs/hwui/ProgramCache.cpp4
-rw-r--r--libs/hwui/Renderer.h2
2 files changed, 5 insertions, 1 deletions
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp
index a8b8b16..06353c0 100644
--- a/libs/hwui/ProgramCache.cpp
+++ b/libs/hwui/ProgramCache.cpp
@@ -327,8 +327,10 @@ const char* gFS_Main_ApplyColorOp[3] = {
// None
"",
// Matrix
+ " fragColor.rgb /= (fragColor.a + 0.0019);\n" // un-premultiply
" fragColor *= colorMatrix;\n"
- " fragColor += colorMatrixVector;\n",
+ " fragColor += colorMatrixVector;\n"
+ " fragColor.rgb *= (fragColor.a + 0.0019);\n", // re-premultiply
// PorterDuff
" fragColor = blendColors(colorBlend, fragColor);\n"
};
diff --git a/libs/hwui/Renderer.h b/libs/hwui/Renderer.h
index 6d4bb4a..3681637 100644
--- a/libs/hwui/Renderer.h
+++ b/libs/hwui/Renderer.h
@@ -70,6 +70,7 @@ public:
// TODO: move to a method on android:Paint
static inline bool paintWillNotDraw(const SkPaint& paint) {
return paint.getAlpha() == 0
+ && !paint.getColorFilter()
&& getXfermode(paint.getXfermode()) != SkXfermode::kClear_Mode;
}
@@ -77,6 +78,7 @@ public:
static inline bool paintWillNotDrawText(const SkPaint& paint) {
return paint.getAlpha() == 0
&& paint.getLooper() == NULL
+ && !paint.getColorFilter()
&& getXfermode(paint.getXfermode()) == SkXfermode::kSrcOver_Mode;
}
// ----------------------------------------------------------------------------