| /* | |
| * Copyright 2014 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "GrInvariantOutput.h" | |
| #ifdef SK_DEBUG | |
| void GrInvariantOutput::validate() const { | |
| if (fIsSingleComponent) { | |
| SkASSERT(0 == fValidFlags || kRGBA_GrColorComponentFlags == fValidFlags); | |
| if (kRGBA_GrColorComponentFlags == fValidFlags) { | |
| SkASSERT(this->colorComponentsAllEqual()); | |
| } | |
| } | |
| SkASSERT(this->validPreMulColor()); | |
| // If we claim that we are not using the input color we must not be modulating the input. | |
| SkASSERT(fNonMulStageFound || fWillUseInputColor); | |
| } | |
| bool GrInvariantOutput::colorComponentsAllEqual() const { | |
| unsigned colorA = GrColorUnpackA(fColor); | |
| return(GrColorUnpackR(fColor) == colorA && | |
| GrColorUnpackG(fColor) == colorA && | |
| GrColorUnpackB(fColor) == colorA); | |
| } | |
| bool GrInvariantOutput::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 // end DEBUG | |