| /* | 
 |  * Copyright 2015 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #ifndef SkArithmeticMode_gpu_DEFINED | 
 | #define SkArithmeticMode_gpu_DEFINED | 
 |  | 
 | #include "SkTypes.h" | 
 |  | 
 | #if SK_SUPPORT_GPU | 
 |  | 
 | #include "GrCaps.h" | 
 | #include "GrCoordTransform.h" | 
 | #include "GrFragmentProcessor.h" | 
 | #include "GrTextureAccess.h" | 
 | #include "GrTypes.h" | 
 | #include "GrXferProcessor.h" | 
 |  | 
 | class GrInvariantOutput; | 
 | class GrProcOptInfo; | 
 | class GrTexture; | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Fragment Processor | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | class GrGLArtithmeticFP; | 
 |  | 
 | class GrArithmeticFP : public GrFragmentProcessor { | 
 | public: | 
 |     static const GrFragmentProcessor* Create(float k1, float k2, float k3, float k4, | 
 |                                              bool enforcePMColor, const GrFragmentProcessor* dst) { | 
 |         return new GrArithmeticFP(k1, k2, k3, k4, enforcePMColor, dst); | 
 |     } | 
 |  | 
 |     ~GrArithmeticFP() override {}; | 
 |  | 
 |     const char* name() const override { return "Arithmetic"; } | 
 |  | 
 |     SkString dumpInfo() const override { | 
 |         SkString str; | 
 |         str.appendf("K1: %.2f K2: %.2f K3: %.2f K4: %.2f", fK1, fK2, fK3, fK4); | 
 |         return str; | 
 |     } | 
 |  | 
 |     float k1() const { return fK1; } | 
 |     float k2() const { return fK2; } | 
 |     float k3() const { return fK3; } | 
 |     float k4() const { return fK4; } | 
 |     bool enforcePMColor() const { return fEnforcePMColor; } | 
 |  | 
 | private: | 
 |     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; | 
 |  | 
 |     void onGetGLSLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const override; | 
 |  | 
 |     bool onIsEqual(const GrFragmentProcessor&) const override; | 
 |  | 
 |     void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 
 |  | 
 |     GrArithmeticFP(float k1, float k2, float k3, float k4, bool enforcePMColor, | 
 |                    const GrFragmentProcessor* dst); | 
 |  | 
 |     float                       fK1, fK2, fK3, fK4; | 
 |     bool                        fEnforcePMColor; | 
 |  | 
 |     GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 
 |     typedef GrFragmentProcessor INHERITED; | 
 | }; | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // Xfer Processor | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | class GrArithmeticXPFactory : public GrXPFactory { | 
 | public: | 
 |     static GrXPFactory* Create(float k1, float k2, float k3, float k4, bool enforcePMColor) { | 
 |         return new GrArithmeticXPFactory(k1, k2, k3, k4, enforcePMColor); | 
 |     } | 
 |  | 
 |     void getInvariantBlendedColor(const GrProcOptInfo& colorPOI, | 
 |                                   GrXPFactory::InvariantBlendedColor*) const override; | 
 |  | 
 | private: | 
 |     GrArithmeticXPFactory(float k1, float k2, float k3, float k4, bool enforcePMColor);  | 
 |  | 
 |     GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, | 
 |                                            const GrPipelineOptimizations& optimizations, | 
 |                                            bool hasMixedSamples, | 
 |                                            const DstTexture*) const override;  | 
 |  | 
 |     bool onWillReadDstColor(const GrCaps& caps, | 
 |                             const GrPipelineOptimizations& optimizations, | 
 |                             bool hasMixedSamples) const override { | 
 |         return true; | 
 |     } | 
 |  | 
 |     bool onIsEqual(const GrXPFactory& xpfBase) const override { | 
 |         const GrArithmeticXPFactory& xpf = xpfBase.cast<GrArithmeticXPFactory>(); | 
 |         if (fK1 != xpf.fK1 || | 
 |             fK2 != xpf.fK2 || | 
 |             fK3 != xpf.fK3 || | 
 |             fK4 != xpf.fK4 || | 
 |             fEnforcePMColor != xpf.fEnforcePMColor) { | 
 |             return false; | 
 |         } | 
 |         return true; | 
 |     } | 
 |  | 
 |     GR_DECLARE_XP_FACTORY_TEST; | 
 |  | 
 |     float                       fK1, fK2, fK3, fK4; | 
 |     bool                        fEnforcePMColor; | 
 |  | 
 |     typedef GrXPFactory INHERITED; | 
 | }; | 
 |  | 
 | #endif | 
 | #endif |