Move GrInvariantOutput out of GrProcessor and into its own class.
authoregdaniel <egdaniel@google.com>
Wed, 12 Nov 2014 16:35:25 +0000 (08:35 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 12 Nov 2014 16:35:25 +0000 (08:35 -0800)
This will help with the ability to subclass, add to, etc. GrInvariantOutput. Also it was simply
getting a little too big to be a "supporting" subclass
BUG=skia:

Review URL: https://codereview.chromium.org/699943003

53 files changed:
gyp/gpu.gypi
include/gpu/GrInvariantOutput.h [new file with mode: 0644]
include/gpu/GrProcessor.h
src/core/SkXfermode.cpp
src/effects/SkAlphaThresholdFilter.cpp
src/effects/SkArithmeticMode.cpp
src/effects/SkBlurMaskFilter.cpp
src/effects/SkColorCubeFilter.cpp
src/effects/SkColorFilters.cpp
src/effects/SkColorMatrixFilter.cpp
src/effects/SkDisplacementMapEffect.cpp
src/effects/SkLightingImageFilter.cpp
src/effects/SkLumaColorFilter.cpp
src/effects/SkMagnifierImageFilter.cpp
src/effects/SkMorphologyImageFilter.cpp
src/effects/SkPerlinNoiseShader.cpp
src/effects/SkTableColorFilter.cpp
src/effects/gradients/SkGradientShader.cpp
src/effects/gradients/SkGradientShaderPriv.h
src/gpu/GrAAConvexPathRenderer.cpp
src/gpu/GrAARectRenderer.cpp
src/gpu/GrDefaultGeoProcFactory.cpp
src/gpu/GrDrawState.cpp
src/gpu/GrInvariantOutput.cpp [new file with mode: 0644]
src/gpu/GrOptDrawState.cpp
src/gpu/GrOvalRenderer.cpp
src/gpu/GrPaint.cpp
src/gpu/GrProcessor.cpp
src/gpu/effects/GrBezierEffect.h
src/gpu/effects/GrBicubicEffect.cpp
src/gpu/effects/GrBicubicEffect.h
src/gpu/effects/GrConfigConversionEffect.cpp
src/gpu/effects/GrConfigConversionEffect.h
src/gpu/effects/GrConvexPolyEffect.cpp
src/gpu/effects/GrConvexPolyEffect.h
src/gpu/effects/GrConvolutionEffect.h
src/gpu/effects/GrCustomCoordsTextureEffect.cpp
src/gpu/effects/GrCustomCoordsTextureEffect.h
src/gpu/effects/GrDashingEffect.cpp
src/gpu/effects/GrDistanceFieldTextureEffect.cpp
src/gpu/effects/GrDistanceFieldTextureEffect.h
src/gpu/effects/GrDitherEffect.cpp
src/gpu/effects/GrMatrixConvolutionEffect.h
src/gpu/effects/GrOvalEffect.cpp
src/gpu/effects/GrRRectEffect.cpp
src/gpu/effects/GrSimpleTextureEffect.cpp
src/gpu/effects/GrSimpleTextureEffect.h
src/gpu/effects/GrSingleTextureEffect.h
src/gpu/effects/GrTextureDomain.cpp
src/gpu/effects/GrTextureDomain.h
src/gpu/effects/GrYUVtoRGBEffect.cpp
tests/GLProgramsTest.cpp
tests/GpuColorFilterTest.cpp

index 7b84365a6c85eb706d757ab57fd884a9bc0159f0..2cf380b9967baf70dffcd528e0d4ace328dd94d2 100644 (file)
@@ -20,6 +20,7 @@
       '<(skia_include_path)/gpu/GrFragmentProcessor.h',
       '<(skia_include_path)/gpu/GrGlyph.h',
       '<(skia_include_path)/gpu/GrGpuResource.h',
+      '<(skia_include_path)/gpu/GrInvariantOutput.h',
       '<(skia_include_path)/gpu/GrPaint.h',
       '<(skia_include_path)/gpu/GrPathRendererChain.h',
       '<(skia_include_path)/gpu/GrProcessor.h',
@@ -91,6 +92,7 @@
       '<(skia_src_path)/gpu/GrGpuResource.cpp',
       '<(skia_src_path)/gpu/GrGpuFactory.cpp',
       '<(skia_src_path)/gpu/GrIndexBuffer.h',
+      '<(skia_src_path)/gpu/GrInvariantOutput.cpp',
       '<(skia_src_path)/gpu/GrInOrderDrawBuffer.cpp',
       '<(skia_src_path)/gpu/GrInOrderDrawBuffer.h',
       '<(skia_src_path)/gpu/GrLayerCache.cpp',
diff --git a/include/gpu/GrInvariantOutput.h b/include/gpu/GrInvariantOutput.h
new file mode 100644 (file)
index 0000000..8f38d1f
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef GrInvariantOutput_DEFINED
+#define GrInvariantOutput_DEFINED
+
+#include "GrColor.h"
+
+class GrInvariantOutput {
+public:
+    GrInvariantOutput(GrColor color, GrColorComponentFlags flags, bool isSingleComponent)
+        : fColor(color), fValidFlags(flags), fIsSingleComponent(isSingleComponent),
+          fNonMulStageFound(false), fWillUseInputColor(true) {}
+
+    virtual ~GrInvariantOutput() {}
+
+    enum ReadInput {
+        kWill_ReadInput,
+        kWillNot_ReadInput,
+    };
+
+    void mulByUnknownOpaqueColor() {
+        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(); 
+        }
+    }
+
+    void mulByUnknownColor() {
+        if (this->hasZeroAlpha()) {
+            this->internalSetToTransparentBlack();
+        } else {
+            this->internalSetToUnknown();
+        }
+    }
+
+    void mulByUnknownAlpha() {
+        if (this->hasZeroAlpha()) {
+            this->internalSetToTransparentBlack();
+        } else {
+            // We don't need to change fIsSingleComponent in this case
+            fValidFlags = 0;
+        }
+    }
+
+    void mulByKnownAlpha(uint8_t alpha) {
+        if (this->hasZeroAlpha() || 0 == alpha) {
+            this->internalSetToTransparentBlack();
+        } else {
+            if (alpha != 255) {
+                // Multiply color by alpha
+                fColor = GrColorPackRGBA(SkMulDiv255Round(GrColorUnpackR(fColor), alpha),
+                                         SkMulDiv255Round(GrColorUnpackG(fColor), alpha),
+                                         SkMulDiv255Round(GrColorUnpackB(fColor), alpha),
+                                         SkMulDiv255Round(GrColorUnpackA(fColor), alpha));
+            }
+        }
+    }
+
+    void invalidateComponents(uint8_t invalidateFlags, ReadInput readsInput) {
+        fValidFlags &= ~invalidateFlags;
+        fIsSingleComponent = false;
+        fNonMulStageFound = true;
+        if (kWillNot_ReadInput == readsInput) {
+            fWillUseInputColor = false;
+        }
+    }
+
+    void setToOther(uint8_t validFlags, GrColor color, ReadInput readsInput) {
+        fValidFlags = validFlags;
+        fColor = color;
+        fIsSingleComponent = false;
+        fNonMulStageFound = true;
+        if (kWillNot_ReadInput == readsInput) {
+            fWillUseInputColor = false;
+        }
+    }
+
+    void setToUnknown(ReadInput readsInput) {
+        this->internalSetToUnknown();
+        fNonMulStageFound= true;
+        if (kWillNot_ReadInput == readsInput) {
+            fWillUseInputColor = false;
+        }
+    }
+
+    bool isOpaque() const {
+        return ((fValidFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(fColor));
+    }
+
+    bool isSolidWhite() const {
+        return (fValidFlags == kRGBA_GrColorComponentFlags && 0xFFFFFFFF == fColor);
+    }
+
+    GrColor color() const { return fColor; }
+    uint8_t validFlags() const { return fValidFlags; }
+
+    bool willUseInputColor() const { return fWillUseInputColor; }
+    void resetWillUseInputColor() { fWillUseInputColor = true; }
+
+    void resetNonMulStageFound() { fNonMulStageFound = false; }
+
+    /**
+     * If isSingleComponent is true, then the flag values for r, g, b, and a must all be the
+     * same. If the flags are all set then all color components must be equal.
+     */
+    SkDEBUGCODE(void validate() const;)
+
+protected:
+    GrColor fColor;
+    uint32_t fValidFlags;
+    bool fIsSingleComponent;
+    bool fNonMulStageFound;
+    bool fWillUseInputColor;
+
+private:
+    void internalSetToTransparentBlack() {
+        fValidFlags = kRGBA_GrColorComponentFlags;
+        fColor = 0;
+        fIsSingleComponent = true;
+    }
+
+    void internalSetToUnknown() {
+        fValidFlags = 0;
+        fIsSingleComponent = false;
+    }
+
+    bool hasZeroAlpha() const {
+        return ((fValidFlags & kA_GrColorComponentFlag) && 0 == GrColorUnpackA(fColor));
+    }
+
+    SkDEBUGCODE(bool colorComponentsAllEqual() const;)
+    /**
+     * If alpha is valid, check that any valid R,G,B values are <= A
+     */
+    SkDEBUGCODE(bool validPreMulColor() const;)
+};
+
+#endif
+
index 96ce28840456dc6aa469670f08ac4d16f0bdd83d..20123754e2a145098842a1e7f74cfc81e2400f3c 100644 (file)
@@ -17,6 +17,7 @@
 
 class GrContext;
 class GrCoordTransform;
+class GrInvariantOutput;
 
 /** Provides custom shader code to the Ganesh shading pipeline. GrProcessor objects *must* be
     immutable: after being constructed, their fields may not change.
@@ -31,137 +32,6 @@ public:
 
     virtual ~GrProcessor();
 
-    struct InvariantOutput{
-        InvariantOutput() : fColor(0), fValidFlags(0), fIsSingleComponent(false),
-                            fNonMulStageFound(false), fWillUseInputColor(true) {}
-
-        enum ReadInput {
-            kWill_ReadInput,
-            kWillNot_ReadInput,
-        };
-
-        void mulByUnknownOpaqueColor() {
-            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(); 
-            }
-        }
-
-        void mulByUnknownColor() {
-            if (this->hasZeroAlpha()) {
-                this->internalSetToTransparentBlack();
-            } else {
-                this->internalSetToUnknown();
-            }
-        }
-
-        void mulByUnknownAlpha() {
-            if (this->hasZeroAlpha()) {
-                this->internalSetToTransparentBlack();
-            } else {
-                // We don't need to change fIsSingleComponent in this case
-                fValidFlags = 0;
-            }
-        }
-
-        void mulByKnownAlpha(uint8_t alpha) {
-            if (this->hasZeroAlpha() || 0 == alpha) {
-                this->internalSetToTransparentBlack();
-            } else {
-                if (alpha != 255) {
-                    // Multiply color by alpha
-                    fColor = GrColorPackRGBA(SkMulDiv255Round(GrColorUnpackR(fColor), alpha),
-                                             SkMulDiv255Round(GrColorUnpackG(fColor), alpha),
-                                             SkMulDiv255Round(GrColorUnpackB(fColor), alpha),
-                                             SkMulDiv255Round(GrColorUnpackA(fColor), alpha));
-                }
-            }
-        }
-
-        void invalidateComponents(uint8_t invalidateFlags, ReadInput readsInput) {
-            fValidFlags &= ~invalidateFlags;
-            fIsSingleComponent = false;
-            if (kWillNot_ReadInput == readsInput) {
-                fWillUseInputColor = false;
-            }
-        }
-
-        void setToOther(uint8_t validFlags, GrColor color, ReadInput readsInput) {
-            fValidFlags = validFlags;
-            fColor = color;
-            fIsSingleComponent = false;
-            fNonMulStageFound = true;
-            if (kWillNot_ReadInput == readsInput) {
-                fWillUseInputColor = false;
-            }
-        }
-
-        void setToUnknown(ReadInput readsInput) {
-            this->internalSetToUnknown();
-            fNonMulStageFound= true;
-            if (kWillNot_ReadInput == readsInput) {
-                fWillUseInputColor = false;
-            }
-        }
-
-        bool isOpaque() const {
-            return ((fValidFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(fColor));
-        }
-
-        bool isSolidWhite() const {
-            return (fValidFlags == kRGBA_GrColorComponentFlags && 0xFFFFFFFF == fColor);
-        }
-
-        GrColor color() const { return fColor; }
-        uint8_t validFlags() const { return fValidFlags; }
-
-        /**
-         * If isSingleComponent is true, then the flag values for r, g, b, and a must all be the
-         * same. If the flags are all set then all color components must be equal.
-         */
-        SkDEBUGCODE(void validate() const;)
-
-    private:
-        void internalSetToTransparentBlack() {
-            fValidFlags = kRGBA_GrColorComponentFlags;
-            fColor = 0;
-            fIsSingleComponent = true;
-        }
-
-        void internalSetToUnknown() {
-            fValidFlags = 0;
-            fIsSingleComponent = false;
-        }
-
-        bool hasZeroAlpha() const {
-            return ((fValidFlags & kA_GrColorComponentFlag) && 0 == GrColorUnpackA(fColor));
-        }
-
-        SkDEBUGCODE(bool colorComponentsAllEqual() const;)
-        /**
-         * If alpha is valid, check that any valid R,G,B values are <= A
-         */
-        SkDEBUGCODE(bool validPreMulColor() const;)
-
-        // Friended class that have "controller" code which loop over stages calling
-        // computeInvarianteOutput(). These controllers may need to manually adjust the internal
-        // members of InvariantOutput
-        friend class GrDrawState;
-        friend class GrOptDrawState;
-        friend class GrPaint;
-        friend class GrProcessor;
-
-        GrColor fColor;
-        uint32_t fValidFlags;
-        bool fIsSingleComponent;
-        bool fNonMulStageFound;
-        bool fWillUseInputColor;
-    };
-
     /**
      * This function is used to perform optimizations. When called the invarientOuput param
      * indicate whether the input components to this processor in the FS will have known values.
@@ -170,13 +40,7 @@ public:
      * inout to indicate known values of its output. A component of the color member only has
      * meaning if the corresponding bit in validFlags is set.
      */
-    void computeInvariantOutput(InvariantOutput* inout) const {
-        inout->fWillUseInputColor = true;
-        this->onComputeInvariantOutput(inout);
-#ifdef SK_DEBUG
-        inout->validate();
-#endif
-    }
+    void computeInvariantOutput(GrInvariantOutput* inout) const; 
 
     /** This object, besides creating back-end-specific helper objects, is used for run-time-type-
         identification. The factory should be an instance of templated class,
@@ -247,11 +111,10 @@ protected:
     void setWillReadFragmentPosition() { fWillReadFragmentPosition = true; }
 
 private:
-
     /** 
      * Subclass implements this to support getConstantColorComponents(...).
      */
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const = 0;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const = 0;
 
     SkSTArray<4, const GrTextureAccess*, true>   fTextureAccesses;
     bool                                         fWillReadFragmentPosition;
index 0cc120dfa7db2104edd36c0240ba55b74c9b99c4..36be29e8b37579501d5a1731f4d69d7af84ce044 100644 (file)
@@ -777,6 +777,7 @@ void SkXfermode::xferA8(SkAlpha* SK_RESTRICT dst,
 
 #include "GrFragmentProcessor.h"
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
 #include "GrProcessorUnitTest.h"
 #include "GrTBackendProcessorFactory.h"
 #include "gl/GrGLProcessor.h"
@@ -1211,8 +1212,8 @@ private:
         return fMode == s.fMode;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
-        inout->setToUnknown(InvariantOutput::kWill_ReadInput);
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
+        inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
     }
 
     SkXfermode::Mode fMode;
index c3ad87a3b8a23bb91f8b1db54d1e26c98441abc2..bff877280c5689e1bd4371a3d502c856d141b196 100644 (file)
@@ -49,6 +49,7 @@ SkImageFilter* SkAlphaThresholdFilter::Create(const SkRegion& region,
 #include "GrContext.h"
 #include "GrCoordTransform.h"
 #include "GrFragmentProcessor.h"
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrTBackendProcessorFactory.h"
@@ -102,7 +103,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
@@ -227,7 +228,7 @@ bool AlphaThresholdEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
             this->fOuterThreshold == s.fOuterThreshold);
 }
 
-void AlphaThresholdEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void AlphaThresholdEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     if (GrPixelConfigIsOpaque(this->texture(0)->config()) && fOuterThreshold >= 1.f) {
         inout->mulByUnknownOpaqueColor();
     } else {
index 3048aec823024e0056c54db0f8e33c94be326d14..13db53295a9976f12cc805e47e5399c02b5ae1a0 100644 (file)
@@ -14,6 +14,7 @@
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrTBackendProcessorFactory.h"
@@ -298,7 +299,7 @@ public:
 private:
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrArithmeticEffect(float k1, float k2, float k3, float k4, bool enforcePMColor,
                        GrTexture* background);
@@ -343,9 +344,9 @@ const GrBackendFragmentProcessorFactory& GrArithmeticEffect::getFactory() const
     return GrTBackendFragmentProcessorFactory<GrArithmeticEffect>::getInstance();
 }
 
-void GrArithmeticEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrArithmeticEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     // TODO: optimize this
-    inout->setToUnknown(InvariantOutput::kWill_ReadInput);
+    inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
index 13bc43cbe2a87e3cb16a38c14c9bb8211ddde6aa..1612e3db965098a530df74340c55a824917b3b2b 100644 (file)
@@ -21,6 +21,7 @@
 #include "GrContext.h"
 #include "GrTexture.h"
 #include "GrFragmentProcessor.h"
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "effects/GrSimpleTextureEffect.h"
@@ -652,7 +653,7 @@ private:
     GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blur_profile);
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     static bool CreateBlurProfileTexture(GrContext *context, float sigma,
                                        GrTexture **blurProfileTexture);
@@ -825,7 +826,7 @@ bool GrRectBlurEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
     return this->getSigma() == s.getSigma() && this->getRect() == s.getRect();
 }
 
-void GrRectBlurEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
@@ -903,7 +904,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     SkRRect             fRRect;
     float               fSigma;
@@ -988,7 +989,7 @@ GrFragmentProcessor* GrRRectBlurEffect::Create(GrContext* context, float sigma,
     return SkNEW_ARGS(GrRRectBlurEffect, (sigma, rrect, blurNinePatchTexture));
 }
 
-void GrRRectBlurEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
index d9d6841e50019c4a83d802880afe01a3f0bbc7b6..751d974ba3c4ee7aad0a3bd8ff4d573a25645396 100644 (file)
@@ -14,6 +14,7 @@
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrTBackendProcessorFactory.h"
@@ -192,6 +193,7 @@ void SkColorCubeFilter::toString(SkString* str) const {
 
 ///////////////////////////////////////////////////////////////////////////////
 #if SK_SUPPORT_GPU
+
 class GrColorCubeEffect : public GrFragmentProcessor {
 public:
     static GrFragmentProcessor* Create(GrTexture* colorCube) {
@@ -205,7 +207,7 @@ public:
 
     static const char* Name() { return "ColorCube"; }
 
-    virtual void onComputeInvariantOutput(GrProcessor::InvariantOutput*) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput*) const SK_OVERRIDE;
 
     class GLProcessor : public GrGLFragmentProcessor {
     public:
@@ -258,8 +260,8 @@ const GrBackendFragmentProcessorFactory& GrColorCubeEffect::getFactory() const {
     return GrTBackendFragmentProcessorFactory<GrColorCubeEffect>::getInstance();
 }
 
-void GrColorCubeEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
-    inout->setToUnknown(InvariantOutput::kWill_ReadInput);
+void GrColorCubeEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
+    inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
index 4c6474a9c38aa4e57e670361caa9aa9a1adc3739..0f6018f5d4a9e38ca02336ed39165e1f3814ddd7 100644 (file)
@@ -124,6 +124,7 @@ SkFlattenable* SkModeColorFilter::CreateProc(SkReadBuffer& buffer) {
 #if SK_SUPPORT_GPU
 #include "GrBlend.h"
 #include "GrFragmentProcessor.h"
+#include "GrInvariantOutput.h"
 #include "GrProcessorUnitTest.h"
 #include "GrTBackendProcessorFactory.h"
 #include "gl/GrGLProcessor.h"
@@ -281,7 +282,7 @@ private:
         return fMode == s.fMode && fColor == s.fColor;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     SkXfermode::Mode fMode;
     GrColor fColor;
@@ -372,7 +373,7 @@ private:
 
 }
 
-void ModeColorFilterEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void ModeColorFilterEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     float inputColor[4];
     GrColorToRGBAFloat(inout->color(), inputColor);
     float filterColor[4];
@@ -386,11 +387,11 @@ void ModeColorFilterEffect::onComputeInvariantOutput(InvariantOutput* inout) con
     SkXfermode::Coeff dstCoeff;
     SkXfermode::Coeff srcCoeff;
     SkAssertResult(SkXfermode::ModeAsCoeff(fMode, &srcCoeff, &dstCoeff));
-    InvariantOutput::ReadInput readInput = InvariantOutput::kWill_ReadInput;
+    GrInvariantOutput::ReadInput readInput = GrInvariantOutput::kWill_ReadInput;
     // These could be calculated from the blend equation with template trickery..
     if (SkXfermode::kZero_Coeff == dstCoeff &&
         !GrBlendCoeffRefsDst(sk_blend_to_grblend(srcCoeff))) {
-        readInput = InvariantOutput::kWillNot_ReadInput;
+        readInput = GrInvariantOutput::kWillNot_ReadInput;
     }
     inout->setToOther(result.getValidComponents(), result.getColor(), readInput);
 }
index 844a37638cb39626a3c6174e03a77f2a9d5ec0eb..f8b9101ae1ff32328ea470b768d9c4e400fe5bec 100644 (file)
@@ -333,6 +333,7 @@ bool SkColorMatrixFilter::asColorMatrix(SkScalar matrix[20]) const {
 
 #if SK_SUPPORT_GPU
 #include "GrFragmentProcessor.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
@@ -426,7 +427,7 @@ private:
         return cme.fMatrix == fMatrix;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) 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.
 
@@ -453,7 +454,7 @@ private:
             // then we can't know the final result.
             if (0 != fMatrix.fMat[kAlphaRowStartIdx + i]) {
                 if (!(inout->validFlags() & kRGBAFlags[i])) {
-                    inout->setToUnknown(InvariantOutput::kWill_ReadInput);
+                    inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
                     return;
                 } else {
                     uint32_t component = (inout->color() >> kShifts[i]) & 0xFF;
@@ -468,7 +469,7 @@ private:
         // result if the matrix could over/underflow for any component?
         inout->setToOther(kA_GrColorComponentFlag,
                           static_cast<uint8_t>(SkScalarPin(outputA, 0, 255)) << GrColor_SHIFT_A,
-                          InvariantOutput::kWill_ReadInput);
+                          GrInvariantOutput::kWill_ReadInput);
     }
 
     SkColorMatrix fMatrix;
index 62e041a76dc6248546d93c6132cb6a9962d38b6d..d2d858148d51a6e898b10022282516edb38971da 100644 (file)
@@ -13,6 +13,7 @@
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrTBackendProcessorFactory.h"
@@ -354,7 +355,7 @@ public:
 private:
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChannelSelector,
                             SkDisplacementMapEffect::ChannelSelectorType yChannelSelector,
@@ -489,13 +490,13 @@ const GrBackendFragmentProcessorFactory& GrDisplacementMapEffect::getFactory() c
     return GrTBackendFragmentProcessorFactory<GrDisplacementMapEffect>::getInstance();
 }
 
-void GrDisplacementMapEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrDisplacementMapEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     // Any displacement offset bringing a pixel out of bounds will output a color of (0,0,0,0),
     // so the only way we'd get a constant alpha is if the input color image has a constant alpha
     // and no displacement offset push any texture coordinates out of bounds OR if the constant
     // alpha is 0. Since this isn't trivial to compute at this point, let's assume the output is
     // not of constant color when a displacement effect is applied.
-    inout->setToUnknown(InvariantOutput::kWillNot_ReadInput);
+    inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
index 24bfbbd56ef05f3a2393d371b13dc437c6755a9e..5baae4aead7e9eafa51d710dbc72b38c9ae8356c 100644 (file)
@@ -19,6 +19,7 @@
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrFragmentProcessor.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 
 class GrGLDiffuseLightingEffect;
@@ -353,7 +354,7 @@ public:
 protected:
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         // lighting shaders are complicated. We just throw up our hands.
         inout->mulByUnknownColor();
     }
index b1b2ffd477898932ea1b514119c6480810aa43db..f3e6e783a2f5e197fd9d0654407e4ebd6335494d 100644 (file)
@@ -14,6 +14,7 @@
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrContext.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 #endif
 
@@ -111,10 +112,10 @@ public:
 private:
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE { return true; }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         // The output is always black. The alpha value for the color passed in is arbitrary.
         inout->setToOther(kRGB_GrColorComponentFlags, GrColorPackRGBA(0, 0, 0, 0),
-                          InvariantOutput::kWill_ReadInput);
+                          GrInvariantOutput::kWill_ReadInput);
     }
 };
 
index e69ac58601c458169037221366a6b828257b97dd..35f39c3368e0d4e5fffdf03c43587006a4c283d9 100644 (file)
@@ -19,6 +19,7 @@
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "gl/GrGLSL.h"
 #include "gl/GrGLTexture.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 
 class GrGLMagnifierEffect;
@@ -74,7 +75,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
@@ -226,7 +227,7 @@ bool GrMagnifierEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
             this->fYInvInset == s.fYInvInset);
 }
 
-void GrMagnifierEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrMagnifierEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     this->updateInvariantOutputForModulation(inout);
 }
 
index 72c98dd97eaa1592ee7aeb5ef5e60ac20858f4f1..6f821bdad2a359a34c623d691cb03adfe7a65012 100644 (file)
@@ -14,6 +14,7 @@
 #include "SkMorphology_opts.h"
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
+#include "GrInvariantOutput.h"
 #include "GrTexture.h"
 #include "GrTBackendProcessorFactory.h"
 #include "gl/GrGLProcessor.h"
@@ -317,7 +318,7 @@ protected:
 private:
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrMorphologyEffect(GrTexture*, Direction, int radius, MorphologyType);
 
@@ -455,7 +456,7 @@ bool GrMorphologyEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
             this->type() == s.type());
 }
 
-void GrMorphologyEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrMorphologyEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     // This is valid because the color components of the result of the kernel all come
     // exactly from existing values in the source texture.
     this->updateInvariantOutputForModulation(inout);
index 3ce106028ae3bba243e27ffd6f6a97d35900fd55..5f400b57cf19dcf0404281cd03ec4bf2efd5f746 100644 (file)
@@ -17,6 +17,7 @@
 #if SK_SUPPORT_GPU
 #include "GrContext.h"
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrTBackendProcessorFactory.h"
@@ -583,8 +584,8 @@ private:
                fPaintingData->fStitchDataInit == s.fPaintingData->fStitchDataInit;
     }
 
-    void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
-        inout->setToUnknown(InvariantOutput::kWillNot_ReadInput);
+    void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
+        inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput);
     }
 
     GrPerlinNoiseEffect(SkPerlinNoiseShader::Type type,
index e4daf20b006e11d92a59a681bd15409b8365c0a3..ac12327ed6347c344e07f460c46a6c15d7e7ec3c 100644 (file)
@@ -276,6 +276,7 @@ bool SkTable_ColorFilter::asComponentTable(SkBitmap* table) const {
 #if SK_SUPPORT_GPU
 
 #include "GrFragmentProcessor.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 #include "SkGr.h"
 #include "effects/GrTextureStripAtlas.h"
@@ -302,7 +303,7 @@ public:
 private:
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     ColorTableEffect(GrTexture* texture, GrTextureStripAtlas* atlas, int row, unsigned flags);
 
@@ -469,7 +470,7 @@ bool ColorTableEffect::onIsEqual(const GrFragmentProcessor& other) const {
     return fRow == that.fRow;
 }
 
-void ColorTableEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void ColorTableEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     // If we kept the table in the effect then we could actually run known inputs through the
     // table.
     uint8_t invalidateFlags = 0;
@@ -485,7 +486,7 @@ void ColorTableEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
     if (fFlags & SkTable_ColorFilter::kA_Flag) {
         invalidateFlags |= kA_GrColorComponentFlag;
     }
-    inout->invalidateComponents(invalidateFlags, InvariantOutput::kWill_ReadInput);
+    inout->invalidateComponents(invalidateFlags, GrInvariantOutput::kWill_ReadInput);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
index 0d1730860af872f3c04fea08a95e6b22d481c6de..b1a3bf0d79b1d4133bc271a9df588158e962d97e 100644 (file)
@@ -945,6 +945,7 @@ SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
 #if SK_SUPPORT_GPU
 
 #include "effects/GrTextureStripAtlas.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "SkGr.h"
@@ -1208,7 +1209,7 @@ bool GrGradientEffect::onIsEqual(const GrFragmentProcessor& processor) const {
     return false;
 }
 
-void GrGradientEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrGradientEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     if (fIsOpaque) {
         inout->mulByUnknownOpaqueColor();
     } else {
index 15f94d4693f91317e61ca336cea17c83180e87e0..20f8112ecdbce62f920df7fe997879538e45c614 100644 (file)
@@ -303,6 +303,7 @@ static inline int next_dither_toggle16(int toggle) {
 
 class GrFragmentStage;
 class GrBackendProcessorFactory;
+class GrInvariantOutput;
 
 /*
  * The interpretation of the texture matrix depends on the sample mode. The
@@ -375,7 +376,7 @@ protected:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     const GrCoordTransform& getCoordTransform() const { return fCoordTransform; }
 
index 3325b1cf68b184414a1e94b22260b0c9f26da787..c3275c8d9fe82b87456f4b25ff6d18f6eb3e8680 100644 (file)
@@ -11,6 +11,7 @@
 #include "GrContext.h"
 #include "GrDrawState.h"
 #include "GrDrawTargetCaps.h"
+#include "GrInvariantOutput.h"
 #include "GrProcessor.h"
 #include "GrPathUtils.h"
 #include "GrTBackendProcessorFactory.h"
@@ -586,7 +587,7 @@ private:
         return true;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
index 46196e2e4ef542d8e3d8a70d8e7fcc377b59b1f7..e743ae9080acc4329eae0900818b84f7b1cd20b0 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "GrAARectRenderer.h"
 #include "GrGpu.h"
+#include "GrInvariantOutput.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLGeometryProcessor.h"
index 8e93f379b6dda98f3259547e0f132ce596bce0a5..1258d59dc5415e276a333d285cd7a94666291194 100644 (file)
@@ -10,6 +10,7 @@
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "gl/GrGLGeometryProcessor.h"
 #include "GrDrawState.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 
 /*
@@ -62,7 +63,7 @@ private:
         return true;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
index 296893c158252c5369e74d6a7ad84f806a23f883..23ebea6afcfd9cbbb4f476edea789b46e21118d4 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "GrDrawState.h"
 
+#include "GrInvariantOutput.h"
 #include "GrOptDrawState.h"
 #include "GrPaint.h"
 
@@ -382,15 +383,17 @@ bool GrDrawState::hasSolidCoverage() const {
         return false;
     }
 
-    GrProcessor::InvariantOutput inout;
-    inout.fIsSingleComponent = true;
+    GrColor color;
+    GrColorComponentFlags flags;
     // Initialize to an unknown starting coverage if per-vertex coverage is specified.
     if (this->hasCoverageVertexAttribute()) {
-        inout.fValidFlags = 0;
+        color = 0;
+        flags = static_cast<GrColorComponentFlags>(0);
     } else {
-        inout.fColor = this->getCoverageColor();
-        inout.fValidFlags = kRGBA_GrColorComponentFlags;
+        color = this->getCoverageColor();
+        flags = kRGBA_GrColorComponentFlags;
     }
+    GrInvariantOutput inout(color, flags, true);
 
     // check the coverage output from the GP
     if (this->hasGeometryProcessor()) {
@@ -687,22 +690,22 @@ GrDrawState::BlendOptFlags GrDrawState::getBlendOpts(bool forceCoverage,
 
 
 bool GrDrawState::srcAlphaWillBeOne() const {
-    GrProcessor::InvariantOutput inoutColor;
-    inoutColor.fIsSingleComponent = false;
+    GrColor color;
+    GrColorComponentFlags flags;
     // Check if per-vertex or constant color may have partial alpha
     if (this->hasColorVertexAttribute()) {
         if (fHints & kVertexColorsAreOpaque_Hint) {
-            inoutColor.fValidFlags = kA_GrColorComponentFlag;
-            inoutColor.fColor = 0xFF << GrColor_SHIFT_A;
+            flags = kA_GrColorComponentFlag;
+            color = 0xFF << GrColor_SHIFT_A;
         } else {
-            inoutColor.fValidFlags = 0;
-            // not strictly necessary but we get false alarms from tools about uninit.
-            inoutColor.fColor = 0;
+            flags = static_cast<GrColorComponentFlags>(0);
+            color = 0;
         }
     } else {
-        inoutColor.fValidFlags = kRGBA_GrColorComponentFlags;
-        inoutColor.fColor = this->getColor();
+        flags = kRGBA_GrColorComponentFlags;
+        color = this->getColor();
     }
+    GrInvariantOutput inoutColor(color, flags, false);
 
     // Run through the color stages
     for (int s = 0; s < this->numColorStages(); ++s) {
@@ -714,15 +717,14 @@ bool GrDrawState::srcAlphaWillBeOne() const {
     if (this->isCoverageDrawing()) {
         // The shader generated for coverage drawing runs the full coverage computation and then
         // makes the shader output be the multiplication of color and coverage. We mirror that here.
-        GrProcessor::InvariantOutput inoutCoverage;
-        inoutCoverage.fIsSingleComponent = true;
         if (this->hasCoverageVertexAttribute()) {
-            inoutCoverage.fValidFlags = 0;
-            inoutCoverage.fColor = 0; // suppresses any warnings.
+            flags = static_cast<GrColorComponentFlags>(0);
+            color = 0;
         } else {
-            inoutCoverage.fValidFlags = kRGBA_GrColorComponentFlags;
-            inoutCoverage.fColor = this->getCoverageColor();
+            flags = kRGBA_GrColorComponentFlags;
+            color = this->getCoverageColor();
         }
+        GrInvariantOutput inoutCoverage(color, flags, true);
 
         if (this->hasGeometryProcessor()) {
             fGeometryProcessor->computeInvariantOutput(&inoutCoverage);
diff --git a/src/gpu/GrInvariantOutput.cpp b/src/gpu/GrInvariantOutput.cpp
new file mode 100644 (file)
index 0000000..6f9a9d1
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * 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
+
index 79eef0c02499153e642c084e62ea706db0ebcacb..7d8b06c129cbb570d45d8622dd4483fcd3a5f47c 100644 (file)
@@ -11,6 +11,7 @@
 #include "GrDrawState.h"
 #include "GrDrawTargetCaps.h"
 #include "GrGpu.h"
+#include "GrInvariantOutput.h"
 
 GrOptDrawState::GrOptDrawState(const GrDrawState& drawState,
                                BlendOptFlags blendOptFlags,
@@ -223,37 +224,38 @@ void GrOptDrawState::computeEffectiveColorStages(const GrDrawState& ds,
                                                  int* firstColorStageIdx,
                                                  uint8_t* fixedFunctionVAToRemove) {
     // Set up color and flags for ConstantColorComponent checks
-    GrProcessor::InvariantOutput inout;
-    inout.fIsSingleComponent = false;
+    GrColor color;
+    GrColorComponentFlags flags;
     if (!descInfo->hasColorVertexAttribute()) {
-        inout.fColor = ds.getColor();
-        inout.fValidFlags = kRGBA_GrColorComponentFlags;
+        color = ds.getColor();
+        flags = kRGBA_GrColorComponentFlags;
     } else {
         if (ds.vertexColorsAreOpaque()) {
-            inout.fColor = 0xFF << GrColor_SHIFT_A;
-            inout.fValidFlags = kA_GrColorComponentFlag;
+            color = 0xFF << GrColor_SHIFT_A;
+            flags = kA_GrColorComponentFlag;
         } else {
-            inout.fValidFlags = 0;
+            flags = static_cast<GrColorComponentFlags>(0);
             // not strictly necessary but we get false alarms from tools about uninit.
-            inout.fColor = 0;
+            color = 0;
         }
     }
+    GrInvariantOutput inout(color, flags, false);
 
     for (int i = 0; i < ds.numColorStages(); ++i) {
         const GrFragmentProcessor* fp = ds.getColorStage(i).getProcessor();
         fp->computeInvariantOutput(&inout);
-        if (!inout.fWillUseInputColor) {
+        if (!inout.willUseInputColor()) {
             *firstColorStageIdx = i;
             descInfo->fInputColorIsUsed = false;
         }
-        if (kRGBA_GrColorComponentFlags == inout.fValidFlags) {
+        if (kRGBA_GrColorComponentFlags == inout.validFlags()) {
             *firstColorStageIdx = i + 1;
-            fColor = inout.fColor;
+            fColor = inout.color();
             descInfo->fInputColorIsUsed = true;
             *fixedFunctionVAToRemove |= 0x1 << kColor_GrVertexAttribBinding;
             // Since we are clearing all previous color stages we are in a state where we have found
             // zero stages that don't multiply the inputColor.
-            inout.fNonMulStageFound = false;
+            inout.resetNonMulStageFound();
         }
     }
 }
@@ -268,7 +270,7 @@ void GrOptDrawState::computeEffectiveCoverageStages(const GrDrawState& ds,
     // Don't do any optimizations on coverage stages. It should not be the case where we do not use
     // input coverage in an effect
 #ifdef OptCoverageStages
-    GrProcessor::InvariantOutput inout;
+    GrInvariantOutput inout;
     for (int i = 0; i < ds.numCoverageStages(); ++i) {
         const GrFragmentProcessor* fp = ds.getCoverageStage(i).getProcessor();
         fp->computeInvariantOutput(&inout);
index c06909d5e1e19383dcb23b01f0b549940175ad13..2bb674a8ded376655e8c4c93c18392faab250d59 100644 (file)
@@ -17,6 +17,7 @@
 #include "GrDrawState.h"
 #include "GrDrawTarget.h"
 #include "GrGpu.h"
+#include "GrInvariantOutput.h"
 
 #include "SkRRect.h"
 #include "SkStrokeRec.h"
@@ -144,7 +145,7 @@ private:
         return cee.fStroke == fStroke;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
@@ -286,7 +287,7 @@ private:
         return eee.fStroke == fStroke;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
@@ -451,7 +452,7 @@ private:
         return eee.fMode == fMode;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
index 56e8aa02f3f4e23ac041f2e011c4609290a0859a..366378751d75bfc78a2da6c84a5e303566530de8 100644 (file)
@@ -9,6 +9,7 @@
 #include "GrPaint.h"
 
 #include "GrBlend.h"
+#include "GrInvariantOutput.h"
 #include "effects/GrSimpleTextureEffect.h"
 
 void GrPaint::addColorTextureProcessor(GrTexture* texture, const SkMatrix& matrix) {
@@ -52,21 +53,18 @@ bool GrPaint::getOpaqueAndKnownColor(GrColor* solidColor,
 
     // TODO: Share this implementation with GrDrawState
 
-    GrProcessor::InvariantOutput inout;
-    inout.fColor = 0xFFFFFFFF;
-    inout.fValidFlags = kRGBA_GrColorComponentFlags;
-    inout.fIsSingleComponent = true;
+    GrInvariantOutput inoutCoverage(0xFFFFFFFF,
+                                    kRGBA_GrColorComponentFlags,
+                                    true);
     int count = fCoverageStages.count();
     for (int i = 0; i < count; ++i) {
-        fCoverageStages[i].getProcessor()->computeInvariantOutput(&inout);
+        fCoverageStages[i].getProcessor()->computeInvariantOutput(&inoutCoverage);
     }
-    if (!inout.isSolidWhite()) {
+    if (!inoutCoverage.isSolidWhite()) {
         return false;
     }
 
-    inout.fColor = fColor;
-    inout.fValidFlags = kRGBA_GrColorComponentFlags;
-    inout.fIsSingleComponent = false;
+    GrInvariantOutput inout(fColor, kRGBA_GrColorComponentFlags, false);
     count = fColorStages.count();
     for (int i = 0; i < count; ++i) {
         fColorStages[i].getProcessor()->computeInvariantOutput(&inout);
@@ -76,7 +74,7 @@ bool GrPaint::getOpaqueAndKnownColor(GrColor* solidColor,
 
     GrBlendCoeff srcCoeff = fSrcBlendCoeff;
     GrBlendCoeff dstCoeff = fDstBlendCoeff;
-    GrSimplifyBlend(&srcCoeff, &dstCoeff, inout.fColor, inout.fValidFlags,
+    GrSimplifyBlend(&srcCoeff, &dstCoeff, inout.color(), inout.validFlags(),
                     0, 0, 0);
 
     bool opaque = kZero_GrBlendCoeff == dstCoeff && !GrBlendCoeffRefsDst(srcCoeff);
@@ -89,8 +87,8 @@ bool GrPaint::getOpaqueAndKnownColor(GrColor* solidColor,
                     break;
 
                 case kOne_GrBlendCoeff:
-                    *solidColor = inout.fColor;
-                    *solidColorKnownComponents = inout.fValidFlags;
+                    *solidColor = inout.color();
+                    *solidColorKnownComponents = inout.validFlags();
                     break;
 
                 // The src coeff should never refer to the src and if it refers to dst then opaque
index 3de1dcf8911e4bb678a62a0f05fab374e7b11ba3..31f0004e68f9f238ef8152076850d06fd5d7880c 100644 (file)
@@ -9,6 +9,7 @@
 #include "GrBackendProcessorFactory.h"
 #include "GrContext.h"
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
 #include "GrMemoryPool.h"
 #include "SkTLS.h"
 
@@ -128,52 +129,13 @@ bool GrProcessor::hasSameTextureAccesses(const GrProcessor& that) const {
     return true;
 }
 
+void GrProcessor::computeInvariantOutput(GrInvariantOutput* inout) const {
+    inout->resetWillUseInputColor();
+    this->onComputeInvariantOutput(inout);
 #ifdef SK_DEBUG
-
-void GrProcessor::InvariantOutput::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 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;
+    inout->validate();
+#endif
 }
-#endif // end DEBUG
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
index 5d2917d00cbd463d24776a82a4dc18b0b97d23d6..9b71f7d395261543fea31487f1f9f2ddafe65227 100644 (file)
@@ -11,6 +11,7 @@
 #include "GrDrawTargetCaps.h"
 #include "GrProcessor.h"
 #include "GrGeometryProcessor.h"
+#include "GrInvariantOutput.h"
 #include "GrTypesPriv.h"
 
 /**
@@ -101,7 +102,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
@@ -170,7 +171,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
@@ -241,7 +242,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         inout->mulByUnknownAlpha();
     }
 
index 5ed8ece0b54bd9e74689bf2e3bed5930965c182c..ce7810dc5a314b81ba15eb7a17c82756939b2fca 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrBicubicEffect.h"
-
+#include "GrInvariantOutput.h"
 
 #define DS(x) SkDoubleToScalar(x)
 
@@ -168,7 +168,7 @@ bool GrBicubicEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
            fDomain == s.fDomain;
 }
 
-void GrBicubicEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrBicubicEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     // FIXME: Perhaps we can do better.
     inout->mulByUnknownAlpha();
 }
index 642f7cfc5a63ac22d3c2dd45e23e7fa2d2407ec6..8f11825704bca6b1da60f4bf412bbc08e074e3db 100644 (file)
@@ -14,6 +14,7 @@
 #include "GrTBackendProcessorFactory.h"
 
 class GrGLBicubicEffect;
+class GrInvariantOutput;
 
 class GrBicubicEffect : public GrSingleTextureEffect {
 public:
@@ -92,7 +93,7 @@ private:
                     const SkMatrix &matrix, const SkRect& domain);
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     float           fCoefficients[16];
     GrTextureDomain fDomain;
index edbd0b283161dd4d476d10d1ea38676ea977c461..6f02f3073fdc71f6f9d53a77f04e2c89e0d826ca 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "GrConfigConversionEffect.h"
 #include "GrContext.h"
+#include "GrInvariantOutput.h"
 #include "GrTBackendProcessorFactory.h"
 #include "GrSimpleTextureEffect.h"
 #include "gl/GrGLProcessor.h"
@@ -125,7 +126,7 @@ bool GrConfigConversionEffect::onIsEqual(const GrFragmentProcessor& s) const {
            other.fPMConversion == fPMConversion;
 }
 
-void GrConfigConversionEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrConfigConversionEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     this->updateInvariantOutputForModulation(inout);
 }
 
index e1fd7d397c7d373bf8c5e40f3e4e5baab142e6f5..35b3b57d4642ab82661bb51733367134c9183c1f 100644 (file)
@@ -12,6 +12,7 @@
 
 class GrFragmentStage;
 class GrGLConfigConversionEffect;
+class GrInvariantOutput;
 
 /**
  * This class is used to perform config conversions. Clients may want to read/write data that is
@@ -63,7 +64,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     bool            fSwapRedAndBlue;
     PMConversion    fPMConversion;
index c84b54085000843877f3eb1a329a51a925ae32f2..ff08eae2d0ffd1326644fadc085e1ad3acb41c32 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrConvexPolyEffect.h"
-
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLSL.h"
 #include "GrTBackendProcessorFactory.h"
@@ -43,7 +43,7 @@ private:
         return fRect == aare.fRect;
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         if (fRect.isEmpty()) {
             // An empty rect will have no coverage anywhere.
             inout->mulByKnownAlpha(0);
@@ -326,7 +326,7 @@ GrFragmentProcessor* GrConvexPolyEffect::Create(GrPrimitiveEdgeType edgeType, co
 
 GrConvexPolyEffect::~GrConvexPolyEffect() {}
 
-void GrConvexPolyEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrConvexPolyEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
index ef96c87074237c75612d5992c76ac31d3c0d63c8..7464d5447f8180ee4fd89e573654d05a716a12ce 100644 (file)
@@ -13,6 +13,7 @@
 #include "GrTypesPriv.h"
 
 class GrGLConvexPolyEffect;
+class GrInvariantOutput;
 class SkPath;
 
 /**
@@ -77,7 +78,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrPrimitiveEdgeType    fEdgeType;
     int                    fEdgeCount;
index 5f5800931aec1e111ee3ff26a86a4be475a46f6b..e99e520cf06bb3289be5fa33b1a85f19ed8ddc5b 100644 (file)
@@ -9,6 +9,7 @@
 #define GrConvolutionEffect_DEFINED
 
 #include "Gr1DKernelEffect.h"
+#include "GrInvariantOutput.h"
 
 class GrGLConvolutionEffect;
 
@@ -97,7 +98,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const {
         // If the texture was opaque we could know that the output color if we knew the sum of the
         // kernel values.
         inout->mulByUnknownColor();
index 77e799414aed9702b5d6de8232df39dfc7d26f85..39f44820b0013b79443d5bb0e37d64b06eda6207 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include "GrCustomCoordsTextureEffect.h"
+#include "GrInvariantOutput.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLSL.h"
@@ -66,7 +67,7 @@ bool GrCustomCoordsTextureEffect::onIsEqual(const GrGeometryProcessor& other) co
     return true;
 }
 
-void GrCustomCoordsTextureEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrCustomCoordsTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     if (GrPixelConfigIsOpaque(this->texture(0)->config())) {
         inout->mulByUnknownOpaqueColor();
     } else {
index 3010ba245f400fdab1c4d883a7f4ed4285b5a8c2..103e20916c548b8e56799254717def7569f85254 100644 (file)
@@ -12,6 +12,7 @@
 #include "GrGeometryProcessor.h"
 
 class GrGLCustomCoordsTextureEffect;
+class GrInvariantOutput;
 
 /**
  * The output color of this effect is a modulation of the input color and a sample from a texture.
@@ -39,7 +40,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrTextureAccess    fTextureAccess;
     const GrShaderVar& fInTextureCoords;
index 65ba84858d161ab6c22fb820ae113bbce27ac2b8..bee7b87a41c27383bc5df156a7503d8b7693a287 100644 (file)
@@ -18,6 +18,7 @@
 #include "GrCoordTransform.h"
 #include "GrDrawTarget.h"
 #include "GrDrawTargetCaps.h"
+#include "GrInvariantOutput.h"
 #include "GrProcessor.h"
 #include "GrGpu.h"
 #include "GrStrokeInfo.h"
@@ -463,7 +464,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrPrimitiveEdgeType    fEdgeType;
     const GrShaderVar&  fInCoord;
@@ -576,7 +577,7 @@ GrGeometryProcessor* DashingCircleEffect::Create(GrPrimitiveEdgeType edgeType, c
 
 DashingCircleEffect::~DashingCircleEffect() {}
 
-void DashingCircleEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void DashingCircleEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
@@ -667,7 +668,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrPrimitiveEdgeType    fEdgeType;
     const GrShaderVar&  fInCoord;
@@ -791,7 +792,7 @@ GrGeometryProcessor* DashingLineEffect::Create(GrPrimitiveEdgeType edgeType,
 
 DashingLineEffect::~DashingLineEffect() {}
 
-void DashingLineEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void DashingLineEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
index 0c7a9a3d8c21da5dc6603faf9e025f410ee34145..bc4146d891141a2bdb559d582db1f434b2d344bf 100755 (executable)
@@ -6,6 +6,7 @@
  */
 
 #include "GrDistanceFieldTextureEffect.h"
+#include "GrInvariantOutput.h"
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLSL.h"
@@ -189,7 +190,7 @@ bool GrDistanceFieldTextureEffect::onIsEqual(const GrGeometryProcessor& other) c
            fFlags == cte.fFlags;
 }
 
-void GrDistanceFieldTextureEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrDistanceFieldTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
@@ -363,7 +364,7 @@ bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
     return fFlags == cte.fFlags;
 }
 
-void GrDistanceFieldNoGammaTextureEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrDistanceFieldNoGammaTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
@@ -606,7 +607,7 @@ bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
             fFlags == cte.fFlags);
 }
 
-void GrDistanceFieldLCDTextureEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrDistanceFieldLCDTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownColor();
 }
 
index ea02d195b7d8de759e043fbe82e926ab4d2685a8..bcc40889fd7b6f71d7982f3f321ad19d0ba575b0 100644 (file)
@@ -14,6 +14,7 @@
 class GrGLDistanceFieldTextureEffect;
 class GrGLDistanceFieldNoGammaTextureEffect;
 class GrGLDistanceFieldLCDTextureEffect;
+class GrInvariantOutput;
 
 enum GrDistanceFieldEffectFlags {
     kSimilarity_DistanceFieldEffectFlag = 0x01,   // ctm is similarity matrix
@@ -80,7 +81,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrTextureAccess    fTextureAccess;
 #ifdef SK_GAMMA_APPLY_TO_A8
@@ -126,7 +127,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrTextureAccess    fTextureAccess;
     uint32_t           fFlags;
@@ -172,7 +173,7 @@ private:
 
     virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GrTextureAccess    fTextureAccess;
     GrTextureAccess    fGammaTextureAccess;
index 643829b848de2b21a1b88b81c986159c91a54408..37655a711656a45e3c54ee7cac556434a2d86b86 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrDitherEffect.h"
-
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLSL.h"
 #include "GrTBackendProcessorFactory.h"
@@ -42,15 +42,15 @@ private:
     // All dither effects are equal
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE { return true; }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
     typedef GrFragmentProcessor INHERITED;
 };
 
-void DitherEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
-    inout->setToUnknown(InvariantOutput::kWill_ReadInput);
+void DitherEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
+    inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
 }
 
 //////////////////////////////////////////////////////////////////////////////
index 5aee6c53afd859d16ef67d11247a2aacc87a03c6..999606213d0abbf48fdeeff7ee01e0a4d839d4d1 100644 (file)
@@ -9,6 +9,7 @@
 #define GrMatrixConvolutionEffect_DEFINED
 
 #include "GrSingleTextureEffect.h"
+#include "GrInvariantOutput.h"
 #include "GrTextureDomain.h"
 
 // A little bit less than the minimum # uniforms required by DX9SM2 (32).
@@ -79,7 +80,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         // TODO: Try to do better?
         inout->mulByUnknownColor();
     }
index 8965c990c0e7e1c624d900cd0e36833ddd08e729..26b96ad8ecf3ac8d42b7d54c97ec02183643f0a0 100644 (file)
@@ -7,7 +7,7 @@
 
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrOvalEffect.h"
-
+#include "GrInvariantOutput.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLSL.h"
 #include "GrTBackendProcessorFactory.h"
@@ -39,7 +39,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     SkPoint             fCenter;
     SkScalar            fRadius;
@@ -56,7 +56,7 @@ GrFragmentProcessor* CircleEffect::Create(GrPrimitiveEdgeType edgeType, const Sk
     return SkNEW_ARGS(CircleEffect, (edgeType, center, radius));
 }
 
-void CircleEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void CircleEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
@@ -211,7 +211,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     SkPoint             fCenter;
     SkVector            fRadii;
@@ -230,7 +230,7 @@ GrFragmentProcessor* EllipseEffect::Create(GrPrimitiveEdgeType edgeType,
     return SkNEW_ARGS(EllipseEffect, (edgeType, center, rx, ry));
 }
 
-void EllipseEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void EllipseEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
index 2f4ff2b5b6d2a957ae5565a4934c47d9a7574324..b378b1025bce55cdc0bb3ca8f78dd532f915f06b 100644 (file)
@@ -11,6 +11,7 @@
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLSL.h"
 #include "GrConvexPolyEffect.h"
+#include "GrInvariantOutput.h"
 #include "GrOvalEffect.h"
 #include "GrTBackendProcessorFactory.h"
 
@@ -66,7 +67,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     SkRRect                fRRect;
     GrPrimitiveEdgeType    fEdgeType;
@@ -86,7 +87,7 @@ GrFragmentProcessor* CircularRRectEffect::Create(GrPrimitiveEdgeType edgeType,
     return SkNEW_ARGS(CircularRRectEffect, (edgeType, circularCornerFlags, rrect));
 }
 
-void CircularRRectEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void CircularRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
@@ -406,7 +407,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     SkRRect             fRRect;
     GrPrimitiveEdgeType    fEdgeType;
@@ -424,7 +425,7 @@ EllipticalRRectEffect::Create(GrPrimitiveEdgeType edgeType, const SkRRect& rrect
     return SkNEW_ARGS(EllipticalRRectEffect, (edgeType, rrect));
 }
 
-void EllipticalRRectEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void EllipticalRRectEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     inout->mulByUnknownAlpha();
 }
 
index 4da9e8eec41ef68f84725ba9492a3f3fb177d8b8..9c0ff354ce513716ce8d8114c602a86ce39ba7c9 100644 (file)
@@ -5,13 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "gl/builders/GrGLProgramBuilder.h"
 #include "GrSimpleTextureEffect.h"
+#include "GrInvariantOutput.h"
+#include "GrTBackendProcessorFactory.h"
+#include "GrTexture.h"
 #include "gl/GrGLProcessor.h"
 #include "gl/GrGLSL.h"
 #include "gl/GrGLTexture.h"
-#include "GrTBackendProcessorFactory.h"
-#include "GrTexture.h"
+#include "gl/builders/GrGLProgramBuilder.h"
 
 class GrGLSimpleTextureEffect : public GrGLFragmentProcessor {
 public:
@@ -41,7 +42,7 @@ private:
 
 ///////////////////////////////////////////////////////////////////////////////
 
-void GrSimpleTextureEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrSimpleTextureEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     this->updateInvariantOutputForModulation(inout);
 }
 
index 4c79aab346171e765707ee9bbcbfb2340f4231a0..f2c8d16a869d8159c9f12ef5d63bd1305236710d 100644 (file)
@@ -11,6 +11,7 @@
 #include "GrSingleTextureEffect.h"
 
 class GrGLSimpleTextureEffect;
+class GrInvariantOutput;
 
 /**
  * The output color of this effect is a modulation of the input color and a sample from a texture.
@@ -70,7 +71,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor& other) const SK_OVERRIDE { return true; }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
index 836c54c234b8181a61dab097c9dff18fd1a3f473..efdf25555259d315cf66970f18daca472d4de8ce 100644 (file)
@@ -9,8 +9,9 @@
 #define GrSingleTextureEffect_DEFINED
 
 #include "GrFragmentProcessor.h"
-#include "SkMatrix.h"
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
+#include "SkMatrix.h"
 
 class GrTexture;
 
@@ -38,7 +39,7 @@ protected:
      * the subclass output color will be a modulation of the input color with a value read from the
      * texture.
      */
-    void updateInvariantOutputForModulation(InvariantOutput* inout) const {
+    void updateInvariantOutputForModulation(GrInvariantOutput* inout) const {
         if (GrPixelConfigIsOpaque(this->texture(0)->config())) {
             inout->mulByUnknownOpaqueColor();
         } else {
index 2a0cd2065c9b7eededec4fa8922ed758e2a7e815..db3ef2cd98715064211c55dfefa6ac66576fc4a0 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "gl/builders/GrGLProgramBuilder.h"
 #include "GrTextureDomain.h"
+#include "GrInvariantOutput.h"
 #include "GrSimpleTextureEffect.h"
 #include "GrTBackendProcessorFactory.h"
 #include "gl/GrGLProcessor.h"
@@ -268,7 +269,7 @@ bool GrTextureDomainEffect::onIsEqual(const GrFragmentProcessor& sBase) const {
     return this->fTextureDomain == s.fTextureDomain;
 }
 
-void GrTextureDomainEffect::onComputeInvariantOutput(InvariantOutput* inout) const {
+void GrTextureDomainEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
     if (GrTextureDomain::kDecal_Mode == fTextureDomain.mode()) { // TODO: helper
         inout->mulByUnknownColor();
     } else {
index 6f56f918388216939c219a4d6ce3f98d7bf8ba4a..19b07adfb0bd8858720b005d116323f9a9653f11 100644 (file)
@@ -13,6 +13,7 @@
 
 class GrGLProgramBuilder;
 class GrGLShaderBuilder;
+class GrInvariantOutput;
 struct SkRect;
 
 /**
@@ -175,7 +176,7 @@ private:
 
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE;
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
index 703c672cfdcd67a07c8c1a3e205b18c2b58aa8e5..f668dbae17658716a68aa3e5932d588c0a45c8ff 100644 (file)
@@ -9,6 +9,7 @@
 #include "GrYUVtoRGBEffect.h"
 
 #include "GrCoordTransform.h"
+#include "GrInvariantOutput.h"
 #include "GrProcessor.h"
 #include "gl/GrGLProcessor.h"
 #include "GrTBackendProcessorFactory.h"
@@ -106,10 +107,10 @@ private:
         return fColorSpace == s.getColorSpace();
     }
 
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE {
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE {
         // YUV is opaque
         inout->setToOther(kA_GrColorComponentFlag, 0xFF << GrColor_SHIFT_A,
-                          InvariantOutput::kWillNot_ReadInput);
+                          GrInvariantOutput::kWillNot_ReadInput);
     }
 
     GrCoordTransform fCoordTransform;
index 9be082a47bae7d27922bf74d4f17957673098cf7..dd731e07732a86904386bc30ed1220690fe26657 100644 (file)
@@ -13,6 +13,7 @@
 #if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
 
 #include "GrContextFactory.h"
+#include "GrInvariantOutput.h"
 #include "GrOptDrawState.h"
 #include "GrTBackendProcessorFactory.h"
 #include "GrTest.h"
@@ -50,7 +51,7 @@ public:
 private:
     BigKeyProcessor() { }
     virtual bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE { return true; }
-    virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERRIDE { }
+    virtual void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE { }
 
     GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
 
index 82f5f31b3ea8bf803a210c86d3c5a5fbe590ede4..aeee3daf37860971fe4070d2e9f550024b8c3128 100644 (file)
@@ -11,6 +11,7 @@
 #include "GrContext.h"
 #include "GrContextFactory.h"
 #include "GrFragmentProcessor.h"
+#include "GrInvariantOutput.h"
 #include "SkColorFilter.h"
 #include "SkGr.h"
 #include "Test.h"
@@ -99,9 +100,9 @@ static void test_getConstantColorComponents(skiatest::Reporter* reporter, GrCont
         const GetConstantComponentTestCase& test = filterTests[i];
         SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateModeFilter(test.filterColor, test.filterMode));
         SkAutoTUnref<GrFragmentProcessor> effect(cf->asFragmentProcessor(grContext));
-        GrProcessor::InvariantOutput inout;
-        inout.setToOther(test.inputComponents, test.inputColor,
-                         GrProcessor::InvariantOutput::kWill_ReadInput);
+        GrInvariantOutput inout(test.inputColor,
+                                static_cast<GrColorComponentFlags>(test.inputComponents),
+                                false);
         effect->computeInvariantOutput(&inout);
 
         REPORTER_ASSERT(reporter, filterColor(inout.color(), inout.validFlags()) == test.outputColor);