OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2015 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #include "SkXfermode.h" | |
9 #include "Test.h" | |
10 | |
11 #if SK_SUPPORT_GPU | |
12 | |
13 #include "GrBatch.h" | |
14 #include "GrContextFactory.h" | |
15 #include "GrGpu.h" | |
16 #include "GrXferProcessor.h" | |
17 #include "effects/GrPorterDuffXferProcessor.h" | |
18 #include "gl/GrGLCaps.h" | |
19 | |
20 //////////////////////////////////////////////////////////////////////////////// | |
21 | |
22 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps); | |
23 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G rCaps& caps); | |
24 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps); | |
25 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr Caps& caps); | |
26 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G rCaps& caps); | |
27 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC aps& caps); | |
28 static void test_no_dual_source_blending(skiatest::Reporter* reporter, GrGpu* gp u); | |
29 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps); | |
30 | |
31 DEF_GPUTEST(GrPorterDuff, reporter, factory) { | |
32 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType); | |
33 if (!ctx) { | |
34 SkFAIL("Failed to create null context."); | |
35 return; | |
36 } | |
37 | |
38 const GrCaps& caps = *ctx->getGpu()->caps(); | |
39 if (!caps.shaderCaps()->dualSourceBlendingSupport()) { | |
40 SkFAIL("Null context does not support dual source blending."); | |
41 return; | |
42 } | |
43 | |
44 test_alpha_unknown_with_coverage(reporter, caps); | |
45 test_alpha_unknown_no_coverage(reporter, caps); | |
46 test_alpha_opaque_with_coverage(reporter, caps); | |
47 test_alpha_opaque_no_coverage(reporter, caps); | |
48 test_color_white_with_coverage(reporter, caps); | |
49 test_color_white_with_coverage(reporter, caps); | |
50 test_color_white_no_coverage(reporter, caps); | |
51 test_no_dual_source_blending(reporter, ctx->getGpu()); | |
52 test_lcd_coverage(reporter, caps); | |
53 } | |
54 | |
55 //////////////////////////////////////////////////////////////////////////////// | |
56 | |
57 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__) | |
58 | |
59 enum { | |
60 kNone_OutputType, | |
61 kCoverage_OutputType, | |
62 kModulate_OutputType, | |
63 kISAModulate_OutputType, | |
64 kISCModulate_OutputType | |
65 }; | |
66 | |
67 enum { | |
68 kNone_Opt = GrXferProcessor::kNone_Opt, | |
69 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag, | |
70 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag, | |
71 kIgnoreCoverage_OptFlag = GrXferProcessor::kIgnoreCoverage_OptFlag , | |
72 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCovera ge_OptFlag | |
73 }; | |
74 | |
75 class GrPorterDuffTest { | |
76 public: | |
77 struct XPInfo { | |
78 XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const Gr Caps& caps, | |
79 const GrProcOptInfo& colorPOI, const GrProcOptInfo& covPOI) { | |
80 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode )); | |
81 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps)); | |
82 TEST_ASSERT(!xpf->willNeedDstCopy(caps, colorPOI, covPOI)); | |
83 xpf->getInvariantOutput(colorPOI, covPOI, &fInvariantOutput); | |
84 fOptFlags = xp->getOptimizations(colorPOI, covPOI, false, 0, caps); | |
85 GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType); | |
86 xp->getBlendInfo(&fBlendInfo); | |
87 TEST_ASSERT(!xp->willReadDstColor()); | |
88 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendI nfo.fDstBlend)); | |
89 } | |
90 | |
91 GrXPFactory::InvariantOutput fInvariantOutput; | |
92 int fOptFlags; | |
93 int fPrimaryOutputType; | |
94 int fSecondaryOutputType; | |
95 GrXferProcessor::BlendInfo fBlendInfo; | |
96 }; | |
97 | |
98 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int * outSecondary) { | |
99 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary ); | |
100 } | |
101 }; | |
102 | |
103 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { | |
104 GrProcOptInfo colorPOI, covPOI; | |
105 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals e); | |
106 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | |
107 | |
108 SkASSERT(!colorPOI.isOpaque()); | |
109 SkASSERT(!colorPOI.isSolidWhite()); | |
110 SkASSERT(!covPOI.isSolidWhite()); | |
111 SkASSERT(!covPOI.isFourChannelOutput()); | |
112 | |
113 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
114 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
115 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
116 | |
117 switch (xfermode) { | |
118 case SkXfermode::kClear_Mode: | |
119 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
120 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
121 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
122 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
123 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
124 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
125 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
126 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
127 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
128 break; | |
129 case SkXfermode::kSrc_Mode: | |
130 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
131 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
132 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
133 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
134 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); | |
135 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
136 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
137 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
138 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
139 break; | |
140 case SkXfermode::kDst_Mode: | |
141 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
142 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
143 TEST_ASSERT((kSkipDraw_OptFlag | | |
144 kIgnoreColor_OptFlag | | |
145 kIgnoreCoverage_OptFlag | | |
146 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
147 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
148 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
149 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
150 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
151 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
152 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
153 break; | |
154 case SkXfermode::kSrcOver_Mode: | |
155 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
156 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
157 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
158 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
159 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
160 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
161 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
162 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
163 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
164 break; | |
165 case SkXfermode::kDstOver_Mode: | |
166 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
167 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
168 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
169 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
170 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
171 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
172 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
173 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
174 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
175 break; | |
176 case SkXfermode::kSrcIn_Mode: | |
177 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
178 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
179 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
180 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
181 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); | |
182 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
183 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
184 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
185 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
186 break; | |
187 case SkXfermode::kDstIn_Mode: | |
188 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
189 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
190 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
191 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType); | |
192 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
193 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
194 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
195 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
196 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
197 break; | |
198 case SkXfermode::kSrcOut_Mode: | |
199 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
200 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
201 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
202 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
203 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); | |
204 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
205 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
206 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
207 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
208 break; | |
209 case SkXfermode::kDstOut_Mode: | |
210 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
211 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
212 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
213 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
214 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
216 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
217 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
219 break; | |
220 case SkXfermode::kSrcATop_Mode: | |
221 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
222 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
223 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
224 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
225 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
226 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
227 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
228 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
229 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
230 break; | |
231 case SkXfermode::kDstATop_Mode: | |
232 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
233 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
234 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
235 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
236 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType) ; | |
237 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
238 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
239 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
240 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
241 break; | |
242 case SkXfermode::kXor_Mode: | |
243 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
244 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
245 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
246 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
247 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
248 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
249 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
250 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
251 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
252 break; | |
253 case SkXfermode::kPlus_Mode: | |
254 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
255 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
256 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
257 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
258 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
259 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
260 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
261 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
262 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
263 break; | |
264 case SkXfermode::kModulate_Mode: | |
265 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
266 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
267 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
268 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); | |
269 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
270 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
271 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
272 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
273 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
274 break; | |
275 case SkXfermode::kScreen_Mode: | |
276 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
277 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
278 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
279 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
280 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
281 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
282 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
283 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
284 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
285 break; | |
286 default: | |
287 ERRORF(reporter, "Invalid xfermode."); | |
288 break; | |
289 } | |
290 } | |
291 } | |
292 | |
293 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G rCaps& caps) { | |
294 GrProcOptInfo colorPOI, covPOI; | |
295 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0), | |
296 kR_GrColorComponentFlag | kB_GrColorComponent Flag, false); | |
297 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true); | |
298 | |
299 SkASSERT(!colorPOI.isOpaque()); | |
300 SkASSERT(!colorPOI.isSolidWhite()); | |
301 SkASSERT(covPOI.isSolidWhite()); | |
302 SkASSERT(!covPOI.isFourChannelOutput()); | |
303 | |
304 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
305 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
306 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
307 | |
308 switch (xfermode) { | |
309 case SkXfermode::kClear_Mode: | |
310 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
311 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
312 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
313 TEST_ASSERT((kIgnoreColor_OptFlag | | |
314 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
315 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
316 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
317 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
318 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
319 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
320 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
321 break; | |
322 case SkXfermode::kSrc_Mode: | |
323 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
324 TEST_ASSERT(229 == GrColorUnpackR(xpi.fInvariantOutput.fBlendedC olor)); | |
325 TEST_ASSERT(154 == GrColorUnpackB(xpi.fInvariantOutput.fBlendedC olor)); | |
326 TEST_ASSERT((kR_GrColorComponentFlag | | |
327 kB_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags); | |
328 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
329 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
330 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
331 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
332 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
333 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
334 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
335 break; | |
336 case SkXfermode::kDst_Mode: | |
337 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
338 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
339 TEST_ASSERT((kSkipDraw_OptFlag | | |
340 kIgnoreColor_OptFlag | | |
341 kIgnoreCoverage_OptFlag | | |
342 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
343 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
344 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
345 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
346 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
347 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
348 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
349 break; | |
350 case SkXfermode::kSrcOver_Mode: | |
351 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
352 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
353 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
354 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
355 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
356 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
357 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
358 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
359 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
360 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
361 break; | |
362 case SkXfermode::kDstOver_Mode: | |
363 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
364 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
365 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
366 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
367 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
368 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
369 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
370 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
371 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
372 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
373 break; | |
374 case SkXfermode::kSrcIn_Mode: | |
375 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
376 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
377 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
378 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
379 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
380 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
381 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
382 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
383 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
384 break; | |
385 case SkXfermode::kDstIn_Mode: | |
386 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
387 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
388 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
389 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
390 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
391 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
392 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
393 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
394 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
395 break; | |
396 case SkXfermode::kSrcOut_Mode: | |
397 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
398 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
399 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
400 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
401 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
402 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
403 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
404 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
405 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
406 break; | |
407 case SkXfermode::kDstOut_Mode: | |
408 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
409 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
410 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
411 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
412 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
413 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
414 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
415 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
416 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
417 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
418 break; | |
419 case SkXfermode::kSrcATop_Mode: | |
420 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
421 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
422 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
423 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
424 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
425 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
426 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
427 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
428 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
429 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
430 break; | |
431 case SkXfermode::kDstATop_Mode: | |
432 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
433 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
434 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
435 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
436 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
437 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
438 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
439 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
440 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
441 break; | |
442 case SkXfermode::kXor_Mode: | |
443 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
444 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
445 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
446 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
447 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
448 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
449 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
450 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
451 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
452 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
453 break; | |
454 case SkXfermode::kPlus_Mode: | |
455 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
456 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
457 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
458 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
459 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
460 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
461 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
462 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
463 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
464 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
465 break; | |
466 case SkXfermode::kModulate_Mode: | |
467 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
468 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
469 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
470 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
471 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
472 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
473 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
474 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
475 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
476 break; | |
477 case SkXfermode::kScreen_Mode: | |
478 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
479 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
480 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
481 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
482 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
483 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
484 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
485 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
486 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
487 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
488 break; | |
489 default: | |
490 ERRORF(reporter, "Invalid xfermode."); | |
491 break; | |
492 } | |
493 } | |
494 } | |
495 | |
496 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { | |
497 GrProcOptInfo colorPOI, covPOI; | |
498 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon entFlag, false); | |
499 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | |
500 | |
501 SkASSERT(colorPOI.isOpaque()); | |
502 SkASSERT(!colorPOI.isSolidWhite()); | |
503 SkASSERT(!covPOI.isSolidWhite()); | |
504 SkASSERT(!covPOI.isFourChannelOutput()); | |
505 | |
506 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
507 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
508 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
509 | |
510 switch (xfermode) { | |
511 case SkXfermode::kClear_Mode: | |
512 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
513 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
514 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
515 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
516 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
517 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
518 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
519 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
520 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
521 break; | |
522 case SkXfermode::kSrc_Mode: | |
523 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
524 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
525 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
526 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
527 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
528 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
529 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
530 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
531 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
532 break; | |
533 case SkXfermode::kDst_Mode: | |
534 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
535 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
536 TEST_ASSERT((kSkipDraw_OptFlag | | |
537 kIgnoreColor_OptFlag | | |
538 kIgnoreCoverage_OptFlag | | |
539 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
540 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
541 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
542 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
543 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
544 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
545 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
546 break; | |
547 case SkXfermode::kSrcOver_Mode: | |
548 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
549 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
550 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
551 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
552 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
553 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
554 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
555 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
556 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
557 break; | |
558 case SkXfermode::kDstOver_Mode: | |
559 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
560 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
561 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
562 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
563 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
564 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
565 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
566 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
567 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
568 break; | |
569 case SkXfermode::kSrcIn_Mode: | |
570 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
571 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
572 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
573 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
574 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
575 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
576 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
577 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
578 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
579 break; | |
580 case SkXfermode::kDstIn_Mode: | |
581 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
582 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
583 TEST_ASSERT((kSkipDraw_OptFlag | | |
584 kIgnoreColor_OptFlag | | |
585 kIgnoreCoverage_OptFlag | | |
586 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
587 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
588 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
589 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
590 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
591 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
592 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
593 break; | |
594 case SkXfermode::kSrcOut_Mode: | |
595 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
596 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
597 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
598 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
599 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
600 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
601 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
602 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
603 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
604 break; | |
605 case SkXfermode::kDstOut_Mode: | |
606 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
607 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
608 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
609 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
610 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
611 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
612 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
613 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
614 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
615 break; | |
616 case SkXfermode::kSrcATop_Mode: | |
617 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
618 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
619 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
620 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
621 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
622 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
623 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
624 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
625 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
626 break; | |
627 case SkXfermode::kDstATop_Mode: | |
628 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
629 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
630 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
631 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
632 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
633 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
634 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
635 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
636 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
637 break; | |
638 case SkXfermode::kXor_Mode: | |
639 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
640 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
641 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
642 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
643 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
644 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
645 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
646 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
647 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
648 break; | |
649 case SkXfermode::kPlus_Mode: | |
650 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
651 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
652 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
653 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
654 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
655 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
656 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
657 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
658 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
659 break; | |
660 case SkXfermode::kModulate_Mode: | |
661 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
662 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
663 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
664 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); | |
665 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
666 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
667 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
668 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
669 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
670 break; | |
671 case SkXfermode::kScreen_Mode: | |
672 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
673 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
674 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
675 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
676 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
677 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
678 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
679 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
680 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
681 break; | |
682 default: | |
683 ERRORF(reporter, "Invalid xfermode."); | |
684 break; | |
685 } | |
686 } | |
687 } | |
688 | |
689 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr Caps& caps) { | |
690 GrProcOptInfo colorPOI, covPOI; | |
691 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255), | |
692 kG_GrColorComponentFlag | kA_GrColorComponent Flag, false); | |
693 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true); | |
694 | |
695 SkASSERT(colorPOI.isOpaque()); | |
696 SkASSERT(!colorPOI.isSolidWhite()); | |
697 SkASSERT(covPOI.isSolidWhite()); | |
698 SkASSERT(!covPOI.isFourChannelOutput()); | |
699 | |
700 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
701 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
702 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
703 | |
704 switch (xfermode) { | |
705 case SkXfermode::kClear_Mode: | |
706 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
707 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
708 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
709 TEST_ASSERT((kIgnoreColor_OptFlag | | |
710 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
711 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
712 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
713 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
714 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
715 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
716 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
717 break; | |
718 case SkXfermode::kSrc_Mode: | |
719 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
720 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor)); | |
721 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor)); | |
722 TEST_ASSERT((kG_GrColorComponentFlag | | |
723 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags); | |
724 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
725 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
726 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
727 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
728 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
729 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
730 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
731 break; | |
732 case SkXfermode::kDst_Mode: | |
733 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
734 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
735 TEST_ASSERT((kSkipDraw_OptFlag | | |
736 kIgnoreColor_OptFlag | | |
737 kIgnoreCoverage_OptFlag | | |
738 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
739 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
740 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
741 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
742 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
743 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
744 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
745 break; | |
746 case SkXfermode::kSrcOver_Mode: | |
747 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
748 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor)); | |
749 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor)); | |
750 TEST_ASSERT((kG_GrColorComponentFlag | | |
751 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags); | |
752 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
753 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
754 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
755 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
756 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
757 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
758 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
759 break; | |
760 case SkXfermode::kDstOver_Mode: | |
761 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
762 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
763 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
764 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
765 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
766 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
767 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
768 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
769 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
770 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
771 break; | |
772 case SkXfermode::kSrcIn_Mode: | |
773 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
774 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
775 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
776 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
777 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
778 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
779 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
780 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
781 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
782 break; | |
783 case SkXfermode::kDstIn_Mode: | |
784 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
785 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
786 TEST_ASSERT((kSkipDraw_OptFlag | | |
787 kIgnoreColor_OptFlag | | |
788 kIgnoreCoverage_OptFlag | | |
789 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
790 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
791 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
792 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
793 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
794 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
795 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
796 break; | |
797 case SkXfermode::kSrcOut_Mode: | |
798 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
799 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
800 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
801 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
802 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
803 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
804 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
805 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
806 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
807 break; | |
808 case SkXfermode::kDstOut_Mode: | |
809 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
810 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
811 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
812 TEST_ASSERT((kIgnoreColor_OptFlag | | |
813 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
814 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
815 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
816 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
817 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
818 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
819 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
820 break; | |
821 case SkXfermode::kSrcATop_Mode: | |
822 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
823 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
824 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
825 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
826 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
827 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
828 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
829 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
830 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
831 break; | |
832 case SkXfermode::kDstATop_Mode: | |
833 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
834 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
835 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
836 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
837 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
838 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
839 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
840 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
841 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
842 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
843 break; | |
844 case SkXfermode::kXor_Mode: | |
845 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
846 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
847 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
848 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
849 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
850 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
851 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
852 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
853 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
854 break; | |
855 case SkXfermode::kPlus_Mode: | |
856 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
857 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
858 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
859 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
860 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
861 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
862 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
863 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
864 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
865 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
866 break; | |
867 case SkXfermode::kModulate_Mode: | |
868 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
869 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
870 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
871 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
872 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
873 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
874 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
875 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
876 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
877 break; | |
878 case SkXfermode::kScreen_Mode: | |
879 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
880 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
881 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
882 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
883 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
884 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
885 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
886 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
887 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
888 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
889 break; | |
890 default: | |
891 ERRORF(reporter, "Invalid xfermode."); | |
892 break; | |
893 } | |
894 } | |
895 } | |
896 | |
897 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G rCaps& caps) { | |
898 GrProcOptInfo colorPOI, covPOI; | |
899 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom ponentFlags, false); | |
900 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | |
901 | |
902 SkASSERT(colorPOI.isOpaque()); | |
903 SkASSERT(colorPOI.isSolidWhite()); | |
904 SkASSERT(!covPOI.isSolidWhite()); | |
905 SkASSERT(!covPOI.isFourChannelOutput()); | |
906 | |
907 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
908 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
909 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
910 | |
911 switch (xfermode) { | |
912 case SkXfermode::kClear_Mode: | |
913 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
914 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
915 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
916 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
917 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
918 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
919 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
920 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
921 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
922 break; | |
923 case SkXfermode::kSrc_Mode: | |
924 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
925 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
926 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
927 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
928 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
929 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
930 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
931 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
932 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
933 break; | |
934 case SkXfermode::kDst_Mode: | |
935 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
936 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
937 TEST_ASSERT((kSkipDraw_OptFlag | | |
938 kIgnoreColor_OptFlag | | |
939 kIgnoreCoverage_OptFlag | | |
940 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
941 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
942 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
943 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
944 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
945 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
946 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
947 break; | |
948 case SkXfermode::kSrcOver_Mode: | |
949 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
950 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
951 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
952 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
953 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
954 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
955 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
956 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
957 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
958 break; | |
959 case SkXfermode::kDstOver_Mode: | |
960 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
961 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
962 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
963 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
964 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
965 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
966 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
967 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
968 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
969 break; | |
970 case SkXfermode::kSrcIn_Mode: | |
971 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
972 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
973 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
974 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
975 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
976 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
977 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
978 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
979 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
980 break; | |
981 case SkXfermode::kDstIn_Mode: | |
982 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
983 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
984 TEST_ASSERT((kSkipDraw_OptFlag | | |
985 kIgnoreColor_OptFlag | | |
986 kIgnoreCoverage_OptFlag | | |
987 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
988 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
989 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
990 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
991 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
992 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
993 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
994 break; | |
995 case SkXfermode::kSrcOut_Mode: | |
996 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
997 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
998 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
999 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1000 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1001 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1002 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1003 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1004 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1005 break; | |
1006 case SkXfermode::kDstOut_Mode: | |
1007 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1008 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1009 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
1010 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
1011 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1012 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
1013 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1014 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1015 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1016 break; | |
1017 case SkXfermode::kSrcATop_Mode: | |
1018 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1019 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1020 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1021 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1022 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1023 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1024 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1025 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1026 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1027 break; | |
1028 case SkXfermode::kDstATop_Mode: | |
1029 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1030 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1031 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1032 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1033 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1034 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1035 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1036 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1037 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1038 break; | |
1039 case SkXfermode::kXor_Mode: | |
1040 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1041 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1042 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1043 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1044 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1045 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1046 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1047 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1048 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1049 break; | |
1050 case SkXfermode::kPlus_Mode: | |
1051 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1052 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1053 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1054 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1055 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1056 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1057 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1058 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1059 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1060 break; | |
1061 case SkXfermode::kModulate_Mode: | |
1062 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1063 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1064 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
1065 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); | |
1066 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1067 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
1068 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1069 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1070 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1071 break; | |
1072 case SkXfermode::kScreen_Mode: | |
1073 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1074 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1075 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1076 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1077 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1078 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1079 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1080 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1081 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1082 break; | |
1083 default: | |
1084 ERRORF(reporter, "Invalid xfermode."); | |
1085 break; | |
1086 } | |
1087 } | |
1088 } | |
1089 | |
1090 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC aps& caps) { | |
1091 GrProcOptInfo colorPOI, covPOI; | |
1092 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom ponentFlags, false); | |
1093 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true); | |
1094 | |
1095 SkASSERT(colorPOI.isOpaque()); | |
1096 SkASSERT(colorPOI.isSolidWhite()); | |
1097 SkASSERT(covPOI.isSolidWhite()); | |
1098 SkASSERT(!covPOI.isFourChannelOutput()); | |
1099 | |
1100 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
1101 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
1102 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
1103 | |
1104 switch (xfermode) { | |
1105 case SkXfermode::kClear_Mode: | |
1106 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
1107 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
1108 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1109 TEST_ASSERT((kIgnoreColor_OptFlag | | |
1110 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1111 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
1112 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1113 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1114 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1115 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1116 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1117 break; | |
1118 case SkXfermode::kSrc_Mode: | |
1119 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
1120 TEST_ASSERT(GrColorPackA4(255) == xpi.fInvariantOutput.fBlendedC olor); | |
1121 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1122 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1123 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1124 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1125 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1126 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1127 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1128 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1129 break; | |
1130 case SkXfermode::kDst_Mode: | |
1131 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1132 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1133 TEST_ASSERT((kSkipDraw_OptFlag | | |
1134 kIgnoreColor_OptFlag | | |
1135 kIgnoreCoverage_OptFlag | | |
1136 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1137 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
1138 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1139 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1140 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1141 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1142 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
1143 break; | |
1144 case SkXfermode::kSrcOver_Mode: | |
1145 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
1146 TEST_ASSERT(GrColorPackA4(255) == xpi.fInvariantOutput.fBlendedC olor); | |
1147 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1148 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1149 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1150 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1151 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1152 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1153 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1154 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1155 break; | |
1156 case SkXfermode::kDstOver_Mode: | |
1157 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1158 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1159 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
1160 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1161 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1162 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1163 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1164 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1165 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1166 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1167 break; | |
1168 case SkXfermode::kSrcIn_Mode: | |
1169 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1170 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1171 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1172 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1173 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1174 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1175 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1176 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1177 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1178 break; | |
1179 case SkXfermode::kDstIn_Mode: | |
1180 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1181 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1182 TEST_ASSERT((kSkipDraw_OptFlag | | |
1183 kIgnoreColor_OptFlag | | |
1184 kIgnoreCoverage_OptFlag | | |
1185 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1186 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
1187 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1188 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1189 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1190 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1191 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
1192 break; | |
1193 case SkXfermode::kSrcOut_Mode: | |
1194 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1195 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1196 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1197 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1198 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1199 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1200 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1201 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1202 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1203 break; | |
1204 case SkXfermode::kDstOut_Mode: | |
1205 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
1206 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
1207 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1208 TEST_ASSERT((kIgnoreColor_OptFlag | | |
1209 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1210 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
1211 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1212 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1213 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1214 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1215 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1216 break; | |
1217 case SkXfermode::kSrcATop_Mode: | |
1218 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1219 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1220 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1221 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1222 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1223 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1224 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1225 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1226 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1227 break; | |
1228 case SkXfermode::kDstATop_Mode: | |
1229 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1230 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1231 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
1232 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1233 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1234 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1235 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1236 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1237 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1238 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1239 break; | |
1240 case SkXfermode::kXor_Mode: | |
1241 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1242 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1243 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1244 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1245 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1246 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1247 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1248 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1249 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1250 break; | |
1251 case SkXfermode::kPlus_Mode: | |
1252 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1253 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1254 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
1255 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1256 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1257 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1258 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1259 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1260 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1261 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1262 break; | |
1263 case SkXfermode::kModulate_Mode: | |
1264 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1265 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1266 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
1267 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1268 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1269 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1270 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1271 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1272 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1273 break; | |
1274 case SkXfermode::kScreen_Mode: | |
1275 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
1276 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
1277 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
1278 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
1279 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
1280 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
1281 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
1282 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
1283 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
1284 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
1285 break; | |
1286 default: | |
1287 ERRORF(reporter, "Invalid xfermode."); | |
1288 break; | |
1289 } | |
1290 } | |
1291 } | |
1292 | |
1293 static void test_no_dual_source_blending(skiatest::Reporter* reporter, GrGpu* gp u) { | |
1294 const GrCaps& nilCaps = GrGLCaps(); | |
bsalomon
2015/05/26 13:19:51
Is your tree up to date? I refactored caps creatio
Chris Dalton
2015/05/26 22:10:28
Waiting for the upcoming change (tomorrow, hopeful
Chris Dalton
2015/05/27 20:42:05
Done.
| |
1295 SkASSERT(!nilCaps.shaderCaps()->dualSourceBlendingSupport()); | |
1296 | |
1297 GrBackendTextureDesc fakeDstTextureDesc; | |
1298 fakeDstTextureDesc.fConfig = kRGBA_8888_GrPixelConfig; | |
1299 fakeDstTextureDesc.fWidth = fakeDstTextureDesc.fHeight = 100; | |
1300 fakeDstTextureDesc.fTextureHandle = 1; | |
1301 SkAutoTUnref<GrTexture> fakeDstTexture(gpu->wrapBackendTexture(fakeDstTextur eDesc)); | |
1302 GrDeviceCoordTexture fakeDstCopy; | |
1303 fakeDstCopy.setTexture(fakeDstTexture); | |
1304 | |
1305 static const GrColor testColors[] = { | |
1306 0, | |
1307 GrColorPackRGBA(0, 82, 0, 255), | |
1308 GrColorPackA4(0255) | |
1309 }; | |
1310 static const GrColorComponentFlags testColorFlags[] = { | |
1311 kNone_GrColorComponentFlags, | |
1312 kG_GrColorComponentFlag | kA_GrColorComponentFlag, | |
1313 kRGBA_GrColorComponentFlags | |
1314 }; | |
1315 for (int c = 0; c < 3; c++) { | |
1316 GrProcOptInfo colorPOI; | |
1317 colorPOI.calcWithInitialValues(NULL, 0, testColors[c], testColorFlags[c] , false); | |
1318 for (int f = 0; f <= 1; f++) { | |
1319 GrProcOptInfo covPOI; | |
1320 if (!f) { | |
1321 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentF lags, true); | |
1322 } else { | |
1323 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), | |
1324 kRGBA_GrColorComponentFlags, true); | |
1325 } | |
1326 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
1327 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
1328 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfer mode)); | |
1329 SkAutoTUnref<GrXferProcessor> xp; | |
1330 if (xpf->willNeedDstCopy(nilCaps, colorPOI, covPOI)) { | |
1331 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, &fakeDst Copy, nilCaps)); | |
1332 } else { | |
1333 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, NULL, ni lCaps)); | |
1334 } | |
1335 if (!xp) { | |
1336 ERRORF(reporter, "Failed to create an XP without dual source blending."); | |
1337 return; | |
1338 } | |
1339 TEST_ASSERT(!xp->hasSecondaryOutput()); | |
1340 xp->getOptimizations(colorPOI, covPOI, false, 0, nilCaps); | |
1341 TEST_ASSERT(!xp->hasSecondaryOutput()); | |
1342 } | |
1343 } | |
1344 } | |
1345 } | |
1346 | |
1347 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { | |
1348 class : public GrBatch { | |
1349 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | |
1350 out->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221)); | |
1351 } | |
1352 | |
1353 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const overri de { | |
1354 out->setUnknownFourComponents(); | |
1355 out->setUsingLCDCoverage(); | |
1356 } | |
1357 | |
1358 const char* name() const override { return "Test LCD Text Batch"; } | |
1359 void initBatchTracker(const GrPipelineInfo&) override {} | |
1360 bool onCombineIfPossible(GrBatch*) override { return false; } | |
1361 void generateGeometry(GrBatchTarget*, const GrPipeline*) override {} | |
1362 | |
1363 } testLCDCoverageBatch; | |
1364 | |
1365 GrProcOptInfo colorPOI, covPOI; | |
1366 colorPOI.calcColorWithBatch(&testLCDCoverageBatch, NULL, 0); | |
1367 covPOI.calcCoverageWithBatch(&testLCDCoverageBatch, NULL, 0); | |
1368 | |
1369 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags()); | |
1370 SkASSERT(covPOI.isFourChannelOutput()); | |
1371 | |
1372 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrc Over_Mode)); | |
1373 TEST_ASSERT(!xpf->willNeedDstCopy(caps, colorPOI, covPOI)); | |
1374 | |
1375 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps)); | |
1376 if (!xp) { | |
1377 ERRORF(reporter, "Failed to create an XP with LCD coverage."); | |
1378 return; | |
1379 } | |
1380 | |
1381 GrXPFactory::InvariantOutput invariantOutput; | |
1382 xpf->getInvariantOutput(colorPOI, covPOI, &invariantOutput); | |
1383 TEST_ASSERT(invariantOutput.fWillBlendWithDst); | |
1384 TEST_ASSERT(kNone_GrColorComponentFlags == invariantOutput.fBlendedColorFlag s); | |
1385 | |
1386 GrColor overrideColor; | |
1387 xp->getOptimizations(colorPOI, covPOI, false, &overrideColor, caps); | |
1388 | |
1389 GrXferProcessor::BlendInfo blendInfo; | |
1390 xp->getBlendInfo(&blendInfo); | |
1391 TEST_ASSERT(blendInfo.fWriteColor); | |
1392 } | |
1393 | |
1394 #endif | |
1395 | |
OLD | NEW |