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 "GrContextOptions.h" | |
16 #include "GrGpu.h" | |
17 #include "GrXferProcessor.h" | |
18 #include "effects/GrPorterDuffXferProcessor.h" | |
19 #include "gl/GrGLCaps.h" | |
20 | |
21 //////////////////////////////////////////////////////////////////////////////// | |
22 | |
23 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps); | |
24 static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G rCaps& caps); | |
25 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps); | |
26 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr Caps& caps); | |
27 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps); | |
28 static void test_no_dual_source_blending(skiatest::Reporter* reporter); | |
29 | |
30 DEF_GPUTEST(GrPorterDuff, reporter, factory) { | |
31 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType); | |
32 if (!ctx) { | |
33 SkFAIL("Failed to create null context."); | |
34 return; | |
35 } | |
36 | |
37 const GrCaps& caps = *ctx->getGpu()->caps(); | |
38 if (!caps.shaderCaps()->dualSourceBlendingSupport()) { | |
39 SkFAIL("Null context does not support dual source blending."); | |
40 return; | |
41 } | |
42 | |
43 test_color_unknown_with_coverage(reporter, caps); | |
44 test_color_unknown_no_coverage(reporter, caps); | |
45 test_color_opaque_with_coverage(reporter, caps); | |
46 test_color_opaque_no_coverage(reporter, caps); | |
47 test_lcd_coverage(reporter, caps); | |
48 test_no_dual_source_blending(reporter); | |
49 } | |
50 | |
51 //////////////////////////////////////////////////////////////////////////////// | |
52 | |
53 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__) | |
54 | |
55 enum { | |
56 kNone_OutputType, | |
57 kCoverage_OutputType, | |
58 kModulate_OutputType, | |
59 kISAModulate_OutputType, | |
60 kISCModulate_OutputType | |
61 }; | |
62 | |
63 enum { | |
64 kNone_Opt = GrXferProcessor::kNone_Opt, | |
65 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag, | |
66 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag, | |
67 kIgnoreCoverage_OptFlag = GrXferProcessor::kIgnoreCoverage_OptFlag , | |
68 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCovera ge_OptFlag | |
69 }; | |
70 | |
71 class GrPorterDuffTest { | |
72 public: | |
73 struct XPInfo { | |
74 XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const Gr Caps& caps, | |
75 const GrProcOptInfo& colorPOI, const GrProcOptInfo& covPOI) { | |
76 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode )); | |
77 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps)); | |
78 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI)); | |
79 xpf->getInvariantOutput(colorPOI, covPOI, &fInvariantOutput); | |
80 fOptFlags = xp->getOptimizations(colorPOI, covPOI, false, 0, caps); | |
81 GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType); | |
82 xp->getBlendInfo(&fBlendInfo); | |
83 TEST_ASSERT(!xp->willReadDstColor()); | |
84 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendI nfo.fDstBlend)); | |
85 } | |
86 | |
87 GrXPFactory::InvariantOutput fInvariantOutput; | |
88 int fOptFlags; | |
89 int fPrimaryOutputType; | |
90 int fSecondaryOutputType; | |
91 GrXferProcessor::BlendInfo fBlendInfo; | |
92 }; | |
93 | |
94 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int * outSecondary) { | |
95 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary ); | |
96 } | |
97 }; | |
98 | |
99 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { | |
100 GrProcOptInfo colorPOI, covPOI; | |
101 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals e); | |
102 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | |
103 | |
104 SkASSERT(!colorPOI.isOpaque()); | |
105 SkASSERT(!colorPOI.isSolidWhite()); | |
106 SkASSERT(!covPOI.isSolidWhite()); | |
107 SkASSERT(!covPOI.isFourChannelOutput()); | |
108 | |
109 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
110 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
111 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
112 | |
113 switch (xfermode) { | |
114 case SkXfermode::kClear_Mode: | |
115 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
116 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
117 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
118 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
119 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
120 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
121 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
122 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
123 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
124 break; | |
125 case SkXfermode::kSrc_Mode: | |
126 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
127 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
128 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
129 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
130 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); | |
131 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
132 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
133 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
134 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
135 break; | |
136 case SkXfermode::kDst_Mode: | |
137 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
138 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
139 TEST_ASSERT((kSkipDraw_OptFlag | | |
140 kIgnoreColor_OptFlag | | |
141 kIgnoreCoverage_OptFlag | | |
142 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
143 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
144 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
145 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
146 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
147 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
148 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
149 break; | |
150 case SkXfermode::kSrcOver_Mode: | |
151 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
152 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
153 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
154 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
155 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
156 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
157 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
158 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
159 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
160 break; | |
161 case SkXfermode::kDstOver_Mode: | |
162 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
163 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
164 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
165 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
166 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
167 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
168 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
169 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
170 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
171 break; | |
172 case SkXfermode::kSrcIn_Mode: | |
173 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
174 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
175 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
176 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
177 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); | |
178 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
179 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
180 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
181 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
182 break; | |
183 case SkXfermode::kDstIn_Mode: | |
184 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
185 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
186 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
187 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType); | |
188 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
189 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
190 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
191 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
192 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
193 break; | |
194 case SkXfermode::kSrcOut_Mode: | |
195 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
196 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
197 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
198 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
199 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); | |
200 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
201 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
202 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
203 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
204 break; | |
205 case SkXfermode::kDstOut_Mode: | |
206 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
207 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
208 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
209 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
210 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
211 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
212 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
213 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
214 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
215 break; | |
216 case SkXfermode::kSrcATop_Mode: | |
217 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
218 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
219 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
220 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
221 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
222 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
223 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
224 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
225 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
226 break; | |
227 case SkXfermode::kDstATop_Mode: | |
228 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
229 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
230 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
231 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
232 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType) ; | |
233 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
234 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
235 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
236 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
237 break; | |
238 case SkXfermode::kXor_Mode: | |
239 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
240 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
241 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
242 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
243 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
244 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
245 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
246 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
247 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
248 break; | |
249 case SkXfermode::kPlus_Mode: | |
250 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
251 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
252 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
253 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
254 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
255 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
256 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
257 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
258 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
259 break; | |
260 case SkXfermode::kModulate_Mode: | |
261 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
262 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
263 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
264 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); | |
265 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
266 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
267 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
268 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
269 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
270 break; | |
271 case SkXfermode::kScreen_Mode: | |
272 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
273 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
274 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
275 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
276 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
277 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
278 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
279 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
280 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
281 break; | |
282 default: | |
283 ERRORF(reporter, "Invalid xfermode."); | |
284 break; | |
285 } | |
286 } | |
287 } | |
288 | |
289 static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G rCaps& caps) { | |
290 GrProcOptInfo colorPOI, covPOI; | |
291 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0), | |
292 kR_GrColorComponentFlag | kB_GrColorComponent Flag, false); | |
293 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true); | |
294 | |
295 SkASSERT(!colorPOI.isOpaque()); | |
296 SkASSERT(!colorPOI.isSolidWhite()); | |
297 SkASSERT(covPOI.isSolidWhite()); | |
298 SkASSERT(!covPOI.isFourChannelOutput()); | |
299 | |
300 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
301 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
302 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
303 | |
304 switch (xfermode) { | |
305 case SkXfermode::kClear_Mode: | |
306 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
307 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
308 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
309 TEST_ASSERT((kIgnoreColor_OptFlag | | |
310 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
311 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
312 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
313 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
314 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
315 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
316 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
317 break; | |
318 case SkXfermode::kSrc_Mode: | |
319 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
320 TEST_ASSERT(229 == GrColorUnpackR(xpi.fInvariantOutput.fBlendedC olor)); | |
321 TEST_ASSERT(154 == GrColorUnpackB(xpi.fInvariantOutput.fBlendedC olor)); | |
322 TEST_ASSERT((kR_GrColorComponentFlag | | |
323 kB_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags); | |
324 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
325 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
326 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
327 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
328 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
329 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
330 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
331 break; | |
332 case SkXfermode::kDst_Mode: | |
333 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
334 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
335 TEST_ASSERT((kSkipDraw_OptFlag | | |
336 kIgnoreColor_OptFlag | | |
337 kIgnoreCoverage_OptFlag | | |
338 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
339 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
340 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
341 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
342 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
343 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
344 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
345 break; | |
346 case SkXfermode::kSrcOver_Mode: | |
347 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
348 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
349 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
350 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
351 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
352 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
353 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
354 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
355 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
356 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
357 break; | |
358 case SkXfermode::kDstOver_Mode: | |
359 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
360 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
361 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
362 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
363 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
364 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
365 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
366 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
367 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
368 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
369 break; | |
370 case SkXfermode::kSrcIn_Mode: | |
371 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
372 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
373 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
374 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
375 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
376 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
377 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
378 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
379 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
380 break; | |
381 case SkXfermode::kDstIn_Mode: | |
382 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
383 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
384 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
385 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
386 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
387 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
388 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
389 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
390 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
391 break; | |
392 case SkXfermode::kSrcOut_Mode: | |
393 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
394 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
395 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
396 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
397 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
398 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
399 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
400 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
401 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
402 break; | |
403 case SkXfermode::kDstOut_Mode: | |
404 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
405 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
406 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
407 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
408 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
409 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
410 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
411 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
412 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
413 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
414 break; | |
415 case SkXfermode::kSrcATop_Mode: | |
416 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
417 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
418 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
419 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
420 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
421 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
422 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
423 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
424 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
425 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
426 break; | |
427 case SkXfermode::kDstATop_Mode: | |
428 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
429 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
430 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
431 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
432 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
433 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
434 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
435 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
436 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
437 break; | |
438 case SkXfermode::kXor_Mode: | |
439 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
440 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
441 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
442 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
443 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
444 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
445 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
446 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
447 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
448 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
449 break; | |
450 case SkXfermode::kPlus_Mode: | |
451 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
452 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
453 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
454 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
455 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
456 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
457 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
458 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
459 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
460 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
461 break; | |
462 case SkXfermode::kModulate_Mode: | |
463 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
464 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
465 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
466 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
467 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
468 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
469 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
470 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
471 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
472 break; | |
473 case SkXfermode::kScreen_Mode: | |
474 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
475 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
476 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
477 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
478 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
479 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
480 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
481 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
482 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
483 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
484 break; | |
485 default: | |
486 ERRORF(reporter, "Invalid xfermode."); | |
487 break; | |
488 } | |
489 } | |
490 } | |
491 | |
492 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { | |
493 GrProcOptInfo colorPOI, covPOI; | |
494 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon entFlag, false); | |
495 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | |
496 | |
497 SkASSERT(colorPOI.isOpaque()); | |
498 SkASSERT(!colorPOI.isSolidWhite()); | |
499 SkASSERT(!covPOI.isSolidWhite()); | |
500 SkASSERT(!covPOI.isFourChannelOutput()); | |
501 | |
502 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
503 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
504 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
505 | |
506 switch (xfermode) { | |
507 case SkXfermode::kClear_Mode: | |
508 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
509 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
510 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
511 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
512 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
513 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
514 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
515 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
516 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
517 break; | |
518 case SkXfermode::kSrc_Mode: | |
519 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
520 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
521 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
522 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
523 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
524 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
525 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
526 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
527 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
528 break; | |
529 case SkXfermode::kDst_Mode: | |
530 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
531 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
532 TEST_ASSERT((kSkipDraw_OptFlag | | |
533 kIgnoreColor_OptFlag | | |
534 kIgnoreCoverage_OptFlag | | |
535 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
536 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
537 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
538 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
539 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
540 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
541 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
542 break; | |
543 case SkXfermode::kSrcOver_Mode: | |
544 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
545 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
546 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
547 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
548 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
549 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
550 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
551 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
552 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
553 break; | |
554 case SkXfermode::kDstOver_Mode: | |
555 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
556 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
557 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
558 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
559 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
560 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
561 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
562 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
563 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
564 break; | |
565 case SkXfermode::kSrcIn_Mode: | |
566 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
567 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
568 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
569 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
570 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
571 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
572 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
573 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
574 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
575 break; | |
576 case SkXfermode::kDstIn_Mode: | |
577 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
578 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
579 TEST_ASSERT((kSkipDraw_OptFlag | | |
580 kIgnoreColor_OptFlag | | |
581 kIgnoreCoverage_OptFlag | | |
582 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
583 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
584 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
585 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
586 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
587 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
588 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
589 break; | |
590 case SkXfermode::kSrcOut_Mode: | |
591 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
592 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
593 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
594 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
595 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
596 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
597 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
598 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
599 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
600 break; | |
601 case SkXfermode::kDstOut_Mode: | |
602 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
603 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
604 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | |
605 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); | |
606 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
607 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
608 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
609 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
610 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
611 break; | |
612 case SkXfermode::kSrcATop_Mode: | |
613 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
614 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
615 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
616 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
617 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
618 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
619 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
620 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
621 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
622 break; | |
623 case SkXfermode::kDstATop_Mode: | |
624 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
625 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
626 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
627 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
628 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
629 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
630 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
631 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
632 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
633 break; | |
634 case SkXfermode::kXor_Mode: | |
635 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
636 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
637 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
638 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
639 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
640 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
641 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
642 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
643 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
644 break; | |
645 case SkXfermode::kPlus_Mode: | |
646 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
647 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
648 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
649 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
650 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
651 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
652 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
653 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
654 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
655 break; | |
656 case SkXfermode::kModulate_Mode: | |
657 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
658 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
659 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags); | |
660 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); | |
661 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
662 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation); | |
663 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
664 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
665 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
666 break; | |
667 case SkXfermode::kScreen_Mode: | |
668 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
669 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
670 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
671 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
672 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
673 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
674 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
675 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
676 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
677 break; | |
678 default: | |
679 ERRORF(reporter, "Invalid xfermode."); | |
680 break; | |
681 } | |
682 } | |
683 } | |
684 | |
685 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr Caps& caps) { | |
686 GrProcOptInfo colorPOI, covPOI; | |
687 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255), | |
688 kG_GrColorComponentFlag | kA_GrColorComponent Flag, false); | |
689 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true); | |
690 | |
691 SkASSERT(colorPOI.isOpaque()); | |
692 SkASSERT(!colorPOI.isSolidWhite()); | |
693 SkASSERT(covPOI.isSolidWhite()); | |
694 SkASSERT(!covPOI.isFourChannelOutput()); | |
695 | |
696 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
697 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
698 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI); | |
699 | |
700 switch (xfermode) { | |
701 case SkXfermode::kClear_Mode: | |
702 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
703 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
704 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
705 TEST_ASSERT((kIgnoreColor_OptFlag | | |
706 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
707 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
708 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
709 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
710 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
711 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
712 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
713 break; | |
714 case SkXfermode::kSrc_Mode: | |
715 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
716 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor)); | |
717 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor)); | |
718 TEST_ASSERT((kG_GrColorComponentFlag | | |
719 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags); | |
720 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
721 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
722 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
723 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
724 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
725 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
726 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
727 break; | |
728 case SkXfermode::kDst_Mode: | |
729 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
730 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
731 TEST_ASSERT((kSkipDraw_OptFlag | | |
732 kIgnoreColor_OptFlag | | |
733 kIgnoreCoverage_OptFlag | | |
734 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
735 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
736 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
737 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
738 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
739 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
740 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
741 break; | |
742 case SkXfermode::kSrcOver_Mode: | |
743 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
744 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor)); | |
745 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor)); | |
746 TEST_ASSERT((kG_GrColorComponentFlag | | |
747 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags); | |
748 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
749 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
750 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
751 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
752 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
753 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
754 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
755 break; | |
756 case SkXfermode::kDstOver_Mode: | |
757 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
758 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
759 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
760 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
761 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
762 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
763 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
764 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
765 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
766 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
767 break; | |
768 case SkXfermode::kSrcIn_Mode: | |
769 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
770 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
771 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
772 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
773 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
774 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
775 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
776 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
777 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
778 break; | |
779 case SkXfermode::kDstIn_Mode: | |
780 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
781 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
782 TEST_ASSERT((kSkipDraw_OptFlag | | |
783 kIgnoreColor_OptFlag | | |
784 kIgnoreCoverage_OptFlag | | |
785 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
786 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
787 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
788 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
789 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
790 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
791 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); | |
792 break; | |
793 case SkXfermode::kSrcOut_Mode: | |
794 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
795 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
796 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
797 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
798 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
799 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
800 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
801 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
802 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
803 break; | |
804 case SkXfermode::kDstOut_Mode: | |
805 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | |
806 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | |
807 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
808 TEST_ASSERT((kIgnoreColor_OptFlag | | |
809 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
810 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); | |
811 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
812 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
813 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
814 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
815 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
816 break; | |
817 case SkXfermode::kSrcATop_Mode: | |
818 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
819 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
820 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
821 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
822 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
823 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
824 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
825 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
826 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
827 break; | |
828 case SkXfermode::kDstATop_Mode: | |
829 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
830 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
831 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
832 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
833 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
834 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
835 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
836 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
837 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
838 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
839 break; | |
840 case SkXfermode::kXor_Mode: | |
841 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
842 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
843 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
844 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
845 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
846 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
847 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
848 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
849 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
850 break; | |
851 case SkXfermode::kPlus_Mode: | |
852 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
853 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
854 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
855 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
856 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
857 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
858 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
859 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
860 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
861 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
862 break; | |
863 case SkXfermode::kModulate_Mode: | |
864 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
865 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
866 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); | |
867 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
868 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
869 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
870 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
871 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
872 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
873 break; | |
874 case SkXfermode::kScreen_Mode: | |
875 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | |
876 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags); | |
877 TEST_ASSERT((kIgnoreCoverage_OptFlag | | |
878 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags ); | |
879 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); | |
880 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); | |
881 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); | |
882 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); | |
883 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | |
884 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | |
885 break; | |
886 default: | |
887 ERRORF(reporter, "Invalid xfermode."); | |
888 break; | |
889 } | |
890 } | |
891 } | |
892 | |
893 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { | |
894 class : public GrBatch { | |
895 void getInvariantOutputColor(GrInitInvariantOutput* out) const override { | |
896 out->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221)); | |
897 } | |
898 | |
899 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const overri de { | |
900 out->setUnknownFourComponents(); | |
901 out->setUsingLCDCoverage(); | |
902 } | |
903 | |
904 const char* name() const override { return "Test LCD Text Batch"; } | |
905 void initBatchTracker(const GrPipelineInfo&) override {} | |
906 bool onCombineIfPossible(GrBatch*) override { return false; } | |
907 void generateGeometry(GrBatchTarget*, const GrPipeline*) override {} | |
908 | |
909 } testLCDCoverageBatch; | |
910 | |
911 GrProcOptInfo colorPOI, covPOI; | |
912 colorPOI.calcColorWithBatch(&testLCDCoverageBatch, NULL, 0); | |
913 covPOI.calcCoverageWithBatch(&testLCDCoverageBatch, NULL, 0); | |
914 | |
915 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags()); | |
916 SkASSERT(covPOI.isFourChannelOutput()); | |
917 | |
918 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrc Over_Mode)); | |
919 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI)); | |
920 | |
921 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps)); | |
922 if (!xp) { | |
923 ERRORF(reporter, "Failed to create an XP with LCD coverage."); | |
924 return; | |
925 } | |
926 | |
927 GrXPFactory::InvariantOutput invariantOutput; | |
928 xpf->getInvariantOutput(colorPOI, covPOI, &invariantOutput); | |
929 TEST_ASSERT(invariantOutput.fWillBlendWithDst); | |
930 TEST_ASSERT(kNone_GrColorComponentFlags == invariantOutput.fBlendedColorFlag s); | |
931 | |
932 GrColor overrideColor; | |
933 xp->getOptimizations(colorPOI, covPOI, false, &overrideColor, caps); | |
934 | |
935 GrXferProcessor::BlendInfo blendInfo; | |
936 xp->getBlendInfo(&blendInfo); | |
937 TEST_ASSERT(blendInfo.fWriteColor); | |
938 } | |
939 | |
940 static void test_no_dual_source_blending(skiatest::Reporter* reporter) { | |
941 GrContextOptions opts; | |
942 opts.fSuppressDualSourceBlending = true; | |
943 GrContextFactory factory(opts); | |
944 factory.get(GrContextFactory::kNull_GLContextType); | |
945 GrContext* ctx = factory.get(GrContextFactory::kNull_GLContextType); | |
946 if (!ctx) { | |
947 SkFAIL("Failed to create null context without ARB_blend_func_extended.") ; | |
948 return; | |
949 } | |
950 | |
951 GrGpu* gpu = ctx->getGpu(); | |
bsalomon
2015/05/27 20:46:20
I'm trying to remove getGpu() from GrContext and a
Chris Dalton
2015/05/27 21:09:41
The only place it calls getGpu() now is to access
bsalomon
2015/05/27 21:16:01
ok I'll updcate it at that time. thanks.
| |
952 const GrCaps& caps = *gpu->caps(); | |
953 if (caps.shaderCaps()->dualSourceBlendingSupport()) { | |
954 SkFAIL("Null context failed to honor request for no ARB_blend_func_exten ded."); | |
955 return; | |
956 } | |
957 | |
958 GrBackendTextureDesc fakeDesc; | |
959 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig; | |
960 fakeDesc.fWidth = fakeDesc.fHeight = 100; | |
961 fakeDesc.fTextureHandle = 1; | |
962 SkAutoTUnref<GrTexture> fakeTexture(gpu->wrapBackendTexture(fakeDesc)); | |
963 GrXferProcessor::DstTexture fakeDstTexture; | |
964 fakeDstTexture.setTexture(fakeTexture); | |
965 | |
966 static const GrColor testColors[] = { | |
967 0, | |
968 GrColorPackRGBA(0, 82, 0, 255), | |
969 GrColorPackA4(255) | |
970 }; | |
971 static const GrColorComponentFlags testColorFlags[] = { | |
972 kNone_GrColorComponentFlags, | |
973 kG_GrColorComponentFlag | kA_GrColorComponentFlag, | |
974 kRGBA_GrColorComponentFlags | |
975 }; | |
976 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags )); | |
977 | |
978 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) { | |
979 GrProcOptInfo colorPOI; | |
980 colorPOI.calcWithInitialValues(NULL, 0, testColors[c], testColorFlags[c] , false); | |
981 for (int f = 0; f <= 1; f++) { | |
982 GrProcOptInfo covPOI; | |
983 if (!f) { | |
984 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentF lags, true); | |
985 } else { | |
986 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), | |
987 kRGBA_GrColorComponentFlags, true); | |
988 } | |
989 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | |
990 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | |
991 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfer mode)); | |
992 SkAutoTUnref<GrXferProcessor> xp; | |
993 if (xpf->willNeedDstTexture(caps, colorPOI, covPOI)) { | |
994 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, &fakeDst Texture, caps)); | |
995 } else { | |
996 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, NULL, ca ps)); | |
997 } | |
998 if (!xp) { | |
999 ERRORF(reporter, "Failed to create an XP without dual source blending."); | |
1000 return; | |
1001 } | |
1002 TEST_ASSERT(!xp->hasSecondaryOutput()); | |
1003 xp->getOptimizations(colorPOI, covPOI, false, 0, caps); | |
1004 TEST_ASSERT(!xp->hasSecondaryOutput()); | |
1005 } | |
1006 } | |
1007 } | |
1008 } | |
1009 | |
1010 #endif | |
1011 | |
OLD | NEW |