OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 GrPorterDuffXferProcessor_DEFINED | 8 #ifndef GrPorterDuffXferProcessor_DEFINED |
9 #define GrPorterDuffXferProcessor_DEFINED | 9 #define GrPorterDuffXferProcessor_DEFINED |
10 | 10 |
11 #include "GrTypes.h" | 11 #include "GrTypes.h" |
12 #include "GrXferProcessor.h" | 12 #include "GrXferProcessor.h" |
13 #include "SkXfermode.h" | 13 #include "SkXfermode.h" |
14 | 14 |
15 class GrInvariantOutput; | |
16 class GrProcOptInfo; | 15 class GrProcOptInfo; |
17 | 16 |
18 class GrPorterDuffXferProcessor : public GrXferProcessor { | 17 class GrPorterDuffXferProcessor : public GrXferProcessor { |
19 public: | 18 public: |
20 static GrXferProcessor* Create(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, | 19 static GrXferProcessor* Create(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, |
21 GrColor constant = 0) { | 20 GrColor constant = 0) { |
22 return SkNEW_ARGS(GrPorterDuffXferProcessor, (srcBlend, dstBlend, consta
nt)); | 21 return SkNEW_ARGS(GrPorterDuffXferProcessor, (srcBlend, dstBlend, consta
nt)); |
23 } | 22 } |
24 | 23 |
25 virtual ~GrPorterDuffXferProcessor(); | 24 ~GrPorterDuffXferProcessor() SK_OVERRIDE; |
26 | 25 |
27 virtual const char* name() const SK_OVERRIDE { return "Porter Duff"; } | 26 const char* name() const SK_OVERRIDE { return "Porter Duff"; } |
28 | 27 |
29 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const
SK_OVERRIDE; | 28 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const
SK_OVERRIDE; |
30 | 29 |
31 GrGLXferProcessor* createGLInstance() const SK_OVERRIDE; | 30 GrGLXferProcessor* createGLInstance() const SK_OVERRIDE; |
32 | 31 |
33 virtual bool hasSecondaryOutput() const SK_OVERRIDE; | 32 bool hasSecondaryOutput() const SK_OVERRIDE; |
34 | 33 |
35 /////////////////////////////////////////////////////////////////////////// | 34 /////////////////////////////////////////////////////////////////////////// |
36 /// @name Stage Output Types | 35 /// @name Stage Output Types |
37 //// | 36 //// |
38 | 37 |
39 enum PrimaryOutputType { | 38 enum PrimaryOutputType { |
40 kNone_PrimaryOutputType, | 39 kNone_PrimaryOutputType, |
41 kColor_PrimaryOutputType, | 40 kColor_PrimaryOutputType, |
42 kCoverage_PrimaryOutputType, | 41 kCoverage_PrimaryOutputType, |
43 // Modulate color and coverage, write result as the color output. | 42 // Modulate color and coverage, write result as the color output. |
(...skipping 17 matching lines...) Expand all Loading... |
61 kCoverageISC_SecondaryOutputType, | 60 kCoverageISC_SecondaryOutputType, |
62 | 61 |
63 kSecondaryOutputTypeCnt, | 62 kSecondaryOutputTypeCnt, |
64 }; | 63 }; |
65 | 64 |
66 PrimaryOutputType primaryOutputType() const { return fPrimaryOutputType; } | 65 PrimaryOutputType primaryOutputType() const { return fPrimaryOutputType; } |
67 SecondaryOutputType secondaryOutputType() const { return fSecondaryOutputTyp
e; } | 66 SecondaryOutputType secondaryOutputType() const { return fSecondaryOutputTyp
e; } |
68 | 67 |
69 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI, | 68 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI, |
70 const GrProcOptInfo& coveragePOI, | 69 const GrProcOptInfo& coveragePOI, |
71 bool colorWriteDisabled, | |
72 bool doesStencilWrite, | 70 bool doesStencilWrite, |
73 GrColor* overrideColor, | 71 GrColor* overrideColor, |
74 const GrDrawTargetCaps& caps) SK_
OVERRIDE; | 72 const GrDrawTargetCaps& caps) SK_
OVERRIDE; |
75 | 73 |
76 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE { | 74 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE { |
77 blendInfo->fSrcBlend = fSrcBlend; | 75 blendInfo->fSrcBlend = fSrcBlend; |
78 blendInfo->fDstBlend = fDstBlend; | 76 blendInfo->fDstBlend = fDstBlend; |
79 blendInfo->fBlendConstant = fBlendConstant; | 77 blendInfo->fBlendConstant = fBlendConstant; |
80 } | 78 } |
81 | 79 |
82 private: | 80 private: |
83 GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, GrCo
lor constant); | 81 GrPorterDuffXferProcessor(GrBlendCoeff srcBlend, GrBlendCoeff dstBlend, GrCo
lor constant); |
84 | 82 |
85 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { | 83 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE { |
86 const GrPorterDuffXferProcessor& xp = xpBase.cast<GrPorterDuffXferProces
sor>(); | 84 const GrPorterDuffXferProcessor& xp = xpBase.cast<GrPorterDuffXferProces
sor>(); |
87 if (fSrcBlend != xp.fSrcBlend || | 85 if (fSrcBlend != xp.fSrcBlend || |
88 fDstBlend != xp.fDstBlend || | 86 fDstBlend != xp.fDstBlend || |
89 fBlendConstant != xp.fBlendConstant || | 87 fBlendConstant != xp.fBlendConstant || |
90 fPrimaryOutputType != xp.fPrimaryOutputType || | 88 fPrimaryOutputType != xp.fPrimaryOutputType || |
91 fSecondaryOutputType != xp.fSecondaryOutputType) { | 89 fSecondaryOutputType != xp.fSecondaryOutputType) { |
92 return false; | 90 return false; |
93 } | 91 } |
94 return true; | 92 return true; |
95 } | 93 } |
96 | 94 |
97 GrXferProcessor::OptFlags internalGetOptimizations(const GrProcOptInfo& colo
rPOI, | 95 GrXferProcessor::OptFlags internalGetOptimizations(const GrProcOptInfo& colo
rPOI, |
98 const GrProcOptInfo& cove
ragePOI, | 96 const GrProcOptInfo& cove
ragePOI, |
99 bool colorWriteDisabled, | |
100 bool doesStencilWrite); | 97 bool doesStencilWrite); |
101 | 98 |
102 void calcOutputTypes(GrXferProcessor::OptFlags blendOpts, const GrDrawTarget
Caps& caps, | 99 void calcOutputTypes(GrXferProcessor::OptFlags blendOpts, const GrDrawTarget
Caps& caps, |
103 bool hasSolidCoverage, bool readDst); | 100 bool hasSolidCoverage, bool readDst); |
104 | 101 |
105 GrBlendCoeff fSrcBlend; | 102 GrBlendCoeff fSrcBlend; |
106 GrBlendCoeff fDstBlend; | 103 GrBlendCoeff fDstBlend; |
107 GrColor fBlendConstant; | 104 GrColor fBlendConstant; |
108 PrimaryOutputType fPrimaryOutputType; | 105 PrimaryOutputType fPrimaryOutputType; |
109 SecondaryOutputType fSecondaryOutputType; | 106 SecondaryOutputType fSecondaryOutputType; |
(...skipping 13 matching lines...) Expand all Loading... |
123 | 120 |
124 static GrXPFactory* Create(GrBlendCoeff src, GrBlendCoeff dst) { | 121 static GrXPFactory* Create(GrBlendCoeff src, GrBlendCoeff dst) { |
125 return SkNEW_ARGS(GrPorterDuffXPFactory, (src, dst)); | 122 return SkNEW_ARGS(GrPorterDuffXPFactory, (src, dst)); |
126 } | 123 } |
127 | 124 |
128 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, | 125 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, |
129 const GrProcOptInfo& coveragePOI) const
SK_OVERRIDE; | 126 const GrProcOptInfo& coveragePOI) const
SK_OVERRIDE; |
130 | 127 |
131 bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const
SK_OVERRIDE; | 128 bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const
SK_OVERRIDE; |
132 | 129 |
133 bool canApplyCoverage(const GrProcOptInfo& colorPOI, const GrProcOptInfo& co
veragePOI, | 130 bool canApplyCoverage(const GrProcOptInfo& colorPOI, |
134 bool colorWriteDisabled) const SK_OVERRIDE; | 131 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE; |
135 | 132 |
136 bool canTweakAlphaForCoverage() const SK_OVERRIDE; | 133 bool canTweakAlphaForCoverage() const SK_OVERRIDE; |
137 | 134 |
138 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo&
coveragePOI, | 135 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo&
coveragePOI, |
139 bool colorWriteDisabled, | |
140 GrXPFactory::InvariantOutput*) const SK_OVERRIDE; | 136 GrXPFactory::InvariantOutput*) const SK_OVERRIDE; |
141 | 137 |
| 138 bool willReadDst(const GrProcOptInfo& colorPOI, |
| 139 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE; |
| 140 |
142 private: | 141 private: |
143 GrPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst); | 142 GrPorterDuffXPFactory(GrBlendCoeff src, GrBlendCoeff dst); |
144 | 143 |
145 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { | 144 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE { |
146 const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>()
; | 145 const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>()
; |
147 return (fSrcCoeff == xpf.fSrcCoeff && fDstCoeff == xpf.fDstCoeff); | 146 return (fSrcCoeff == xpf.fSrcCoeff && fDstCoeff == xpf.fDstCoeff); |
148 } | 147 } |
149 | 148 |
150 GR_DECLARE_XP_FACTORY_TEST; | 149 GR_DECLARE_XP_FACTORY_TEST; |
151 | 150 |
152 GrBlendCoeff fSrcCoeff; | 151 GrBlendCoeff fSrcCoeff; |
153 GrBlendCoeff fDstCoeff; | 152 GrBlendCoeff fDstCoeff; |
154 | 153 |
155 typedef GrXPFactory INHERITED; | 154 typedef GrXPFactory INHERITED; |
156 }; | 155 }; |
157 | 156 |
158 #endif | 157 #endif |
OLD | NEW |