From 73821c8d2bd453de6bf3f516e1f1cdb9a132f4a7 Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Tue, 16 Sep 2014 17:32:13 -0700 Subject: 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 --- libs/hwui/ProgramCache.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libs/hwui/ProgramCache.cpp') diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index a8b8b16826a3..06353c096adc 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" }; -- cgit v1.2.3-59-g8ed1b