OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkXfermode.h" | 8 #include "SkXfermode.h" |
9 #include "Test.h" | 9 #include "Test.h" |
10 | 10 |
11 #if SK_SUPPORT_GPU | 11 #if SK_SUPPORT_GPU |
12 | 12 |
| 13 #include "GrBatch.h" |
13 #include "GrContextFactory.h" | 14 #include "GrContextFactory.h" |
14 #include "GrGpu.h" | 15 #include "GrGpu.h" |
15 #include "GrXferProcessor.h" | 16 #include "GrXferProcessor.h" |
16 #include "effects/GrPorterDuffXferProcessor.h" | 17 #include "effects/GrPorterDuffXferProcessor.h" |
17 | 18 |
18 //////////////////////////////////////////////////////////////////////////////// | 19 //////////////////////////////////////////////////////////////////////////////// |
19 | 20 |
20 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); | 21 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); |
21 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); | 22 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); |
22 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); | 23 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); |
23 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps); | 24 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps); |
24 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); | 25 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); |
25 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC
aps& caps); | 26 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC
aps& caps); |
| 27 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps); |
26 | 28 |
27 DEF_GPUTEST(GrPorterDuff, reporter, factory) { | 29 DEF_GPUTEST(GrPorterDuff, reporter, factory) { |
28 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType); | 30 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType); |
29 if (!ctx) { | 31 if (!ctx) { |
30 SkFAIL("Failed to create null context."); | 32 SkFAIL("Failed to create null context."); |
31 return; | 33 return; |
32 } | 34 } |
33 | 35 |
34 const GrCaps& caps = *ctx->getGpu()->caps(); | 36 const GrCaps& caps = *ctx->getGpu()->caps(); |
35 if (!caps.shaderCaps()->dualSourceBlendingSupport()) { | 37 if (!caps.shaderCaps()->dualSourceBlendingSupport()) { |
36 SkFAIL("Null context does not support dual source blending."); | 38 SkFAIL("Null context does not support dual source blending."); |
37 return; | 39 return; |
38 } | 40 } |
39 | 41 |
40 test_alpha_unknown_with_coverage(reporter, caps); | 42 test_alpha_unknown_with_coverage(reporter, caps); |
41 test_alpha_unknown_no_coverage(reporter, caps); | 43 test_alpha_unknown_no_coverage(reporter, caps); |
42 test_alpha_opaque_with_coverage(reporter, caps); | 44 test_alpha_opaque_with_coverage(reporter, caps); |
43 test_alpha_opaque_no_coverage(reporter, caps); | 45 test_alpha_opaque_no_coverage(reporter, caps); |
44 test_color_white_with_coverage(reporter, caps); | 46 test_color_white_with_coverage(reporter, caps); |
45 test_color_white_with_coverage(reporter, caps); | 47 test_color_white_with_coverage(reporter, caps); |
46 test_color_white_no_coverage(reporter, caps); | 48 test_color_white_no_coverage(reporter, caps); |
| 49 test_lcd_coverage(reporter, caps); |
47 } | 50 } |
48 | 51 |
49 //////////////////////////////////////////////////////////////////////////////// | 52 //////////////////////////////////////////////////////////////////////////////// |
50 | 53 |
51 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__) | 54 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__) |
52 | 55 |
53 enum { | 56 enum { |
54 kNone_OutputType, | 57 kNone_OutputType, |
55 kCoverage_OutputType, | 58 kCoverage_OutputType, |
56 kModulate_OutputType, | 59 kModulate_OutputType, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 }; | 96 }; |
94 | 97 |
95 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { | 98 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { |
96 GrProcOptInfo colorPOI, covPOI; | 99 GrProcOptInfo colorPOI, covPOI; |
97 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals
e); | 100 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals
e); |
98 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 101 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); |
99 | 102 |
100 SkASSERT(!colorPOI.isOpaque()); | 103 SkASSERT(!colorPOI.isOpaque()); |
101 SkASSERT(!colorPOI.isSolidWhite()); | 104 SkASSERT(!colorPOI.isSolidWhite()); |
102 SkASSERT(!covPOI.isSolidWhite()); | 105 SkASSERT(!covPOI.isSolidWhite()); |
| 106 SkASSERT(!covPOI.isFourChannelOutput()); |
103 | 107 |
104 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 108 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
105 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 109 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
106 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 110 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
107 | 111 |
108 switch (xfermode) { | 112 switch (xfermode) { |
109 case SkXfermode::kClear_Mode: | 113 case SkXfermode::kClear_Mode: |
110 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | 114 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); |
111 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 115 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
112 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | 116 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 | 287 |
284 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { | 288 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { |
285 GrProcOptInfo colorPOI, covPOI; | 289 GrProcOptInfo colorPOI, covPOI; |
286 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0), | 290 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0), |
287 kR_GrColorComponentFlag | kB_GrColorComponent
Flag, false); | 291 kR_GrColorComponentFlag | kB_GrColorComponent
Flag, false); |
288 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 292 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); |
289 | 293 |
290 SkASSERT(!colorPOI.isOpaque()); | 294 SkASSERT(!colorPOI.isOpaque()); |
291 SkASSERT(!colorPOI.isSolidWhite()); | 295 SkASSERT(!colorPOI.isSolidWhite()); |
292 SkASSERT(covPOI.isSolidWhite()); | 296 SkASSERT(covPOI.isSolidWhite()); |
| 297 SkASSERT(!covPOI.isFourChannelOutput()); |
293 | 298 |
294 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 299 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
295 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 300 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
296 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 301 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
297 | 302 |
298 switch (xfermode) { | 303 switch (xfermode) { |
299 case SkXfermode::kClear_Mode: | 304 case SkXfermode::kClear_Mode: |
300 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | 305 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); |
301 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | 306 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); |
302 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 307 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 } | 489 } |
485 | 490 |
486 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { | 491 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { |
487 GrProcOptInfo colorPOI, covPOI; | 492 GrProcOptInfo colorPOI, covPOI; |
488 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon
entFlag, false); | 493 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon
entFlag, false); |
489 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 494 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); |
490 | 495 |
491 SkASSERT(colorPOI.isOpaque()); | 496 SkASSERT(colorPOI.isOpaque()); |
492 SkASSERT(!colorPOI.isSolidWhite()); | 497 SkASSERT(!colorPOI.isSolidWhite()); |
493 SkASSERT(!covPOI.isSolidWhite()); | 498 SkASSERT(!covPOI.isSolidWhite()); |
| 499 SkASSERT(!covPOI.isFourChannelOutput()); |
494 | 500 |
495 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 501 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
496 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 502 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
497 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 503 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
498 | 504 |
499 switch (xfermode) { | 505 switch (xfermode) { |
500 case SkXfermode::kClear_Mode: | 506 case SkXfermode::kClear_Mode: |
501 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | 507 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); |
502 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 508 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
503 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | 509 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 | 683 |
678 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps) { | 684 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps) { |
679 GrProcOptInfo colorPOI, covPOI; | 685 GrProcOptInfo colorPOI, covPOI; |
680 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255), | 686 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255), |
681 kG_GrColorComponentFlag | kA_GrColorComponent
Flag, false); | 687 kG_GrColorComponentFlag | kA_GrColorComponent
Flag, false); |
682 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 688 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); |
683 | 689 |
684 SkASSERT(colorPOI.isOpaque()); | 690 SkASSERT(colorPOI.isOpaque()); |
685 SkASSERT(!colorPOI.isSolidWhite()); | 691 SkASSERT(!colorPOI.isSolidWhite()); |
686 SkASSERT(covPOI.isSolidWhite()); | 692 SkASSERT(covPOI.isSolidWhite()); |
| 693 SkASSERT(!covPOI.isFourChannelOutput()); |
687 | 694 |
688 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 695 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
689 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 696 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
690 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 697 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
691 | 698 |
692 switch (xfermode) { | 699 switch (xfermode) { |
693 case SkXfermode::kClear_Mode: | 700 case SkXfermode::kClear_Mode: |
694 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | 701 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); |
695 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | 702 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); |
696 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 703 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 } | 890 } |
884 | 891 |
885 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { | 892 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { |
886 GrProcOptInfo colorPOI, covPOI; | 893 GrProcOptInfo colorPOI, covPOI; |
887 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); | 894 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); |
888 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 895 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); |
889 | 896 |
890 SkASSERT(colorPOI.isOpaque()); | 897 SkASSERT(colorPOI.isOpaque()); |
891 SkASSERT(colorPOI.isSolidWhite()); | 898 SkASSERT(colorPOI.isSolidWhite()); |
892 SkASSERT(!covPOI.isSolidWhite()); | 899 SkASSERT(!covPOI.isSolidWhite()); |
| 900 SkASSERT(!covPOI.isFourChannelOutput()); |
893 | 901 |
894 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 902 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
895 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 903 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
896 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 904 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
897 | 905 |
898 switch (xfermode) { | 906 switch (xfermode) { |
899 case SkXfermode::kClear_Mode: | 907 case SkXfermode::kClear_Mode: |
900 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | 908 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); |
901 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 909 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
902 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | 910 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 } | 1083 } |
1076 | 1084 |
1077 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC
aps& caps) { | 1085 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC
aps& caps) { |
1078 GrProcOptInfo colorPOI, covPOI; | 1086 GrProcOptInfo colorPOI, covPOI; |
1079 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); | 1087 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); |
1080 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 1088 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); |
1081 | 1089 |
1082 SkASSERT(colorPOI.isOpaque()); | 1090 SkASSERT(colorPOI.isOpaque()); |
1083 SkASSERT(colorPOI.isSolidWhite()); | 1091 SkASSERT(colorPOI.isSolidWhite()); |
1084 SkASSERT(covPOI.isSolidWhite()); | 1092 SkASSERT(covPOI.isSolidWhite()); |
| 1093 SkASSERT(!covPOI.isFourChannelOutput()); |
1085 | 1094 |
1086 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 1095 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
1087 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 1096 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
1088 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 1097 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
1089 | 1098 |
1090 switch (xfermode) { | 1099 switch (xfermode) { |
1091 case SkXfermode::kClear_Mode: | 1100 case SkXfermode::kClear_Mode: |
1092 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | 1101 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); |
1093 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | 1102 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); |
1094 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 1103 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1269 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | 1278 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
1270 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | 1279 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
1271 break; | 1280 break; |
1272 default: | 1281 default: |
1273 ERRORF(reporter, "Invalid xfermode."); | 1282 ERRORF(reporter, "Invalid xfermode."); |
1274 break; | 1283 break; |
1275 } | 1284 } |
1276 } | 1285 } |
1277 } | 1286 } |
1278 | 1287 |
| 1288 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps)
{ |
| 1289 class : public GrBatch { |
| 1290 void getInvariantOutputColor(GrInitInvariantOutput* out) const override
{ |
| 1291 out->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221)); |
| 1292 } |
| 1293 |
| 1294 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const overri
de { |
| 1295 out->setUnknownFourComponents(); |
| 1296 out->setUsingLCDCoverage(); |
| 1297 } |
| 1298 |
| 1299 const char* name() const override { return "Test LCD Text Batch"; } |
| 1300 void initBatchTracker(const GrPipelineInfo&) override {} |
| 1301 bool onCombineIfPossible(GrBatch*) override { return false; } |
| 1302 void generateGeometry(GrBatchTarget*, const GrPipeline*) override {} |
| 1303 |
| 1304 } testLCDCoverageBatch; |
| 1305 |
| 1306 GrProcOptInfo colorPOI, covPOI; |
| 1307 colorPOI.calcColorWithBatch(&testLCDCoverageBatch, NULL, 0); |
| 1308 covPOI.calcCoverageWithBatch(&testLCDCoverageBatch, NULL, 0); |
| 1309 |
| 1310 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags()); |
| 1311 SkASSERT(covPOI.isFourChannelOutput()); |
| 1312 |
| 1313 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrc
Over_Mode)); |
| 1314 TEST_ASSERT(!xpf->willNeedDstCopy(caps, colorPOI, covPOI)); |
| 1315 |
| 1316 GrXPFactory::InvariantOutput invariantOutput; |
| 1317 xpf->getInvariantOutput(colorPOI, covPOI, &invariantOutput); |
| 1318 TEST_ASSERT(invariantOutput.fWillBlendWithDst); |
| 1319 TEST_ASSERT(kNone_GrColorComponentFlags == invariantOutput.fBlendedColorFlag
s); |
| 1320 |
| 1321 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI,
0, caps)); |
| 1322 if (!xp) { |
| 1323 ERRORF(reporter, "Failed to create an XP with LCD coverage."); |
| 1324 return; |
| 1325 } |
| 1326 |
| 1327 GrColor overrideColor; |
| 1328 xp->getOptimizations(colorPOI, covPOI, false, &overrideColor, caps); |
| 1329 |
| 1330 GrXferProcessor::BlendInfo blendInfo; |
| 1331 xp->getBlendInfo(&blendInfo); |
| 1332 TEST_ASSERT(blendInfo.fWriteColor); |
| 1333 } |
| 1334 |
1279 #endif | 1335 #endif |
1280 | 1336 |
OLD | NEW |