Fix GPU colormatrix color filter with saturated alpha.

Clamp RGBA values before unpremultiplying, to match the raster path. This causes a problem when the resulting
alpha is >1.0, resulting in overly saturated RGB.

Covered by the setYUV2RGB() test case in the colormatrix GM.

R=bsalomon@google.com

Review URL: https://codereview.chromium.org/196133006

git-svn-id: http://skia.googlecode.com/svn/trunk@13778 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/expectations/gm/ignored-tests.txt b/expectations/gm/ignored-tests.txt
index d9db6bc..9baba7e 100644
--- a/expectations/gm/ignored-tests.txt
+++ b/expectations/gm/ignored-tests.txt
@@ -51,3 +51,8 @@
 # This change removes an API that this GM was testing. If/when it lands and sticks,
 # I will likely just delete the GM.
 canvas-layer-state
+
+# senorblanco: https://codereview.chromium.org/196133006/
+# The setYUV2RGB sample in transparent mode in this GM this test has always
+# drawn incorrectly on the GPU.  The change above fixes it.
+colormatrix
diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp
index bb85485..23be874 100644
--- a/src/effects/SkColorMatrixFilter.cpp
+++ b/src/effects/SkColorMatrixFilter.cpp
@@ -424,6 +424,7 @@
                                    builder->getUniformCStr(fMatrixHandle),
                                    inputColor,
                                    builder->getUniformCStr(fVectorHandle));
+            builder->fsCodeAppendf("\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outputColor);
             builder->fsCodeAppendf("\t%s.rgb *= %s.a;\n", outputColor, outputColor);
         }