| Index: src/gpu/GrProcessor.cpp
 | 
| diff --git a/src/gpu/GrProcessor.cpp b/src/gpu/GrProcessor.cpp
 | 
| index 45298b522d3ef9e1bf367c19ea8989a8b02f900e..26e00530be848491e87d9ecb82035f29dd4c680f 100644
 | 
| --- a/src/gpu/GrProcessor.cpp
 | 
| +++ b/src/gpu/GrProcessor.cpp
 | 
| @@ -88,4 +88,46 @@ void GrProcessor::assertEquality(const GrProcessor& other) const {
 | 
|          SkASSERT(this->textureAccess(i) == other.textureAccess(i));
 | 
|      }
 | 
|  }
 | 
| +
 | 
| +void GrProcessor::InvariantOutput::validate() const {
 | 
| +    if (fIsSingleComponent) {
 | 
| +        SkASSERT(0 == fValidFlags || kRGBA_GrColorComponentFlags == fValidFlags);
 | 
| +        if (kRGBA_GrColorComponentFlags == fValidFlags) {
 | 
| +            SkASSERT(this->colorComponentsAllEqual());
 | 
| +        }
 | 
| +    }
 | 
| +
 | 
| +    SkASSERT(this->validPreMulColor());
 | 
| +}
 | 
| +
 | 
| +bool GrProcessor::InvariantOutput::colorComponentsAllEqual() const {
 | 
| +    unsigned colorA = GrColorUnpackA(fColor);
 | 
| +    return(GrColorUnpackR(fColor) == colorA &&
 | 
| +           GrColorUnpackG(fColor) == colorA &&
 | 
| +           GrColorUnpackB(fColor) == colorA);
 | 
| +}
 | 
| +
 | 
| +bool GrProcessor::InvariantOutput::validPreMulColor() const {
 | 
| +    if (kA_GrColorComponentFlag & fValidFlags) {
 | 
| +        float c[4];
 | 
| +        GrColorToRGBAFloat(fColor, c);
 | 
| +        if (kR_GrColorComponentFlag & fValidFlags) {
 | 
| +            if (c[0] > c[3]) {
 | 
| +                return false;
 | 
| +            }
 | 
| +        }
 | 
| +        if (kG_GrColorComponentFlag & fValidFlags) {
 | 
| +            if (c[1] > c[3]) {
 | 
| +                return false;
 | 
| +            }
 | 
| +        }
 | 
| +        if (kB_GrColorComponentFlag & fValidFlags) {
 | 
| +            if (c[2] > c[3]) {
 | 
| +                return false;
 | 
| +            }
 | 
| +        }
 | 
| +    }
 | 
| +    return true;
 | 
| +}
 | 
|  #endif
 | 
| +
 | 
| 
 |