| 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" | |
| 14 #include "GrContextFactory.h" | 13 #include "GrContextFactory.h" |
| 15 #include "GrGpu.h" | 14 #include "GrGpu.h" |
| 16 #include "GrXferProcessor.h" | 15 #include "GrXferProcessor.h" |
| 17 #include "effects/GrPorterDuffXferProcessor.h" | 16 #include "effects/GrPorterDuffXferProcessor.h" |
| 18 | 17 |
| 19 //////////////////////////////////////////////////////////////////////////////// | 18 //////////////////////////////////////////////////////////////////////////////// |
| 20 | 19 |
| 21 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); | 20 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); |
| 22 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); | 21 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); |
| 23 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); | 22 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps); |
| 24 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps); | 23 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps); |
| 25 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); | 24 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps); |
| 26 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC
aps& caps); | 25 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); | |
| 28 | 26 |
| 29 DEF_GPUTEST(GrPorterDuff, reporter, factory) { | 27 DEF_GPUTEST(GrPorterDuff, reporter, factory) { |
| 30 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType); | 28 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType); |
| 31 if (!ctx) { | 29 if (!ctx) { |
| 32 SkFAIL("Failed to create null context."); | 30 SkFAIL("Failed to create null context."); |
| 33 return; | 31 return; |
| 34 } | 32 } |
| 35 | 33 |
| 36 const GrCaps& caps = *ctx->getGpu()->caps(); | 34 const GrCaps& caps = *ctx->getGpu()->caps(); |
| 37 if (!caps.shaderCaps()->dualSourceBlendingSupport()) { | 35 if (!caps.shaderCaps()->dualSourceBlendingSupport()) { |
| 38 SkFAIL("Null context does not support dual source blending."); | 36 SkFAIL("Null context does not support dual source blending."); |
| 39 return; | 37 return; |
| 40 } | 38 } |
| 41 | 39 |
| 42 test_alpha_unknown_with_coverage(reporter, caps); | 40 test_alpha_unknown_with_coverage(reporter, caps); |
| 43 test_alpha_unknown_no_coverage(reporter, caps); | 41 test_alpha_unknown_no_coverage(reporter, caps); |
| 44 test_alpha_opaque_with_coverage(reporter, caps); | 42 test_alpha_opaque_with_coverage(reporter, caps); |
| 45 test_alpha_opaque_no_coverage(reporter, caps); | 43 test_alpha_opaque_no_coverage(reporter, caps); |
| 46 test_color_white_with_coverage(reporter, caps); | 44 test_color_white_with_coverage(reporter, caps); |
| 47 test_color_white_with_coverage(reporter, caps); | 45 test_color_white_with_coverage(reporter, caps); |
| 48 test_color_white_no_coverage(reporter, caps); | 46 test_color_white_no_coverage(reporter, caps); |
| 49 test_lcd_coverage(reporter, caps); | |
| 50 } | 47 } |
| 51 | 48 |
| 52 //////////////////////////////////////////////////////////////////////////////// | 49 //////////////////////////////////////////////////////////////////////////////// |
| 53 | 50 |
| 54 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__) | 51 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__) |
| 55 | 52 |
| 56 enum { | 53 enum { |
| 57 kNone_OutputType, | 54 kNone_OutputType, |
| 58 kCoverage_OutputType, | 55 kCoverage_OutputType, |
| 59 kModulate_OutputType, | 56 kModulate_OutputType, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 }; | 93 }; |
| 97 | 94 |
| 98 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { | 95 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { |
| 99 GrProcOptInfo colorPOI, covPOI; | 96 GrProcOptInfo colorPOI, covPOI; |
| 100 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals
e); | 97 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals
e); |
| 101 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 98 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); |
| 102 | 99 |
| 103 SkASSERT(!colorPOI.isOpaque()); | 100 SkASSERT(!colorPOI.isOpaque()); |
| 104 SkASSERT(!colorPOI.isSolidWhite()); | 101 SkASSERT(!colorPOI.isSolidWhite()); |
| 105 SkASSERT(!covPOI.isSolidWhite()); | 102 SkASSERT(!covPOI.isSolidWhite()); |
| 106 SkASSERT(!covPOI.isFourChannelOutput()); | |
| 107 | 103 |
| 108 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 104 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 109 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 105 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 110 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 106 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 111 | 107 |
| 112 switch (xfermode) { | 108 switch (xfermode) { |
| 113 case SkXfermode::kClear_Mode: | 109 case SkXfermode::kClear_Mode: |
| 114 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | 110 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); |
| 115 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 111 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
| 116 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | 112 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 | 283 |
| 288 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { | 284 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { |
| 289 GrProcOptInfo colorPOI, covPOI; | 285 GrProcOptInfo colorPOI, covPOI; |
| 290 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0), | 286 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0), |
| 291 kR_GrColorComponentFlag | kB_GrColorComponent
Flag, false); | 287 kR_GrColorComponentFlag | kB_GrColorComponent
Flag, false); |
| 292 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 288 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); |
| 293 | 289 |
| 294 SkASSERT(!colorPOI.isOpaque()); | 290 SkASSERT(!colorPOI.isOpaque()); |
| 295 SkASSERT(!colorPOI.isSolidWhite()); | 291 SkASSERT(!colorPOI.isSolidWhite()); |
| 296 SkASSERT(covPOI.isSolidWhite()); | 292 SkASSERT(covPOI.isSolidWhite()); |
| 297 SkASSERT(!covPOI.isFourChannelOutput()); | |
| 298 | 293 |
| 299 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 294 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 300 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 295 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 301 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 296 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 302 | 297 |
| 303 switch (xfermode) { | 298 switch (xfermode) { |
| 304 case SkXfermode::kClear_Mode: | 299 case SkXfermode::kClear_Mode: |
| 305 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | 300 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); |
| 306 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | 301 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); |
| 307 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 302 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 } | 484 } |
| 490 | 485 |
| 491 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { | 486 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { |
| 492 GrProcOptInfo colorPOI, covPOI; | 487 GrProcOptInfo colorPOI, covPOI; |
| 493 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon
entFlag, false); | 488 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon
entFlag, false); |
| 494 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 489 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); |
| 495 | 490 |
| 496 SkASSERT(colorPOI.isOpaque()); | 491 SkASSERT(colorPOI.isOpaque()); |
| 497 SkASSERT(!colorPOI.isSolidWhite()); | 492 SkASSERT(!colorPOI.isSolidWhite()); |
| 498 SkASSERT(!covPOI.isSolidWhite()); | 493 SkASSERT(!covPOI.isSolidWhite()); |
| 499 SkASSERT(!covPOI.isFourChannelOutput()); | |
| 500 | 494 |
| 501 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 495 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 502 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 496 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 503 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 497 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 504 | 498 |
| 505 switch (xfermode) { | 499 switch (xfermode) { |
| 506 case SkXfermode::kClear_Mode: | 500 case SkXfermode::kClear_Mode: |
| 507 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | 501 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); |
| 508 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 502 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
| 509 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | 503 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 | 677 |
| 684 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps) { | 678 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps) { |
| 685 GrProcOptInfo colorPOI, covPOI; | 679 GrProcOptInfo colorPOI, covPOI; |
| 686 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255), | 680 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255), |
| 687 kG_GrColorComponentFlag | kA_GrColorComponent
Flag, false); | 681 kG_GrColorComponentFlag | kA_GrColorComponent
Flag, false); |
| 688 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 682 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); |
| 689 | 683 |
| 690 SkASSERT(colorPOI.isOpaque()); | 684 SkASSERT(colorPOI.isOpaque()); |
| 691 SkASSERT(!colorPOI.isSolidWhite()); | 685 SkASSERT(!colorPOI.isSolidWhite()); |
| 692 SkASSERT(covPOI.isSolidWhite()); | 686 SkASSERT(covPOI.isSolidWhite()); |
| 693 SkASSERT(!covPOI.isFourChannelOutput()); | |
| 694 | 687 |
| 695 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 688 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 696 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 689 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 697 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 690 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 698 | 691 |
| 699 switch (xfermode) { | 692 switch (xfermode) { |
| 700 case SkXfermode::kClear_Mode: | 693 case SkXfermode::kClear_Mode: |
| 701 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | 694 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); |
| 702 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | 695 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); |
| 703 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 696 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 } | 883 } |
| 891 | 884 |
| 892 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { | 885 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { |
| 893 GrProcOptInfo colorPOI, covPOI; | 886 GrProcOptInfo colorPOI, covPOI; |
| 894 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); | 887 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); |
| 895 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 888 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); |
| 896 | 889 |
| 897 SkASSERT(colorPOI.isOpaque()); | 890 SkASSERT(colorPOI.isOpaque()); |
| 898 SkASSERT(colorPOI.isSolidWhite()); | 891 SkASSERT(colorPOI.isSolidWhite()); |
| 899 SkASSERT(!covPOI.isSolidWhite()); | 892 SkASSERT(!covPOI.isSolidWhite()); |
| 900 SkASSERT(!covPOI.isFourChannelOutput()); | |
| 901 | 893 |
| 902 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 894 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 903 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 895 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 904 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 896 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 905 | 897 |
| 906 switch (xfermode) { | 898 switch (xfermode) { |
| 907 case SkXfermode::kClear_Mode: | 899 case SkXfermode::kClear_Mode: |
| 908 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); | 900 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst); |
| 909 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 901 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
| 910 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); | 902 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1083 } | 1075 } |
| 1084 | 1076 |
| 1085 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC
aps& caps) { | 1077 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC
aps& caps) { |
| 1086 GrProcOptInfo colorPOI, covPOI; | 1078 GrProcOptInfo colorPOI, covPOI; |
| 1087 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); | 1079 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom
ponentFlags, false); |
| 1088 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 1080 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); |
| 1089 | 1081 |
| 1090 SkASSERT(colorPOI.isOpaque()); | 1082 SkASSERT(colorPOI.isOpaque()); |
| 1091 SkASSERT(colorPOI.isSolidWhite()); | 1083 SkASSERT(colorPOI.isSolidWhite()); |
| 1092 SkASSERT(covPOI.isSolidWhite()); | 1084 SkASSERT(covPOI.isSolidWhite()); |
| 1093 SkASSERT(!covPOI.isFourChannelOutput()); | |
| 1094 | 1085 |
| 1095 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 1086 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 1096 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 1087 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 1097 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 1088 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 1098 | 1089 |
| 1099 switch (xfermode) { | 1090 switch (xfermode) { |
| 1100 case SkXfermode::kClear_Mode: | 1091 case SkXfermode::kClear_Mode: |
| 1101 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); | 1092 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst); |
| 1102 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); | 1093 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor); |
| 1103 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); | 1094 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput.
fBlendedColorFlags); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1278 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); | 1269 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
| 1279 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); | 1270 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
| 1280 break; | 1271 break; |
| 1281 default: | 1272 default: |
| 1282 ERRORF(reporter, "Invalid xfermode."); | 1273 ERRORF(reporter, "Invalid xfermode."); |
| 1283 break; | 1274 break; |
| 1284 } | 1275 } |
| 1285 } | 1276 } |
| 1286 } | 1277 } |
| 1287 | 1278 |
| 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 | |
| 1335 #endif | 1279 #endif |
| 1336 | 1280 |
| OLD | NEW |