Index: include/gpu/GrInvariantOutput.h |
diff --git a/include/gpu/GrInvariantOutput.h b/include/gpu/GrInvariantOutput.h |
index 1d3eda1b2cd7f437dcc0345b2a9533e658871465..269748a026c8f35b5b80cc02895b513f6c98d9de 100644 |
--- a/include/gpu/GrInvariantOutput.h |
+++ b/include/gpu/GrInvariantOutput.h |
@@ -10,6 +10,49 @@ |
#include "GrColor.h" |
+struct GrInitInvariantOutput { |
+ GrInitInvariantOutput() |
+ : fValidFlags(0) |
+ , fColor(0) |
+ , fIsSingleComponent(false) |
+ , fIsLCDCoverage(false) {} |
+ |
+ void setKnownFourComponents(GrColor color) { |
+ fColor = color; |
+ fValidFlags = kRGBA_GrColorComponentFlags; |
+ fIsSingleComponent = false; |
+ } |
+ |
+ void setUnknownFourComponents() { |
+ fValidFlags = 0; |
+ fIsSingleComponent = false; |
+ } |
+ |
+ void setUnknownOpaqueFourComponents() { |
+ fColor = 0xff << GrColor_SHIFT_A; |
+ fValidFlags = kA_GrColorComponentFlag; |
+ fIsSingleComponent = false; |
+ } |
+ |
+ void setKnownSingleComponent(uint8_t alpha) { |
+ fColor = GrColorPackRGBA(alpha, alpha, alpha, alpha); |
+ fValidFlags = kRGBA_GrColorComponentFlags; |
+ fIsSingleComponent = true; |
+ } |
+ |
+ void setUnknownSingleComponent() { |
+ fValidFlags = 0; |
+ fIsSingleComponent = true; |
+ } |
+ |
+ void setUsingLCDCoverage() { fIsLCDCoverage = true; } |
+ |
+ uint32_t fValidFlags; |
+ GrColor fColor; |
+ bool fIsSingleComponent; |
+ bool fIsLCDCoverage; // Temorary data member until texture pixel configs are updated |
+}; |
+ |
class GrInvariantOutput { |
public: |
GrInvariantOutput(GrColor color, GrColorComponentFlags flags, bool isSingleComponent) |
@@ -20,6 +63,14 @@ public: |
, fWillUseInputColor(true) |
, fIsLCDCoverage(false) {} |
+ GrInvariantOutput(const GrInitInvariantOutput& io) |
+ : fColor(io.fColor) |
+ , fValidFlags(io.fValidFlags) |
+ , fIsSingleComponent(io.fIsSingleComponent) |
+ , fNonMulStageFound(false) |
+ , fWillUseInputColor(false) |
+ , fIsLCDCoverage(io.fIsLCDCoverage) {} |
+ |
virtual ~GrInvariantOutput() {} |
enum ReadInput { |
@@ -27,18 +78,18 @@ public: |
kWillNot_ReadInput, |
}; |
- void mulByUnknownOpaqueColor() { |
+ void mulByUnknownOpaqueFourComponents() { |
if (this->isOpaque()) { |
fValidFlags = kA_GrColorComponentFlag; |
fIsSingleComponent = false; |
} else { |
// Since the current state is not opaque we no longer care if the color being |
// multiplied is opaque. |
- this->mulByUnknownColor(); |
+ this->mulByUnknownFourComponents(); |
} |
} |
- void mulByUnknownColor() { |
+ void mulByUnknownFourComponents() { |
if (this->hasZeroAlpha()) { |
this->internalSetToTransparentBlack(); |
} else { |
@@ -46,7 +97,7 @@ public: |
} |
} |
- void mulByUnknownAlpha() { |
+ void mulByUnknownSingleComponent() { |
if (this->hasZeroAlpha()) { |
this->internalSetToTransparentBlack(); |
} else { |
@@ -55,7 +106,7 @@ public: |
} |
} |
- void mulByKnownAlpha(uint8_t alpha) { |
+ void mulByKnownSingleComponent(uint8_t alpha) { |
if (this->hasZeroAlpha() || 0 == alpha) { |
this->internalSetToTransparentBlack(); |
} else { |
@@ -122,6 +173,15 @@ private: |
fWillUseInputColor = true; |
} |
+ void reset(const GrInitInvariantOutput& io) { |
+ fColor = io.fColor; |
+ fValidFlags = io.fValidFlags; |
+ fIsSingleComponent = io.fIsSingleComponent; |
+ fNonMulStageFound = false; |
+ fWillUseInputColor = true; |
+ fIsLCDCoverage = io.fIsLCDCoverage; |
+ } |
+ |
void internalSetToTransparentBlack() { |
fValidFlags = kRGBA_GrColorComponentFlags; |
fColor = 0; |