OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkArithmeticMode_gpu_DEFINED | 8 #ifndef SkArithmeticMode_gpu_DEFINED |
9 #define SkArithmeticMode_gpu_DEFINED | 9 #define SkArithmeticMode_gpu_DEFINED |
10 | 10 |
11 #if SK_SUPPORT_GPU | 11 #if SK_SUPPORT_GPU |
12 | 12 |
13 #include "GrCoordTransform.h" | 13 #include "GrCoordTransform.h" |
14 #include "GrFragmentProcessor.h" | 14 #include "GrFragmentProcessor.h" |
15 #include "GrTextureAccess.h" | 15 #include "GrTextureAccess.h" |
| 16 #include "GrTypes.h" |
| 17 #include "GrXferProcessor.h" |
16 | 18 |
17 class GrInvariantOutput; | 19 class GrInvariantOutput; |
| 20 class GrProcOptInfo; |
18 class GrTexture; | 21 class GrTexture; |
19 | 22 |
20 /////////////////////////////////////////////////////////////////////////////// | 23 /////////////////////////////////////////////////////////////////////////////// |
21 // Fragment Processor | 24 // Fragment Processor |
22 /////////////////////////////////////////////////////////////////////////////// | 25 /////////////////////////////////////////////////////////////////////////////// |
23 | 26 |
24 class GrGLArtithmeticFP; | 27 class GrGLArtithmeticFP; |
25 | 28 |
26 class GrArithmeticFP : public GrFragmentProcessor { | 29 class GrArithmeticFP : public GrFragmentProcessor { |
27 public: | 30 public: |
28 static GrFragmentProcessor* Create(float k1, float k2, float k3, float k4, b
ool enforcePMColor, | 31 static GrFragmentProcessor* Create(float k1, float k2, float k3, float k4, b
ool enforcePMColor, |
29 GrTexture* background) { | 32 GrTexture* background) { |
30 return SkNEW_ARGS(GrArithmeticFP, (k1, k2, k3, k4, enforcePMColor, backg
round)); | 33 return SkNEW_ARGS(GrArithmeticFP, (k1, k2, k3, k4, enforcePMColor, backg
round)); |
31 } | 34 } |
32 | 35 |
33 ~GrArithmeticFP() SK_OVERRIDE {}; | 36 ~GrArithmeticFP() SK_OVERRIDE {}; |
34 | 37 |
35 const char* name() const SK_OVERRIDE { return "Arithmetic"; } | 38 const char* name() const SK_OVERRIDE { return "Arithmetic"; } |
36 | 39 |
37 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const
SK_OVERRIDE; | 40 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const
SK_OVERRIDE; |
38 | 41 |
39 GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; | 42 GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
40 | 43 |
41 GrTexture* backgroundTexture() const { return fBackgroundAccess.getTexture()
; } | |
42 | |
43 float k1() const { return fK1; } | 44 float k1() const { return fK1; } |
44 float k2() const { return fK2; } | 45 float k2() const { return fK2; } |
45 float k3() const { return fK3; } | 46 float k3() const { return fK3; } |
46 float k4() const { return fK4; } | 47 float k4() const { return fK4; } |
47 bool enforcePMColor() const { return fEnforcePMColor; } | 48 bool enforcePMColor() const { return fEnforcePMColor; } |
48 | 49 |
49 private: | 50 private: |
50 bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; | 51 bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE; |
51 | 52 |
52 void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE; | 53 void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE; |
53 | 54 |
54 GrArithmeticFP(float k1, float k2, float k3, float k4, bool enforcePMColor, | 55 GrArithmeticFP(float k1, float k2, float k3, float k4, bool enforcePMColor, |
55 GrTexture* background); | 56 GrTexture* background); |
56 | 57 |
57 float fK1, fK2, fK3, fK4; | 58 float fK1, fK2, fK3, fK4; |
58 bool fEnforcePMColor; | 59 bool fEnforcePMColor; |
59 GrCoordTransform fBackgroundTransform; | 60 GrCoordTransform fBackgroundTransform; |
60 GrTextureAccess fBackgroundAccess; | 61 GrTextureAccess fBackgroundAccess; |
61 | 62 |
62 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 63 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
63 typedef GrFragmentProcessor INHERITED; | 64 typedef GrFragmentProcessor INHERITED; |
64 }; | 65 }; |
65 | 66 |
| 67 /////////////////////////////////////////////////////////////////////////////// |
| 68 // Xfer Processor |
| 69 /////////////////////////////////////////////////////////////////////////////// |
| 70 |
| 71 class GrArithmeticXP : public GrXferProcessor { |
| 72 public: |
| 73 static GrXferProcessor* Create(float k1, float k2, float k3, float k4, bool
enforcePMColor) { |
| 74 return SkNEW_ARGS(GrArithmeticXP, (k1, k2, k3, k4, enforcePMColor)); |
| 75 } |
| 76 |
| 77 ~GrArithmeticXP() SK_OVERRIDE {}; |
| 78 |
| 79 const char* name() const SK_OVERRIDE { return "Arithmetic"; } |
| 80 |
| 81 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const
SK_OVERRIDE; |
| 82 |
| 83 GrGLXferProcessor* createGLInstance() const SK_OVERRIDE; |
| 84 |
| 85 bool hasSecondaryOutput() const SK_OVERRIDE { return false; } |
| 86 |
| 87 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI, |
| 88 const GrProcOptInfo& coveragePOI, |
| 89 bool doesStencilWrite, |
| 90 GrColor* overrideColor, |
| 91 const GrDrawTargetCaps& caps) SK_
OVERRIDE; |
| 92 |
| 93 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE { |
| 94 blendInfo->fSrcBlend = kOne_GrBlendCoeff; |
| 95 blendInfo->fDstBlend = kZero_GrBlendCoeff; |
| 96 blendInfo->fBlendConstant = 0; |
| 97 } |
| 98 |
| 99 float k1() const { return fK1; } |
| 100 float k2() const { return fK2; } |
| 101 float k3() const { return fK3; } |
| 102 float k4() const { return fK4; } |
| 103 bool enforcePMColor() const { return fEnforcePMColor; } |
| 104 |
| 105 private: |
| 106 GrArithmeticXP(float k1, float k2, float k3, float k4, bool enforcePMColor); |
| 107 |
| 108 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { |
| 109 const GrArithmeticXP& xp = xpBase.cast<GrArithmeticXP>(); |
| 110 if (fK1 != xp.fK1 || |
| 111 fK2 != xp.fK2 || |
| 112 fK3 != xp.fK3 || |
| 113 fK4 != xp.fK4 || |
| 114 fEnforcePMColor != xp.fEnforcePMColor) { |
| 115 return false; |
| 116 } |
| 117 return true; |
| 118 } |
| 119 |
| 120 float fK1, fK2, fK3, fK4; |
| 121 bool fEnforcePMColor; |
| 122 |
| 123 typedef GrXferProcessor INHERITED; |
| 124 }; |
| 125 |
| 126 /////////////////////////////////////////////////////////////////////////////// |
| 127 |
| 128 class GrArithmeticXPFactory : public GrXPFactory { |
| 129 public: |
| 130 static GrXPFactory* Create(float k1, float k2, float k3, float k4, bool enfo
rcePMColor) { |
| 131 return SkNEW_ARGS(GrArithmeticXPFactory, (k1, k2, k3, k4, enforcePMColor
)); |
| 132 } |
| 133 |
| 134 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, |
| 135 const GrProcOptInfo& coveragePOI) const
SK_OVERRIDE { |
| 136 return GrArithmeticXP::Create(fK1, fK2, fK3, fK4, fEnforcePMColor); |
| 137 } |
| 138 |
| 139 bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const
SK_OVERRIDE { |
| 140 return true; |
| 141 } |
| 142 |
| 143 bool canApplyCoverage(const GrProcOptInfo& colorPOI, |
| 144 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE { |
| 145 return true; |
| 146 } |
| 147 |
| 148 bool canTweakAlphaForCoverage() const SK_OVERRIDE { |
| 149 return false; |
| 150 } |
| 151 |
| 152 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo&
coveragePOI, |
| 153 GrXPFactory::InvariantOutput*) const SK_OVERRIDE; |
| 154 |
| 155 bool willReadDst(const GrProcOptInfo& colorPOI, |
| 156 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE { |
| 157 return true; |
| 158 } |
| 159 |
| 160 private: |
| 161 GrArithmeticXPFactory(float k1, float k2, float k3, float k4, bool enforcePM
Color); |
| 162 |
| 163 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { |
| 164 const GrArithmeticXPFactory& xpf = xpfBase.cast<GrArithmeticXPFactory>()
; |
| 165 if (fK1 != xpf.fK1 || |
| 166 fK2 != xpf.fK2 || |
| 167 fK3 != xpf.fK3 || |
| 168 fK4 != xpf.fK4 || |
| 169 fEnforcePMColor != xpf.fEnforcePMColor) { |
| 170 return false; |
| 171 } |
| 172 return true; |
| 173 } |
| 174 |
| 175 GR_DECLARE_XP_FACTORY_TEST; |
| 176 |
| 177 float fK1, fK2, fK3, fK4; |
| 178 bool fEnforcePMColor; |
| 179 |
| 180 typedef GrXPFactory INHERITED; |
| 181 }; |
| 182 |
66 #endif | 183 #endif |
67 #endif | 184 #endif |
OLD | NEW |