Chromium Code Reviews| Index: include/gpu/GrInvariantOutput.h |
| diff --git a/include/gpu/GrInvariantOutput.h b/include/gpu/GrInvariantOutput.h |
| index 4977333de4e80779432c0eb20289ad5065f47ae3..b70793ddca9b50ba261a162d7133fbf373dc86ea 100644 |
| --- a/include/gpu/GrInvariantOutput.h |
| +++ b/include/gpu/GrInvariantOutput.h |
| @@ -116,10 +116,80 @@ public: |
| SkMulDiv255Round(GrColorUnpackG(fColor), alpha), |
| SkMulDiv255Round(GrColorUnpackB(fColor), alpha), |
| SkMulDiv255Round(GrColorUnpackA(fColor), alpha)); |
| + // We don't need to change fIsSingleComponent in this case |
| } |
| } |
| } |
| + void mulByKnownFourComponents(GrColor color) { |
| + GrColor a = GrColorUnpackA(color); |
| + if (a == GrColorUnpackR(color) && |
| + a == GrColorUnpackG(color) && |
| + a == GrColorUnpackB(color)) { |
| + this->mulByKnownSingleComponent(a); |
| + } else if (0 == color) { |
|
egdaniel
2015/03/04 20:22:34
we definitely don't need the 0 check here since it
bsalomon
2015/03/31 19:33:42
Done.
|
| + this->internalSetToTransparentBlack(); |
| + } else { |
| + if (color != 0xffffffff) { |
| + fColor = GrColorPackRGBA( |
| + SkMulDiv255Round(GrColorUnpackR(fColor), GrColorUnpackR(color)), |
| + SkMulDiv255Round(GrColorUnpackG(fColor), GrColorUnpackG(color)), |
| + SkMulDiv255Round(GrColorUnpackB(fColor), GrColorUnpackB(color)), |
| + SkMulDiv255Round(GrColorUnpackA(fColor), GrColorUnpackA(color))); |
| + if (kRGBA_GrColorComponentFlags == fValidFlags) { |
| + GrColor a = GrColorUnpackA(fColor); |
| + fIsSingleComponent = a == GrColorUnpackR(fColor) && |
| + a == GrColorUnpackG(fColor) && |
| + a == GrColorUnpackB(fColor); |
| + } |
| + } |
| + } |
| + } |
| + |
| + // Ignores the incoming color's RGB and muls its alpha by color. |
| + void mulAlphaByKnownFourComponents(GrColor color) { |
| + GrColor a = GrColorUnpackA(color); |
| + if (a == GrColorUnpackR(color) && |
| + a == GrColorUnpackG(color) && |
| + a == GrColorUnpackB(color)) { |
| + this->mulAlphaByKnownSingleComponent(a); |
| + } else if (0 == color) { |
|
egdaniel
2015/03/04 20:22:34
same as above.
bsalomon
2015/03/31 19:33:42
Done.
|
| + this->internalSetToTransparentBlack(); |
| + } else if (fValidFlags & kA_GrColorComponentFlag) { |
| + GrColor alpha = GrColorUnpackA(fColor); |
| + if (0 == alpha) { |
| + this->internalSetToTransparentBlack(); |
| + } else { |
| + fColor = GrColorPackRGBA( |
| + SkMulDiv255Round(alpha, GrColorUnpackR(color)), |
| + SkMulDiv255Round(alpha, GrColorUnpackG(color)), |
| + SkMulDiv255Round(alpha, GrColorUnpackB(color)), |
| + SkMulDiv255Round(alpha, GrColorUnpackA(color))); |
| + fValidFlags = kRGBA_GrColorComponentFlags; |
| + } |
| + } else { |
| + fValidFlags = 0; |
| + } |
| + } |
| + |
| + // Ignores the incoming color's RGB and muls its alpha by the alpha param and sets all channels |
| + // equal to that value. |
| + void mulAlphaByKnownSingleComponent(uint8_t alpha) { |
| + if (0 == alpha || 0 == this->hasZeroAlpha()) { |
| + this->internalSetToTransparentBlack(); |
| + } else { |
| + if (fValidFlags & kA_GrColorComponentFlag) { |
| + GrColor a = GrColorUnpackA(fColor); |
| + a = SkMulDiv255Round(alpha, a); |
| + fColor = GrColorPackRGBA(a, a, a, a); |
| + fValidFlags = kRGBA_GrColorComponentFlags; |
| + } else { |
| + fValidFlags = 0; |
| + } |
| + fIsSingleComponent = true; |
| + } |
| + } |
| + |
| void invalidateComponents(uint8_t invalidateFlags, ReadInput readsInput) { |
| fValidFlags &= ~invalidateFlags; |
| fIsSingleComponent = false; |