| 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 |