| Index: src/effects/SkColorMatrixFilter.cpp
|
| diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp
|
| index 5ac455253e17db25f7b0efb4c846131212439326..81e4f8b2e6a5714644814f3168e9316e6cc2a858 100644
|
| --- a/src/effects/SkColorMatrixFilter.cpp
|
| +++ b/src/effects/SkColorMatrixFilter.cpp
|
| @@ -349,51 +349,6 @@ public:
|
| return GrTBackendFragmentProcessorFactory<ColorMatrixEffect>::getInstance();
|
| }
|
|
|
| - virtual void getConstantColorComponents(GrColor* color,
|
| - uint32_t* validFlags) const SK_OVERRIDE {
|
| - // We only bother to check whether the alpha channel will be constant. If SkColorMatrix had
|
| - // type flags it might be worth checking the other components.
|
| -
|
| - // The matrix is defined such the 4th row determines the output alpha. The first four
|
| - // columns of that row multiply the input r, g, b, and a, respectively, and the last column
|
| - // is the "translation".
|
| - static const uint32_t kRGBAFlags[] = {
|
| - kR_GrColorComponentFlag,
|
| - kG_GrColorComponentFlag,
|
| - kB_GrColorComponentFlag,
|
| - kA_GrColorComponentFlag
|
| - };
|
| - static const int kShifts[] = {
|
| - GrColor_SHIFT_R, GrColor_SHIFT_G, GrColor_SHIFT_B, GrColor_SHIFT_A,
|
| - };
|
| - enum {
|
| - kAlphaRowStartIdx = 15,
|
| - kAlphaRowTranslateIdx = 19,
|
| - };
|
| -
|
| - SkScalar outputA = 0;
|
| - for (int i = 0; i < 4; ++i) {
|
| - // If any relevant component of the color to be passed through the matrix is non-const
|
| - // then we can't know the final result.
|
| - if (0 != fMatrix.fMat[kAlphaRowStartIdx + i]) {
|
| - if (!(*validFlags & kRGBAFlags[i])) {
|
| - *validFlags = 0;
|
| - return;
|
| - } else {
|
| - uint32_t component = (*color >> kShifts[i]) & 0xFF;
|
| - outputA += fMatrix.fMat[kAlphaRowStartIdx + i] * component;
|
| - }
|
| - }
|
| - }
|
| - outputA += fMatrix.fMat[kAlphaRowTranslateIdx];
|
| - *validFlags = kA_GrColorComponentFlag;
|
| - // We pin the color to [0,1]. This would happen to the *final* color output from the frag
|
| - // shader but currently the effect does not pin its own output. So in the case of over/
|
| - // underflow this may deviate from the actual result. Maybe the effect should pin its
|
| - // result if the matrix could over/underflow for any component?
|
| - *color = static_cast<uint8_t>(SkScalarPin(outputA, 0, 255)) << GrColor_SHIFT_A;
|
| - }
|
| -
|
| GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
|
|
|
| class GLProcessor : public GrGLFragmentProcessor {
|
| @@ -471,6 +426,52 @@ private:
|
| return cme.fMatrix == fMatrix;
|
| }
|
|
|
| + virtual void onComputeInvarientOutput(InvarientOutput* invarientOutput) const SK_OVERRIDE {
|
| + // We only bother to check whether the alpha channel will be constant. If SkColorMatrix had
|
| + // type flags it might be worth checking the other components.
|
| +
|
| + // The matrix is defined such the 4th row determines the output alpha. The first four
|
| + // columns of that row multiply the input r, g, b, and a, respectively, and the last column
|
| + // is the "translation".
|
| + static const uint32_t kRGBAFlags[] = {
|
| + kR_GrColorComponentFlag,
|
| + kG_GrColorComponentFlag,
|
| + kB_GrColorComponentFlag,
|
| + kA_GrColorComponentFlag
|
| + };
|
| + static const int kShifts[] = {
|
| + GrColor_SHIFT_R, GrColor_SHIFT_G, GrColor_SHIFT_B, GrColor_SHIFT_A,
|
| + };
|
| + enum {
|
| + kAlphaRowStartIdx = 15,
|
| + kAlphaRowTranslateIdx = 19,
|
| + };
|
| +
|
| + SkScalar outputA = 0;
|
| + for (int i = 0; i < 4; ++i) {
|
| + // If any relevant component of the color to be passed through the matrix is non-const
|
| + // then we can't know the final result.
|
| + if (0 != fMatrix.fMat[kAlphaRowStartIdx + i]) {
|
| + if (!(invarientOutput->validFlags & kRGBAFlags[i])) {
|
| + invarientOutput->validFlags = 0;
|
| + return;
|
| + } else {
|
| + uint32_t component = (invarientOutput->color >> kShifts[i]) & 0xFF;
|
| + outputA += fMatrix.fMat[kAlphaRowStartIdx + i] * component;
|
| + }
|
| + }
|
| + }
|
| + outputA += fMatrix.fMat[kAlphaRowTranslateIdx];
|
| + invarientOutput->validFlags = kA_GrColorComponentFlag;
|
| + // We pin the color to [0,1]. This would happen to the *final* color output from the frag
|
| + // shader but currently the effect does not pin its own output. So in the case of over/
|
| + // underflow this may deviate from the actual result. Maybe the effect should pin its
|
| + // result if the matrix could over/underflow for any component?
|
| + invarientOutput->color =
|
| + static_cast<uint8_t>(SkScalarPin(outputA, 0, 255)) << GrColor_SHIFT_A;
|
| + invarientOutput->isSingleComponent = false;
|
| + }
|
| +
|
| SkColorMatrix fMatrix;
|
|
|
| typedef GrFragmentProcessor INHERITED;
|
|
|