| 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 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCovera
ge_OptFlag | 69 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCovera
ge_OptFlag |
| 70 }; | 70 }; |
| 71 | 71 |
| 72 class GrPorterDuffTest { | 72 class GrPorterDuffTest { |
| 73 public: | 73 public: |
| 74 struct XPInfo { | 74 struct XPInfo { |
| 75 XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const Gr
Caps& caps, | 75 XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const Gr
Caps& caps, |
| 76 const GrProcOptInfo& colorPOI, const GrProcOptInfo& covPOI) { | 76 const GrProcOptInfo& colorPOI, const GrProcOptInfo& covPOI) { |
| 77 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode
)); | 77 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode
)); |
| 78 SkAutoTUnref<GrXferProcessor> xp( | 78 SkAutoTUnref<GrXferProcessor> xp( |
| 79 xpf->createXferProcessor(colorPOI, covPOI, false, NULL, caps)); | 79 xpf->createXferProcessor(colorPOI, covPOI, false, nullptr, caps)
); |
| 80 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI, false))
; | 80 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI, false))
; |
| 81 xpf->getInvariantBlendedColor(colorPOI, &fBlendedColor); | 81 xpf->getInvariantBlendedColor(colorPOI, &fBlendedColor); |
| 82 fOptFlags = xp->getOptimizations(colorPOI, covPOI, false, NULL, caps
); | 82 fOptFlags = xp->getOptimizations(colorPOI, covPOI, false, nullptr, c
aps); |
| 83 GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType); | 83 GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType); |
| 84 xp->getBlendInfo(&fBlendInfo); | 84 xp->getBlendInfo(&fBlendInfo); |
| 85 TEST_ASSERT(!xp->willReadDstColor()); | 85 TEST_ASSERT(!xp->willReadDstColor()); |
| 86 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendI
nfo.fDstBlend)); | 86 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendI
nfo.fDstBlend)); |
| 87 } | 87 } |
| 88 | 88 |
| 89 GrXPFactory::InvariantBlendedColor fBlendedColor; | 89 GrXPFactory::InvariantBlendedColor fBlendedColor; |
| 90 int fOptFlags; | 90 int fOptFlags; |
| 91 int fPrimaryOutputType; | 91 int fPrimaryOutputType; |
| 92 int fSecondaryOutputType; | 92 int fSecondaryOutputType; |
| 93 GrXferProcessor::BlendInfo fBlendInfo; | 93 GrXferProcessor::BlendInfo fBlendInfo; |
| 94 }; | 94 }; |
| 95 | 95 |
| 96 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int
* outSecondary) { | 96 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int
* outSecondary) { |
| 97 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary
); | 97 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary
); |
| 98 } | 98 } |
| 99 }; | 99 }; |
| 100 | 100 |
| 101 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { | 101 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { |
| 102 GrProcOptInfo colorPOI, covPOI; | 102 GrProcOptInfo colorPOI, covPOI; |
| 103 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals
e); | 103 colorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, f
alse); |
| 104 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 104 covPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, tru
e); |
| 105 | 105 |
| 106 SkASSERT(!colorPOI.isOpaque()); | 106 SkASSERT(!colorPOI.isOpaque()); |
| 107 SkASSERT(!colorPOI.isSolidWhite()); | 107 SkASSERT(!colorPOI.isSolidWhite()); |
| 108 SkASSERT(!covPOI.isSolidWhite()); | 108 SkASSERT(!covPOI.isSolidWhite()); |
| 109 SkASSERT(!covPOI.isFourChannelOutput()); | 109 SkASSERT(!covPOI.isFourChannelOutput()); |
| 110 | 110 |
| 111 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 111 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 112 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 112 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 113 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 113 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 114 | 114 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 break; | 284 break; |
| 285 default: | 285 default: |
| 286 ERRORF(reporter, "Invalid xfermode."); | 286 ERRORF(reporter, "Invalid xfermode."); |
| 287 break; | 287 break; |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 } | 290 } |
| 291 | 291 |
| 292 static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { | 292 static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G
rCaps& caps) { |
| 293 GrProcOptInfo colorPOI, covPOI; | 293 GrProcOptInfo colorPOI, covPOI; |
| 294 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0), | 294 colorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0), |
| 295 kR_GrColorComponentFlag | kB_GrColorComponent
Flag, false); | 295 kR_GrColorComponentFlag | kB_GrColorComponent
Flag, false); |
| 296 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 296 covPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), kRGBA_GrColorCo
mponentFlags, true); |
| 297 | 297 |
| 298 SkASSERT(!colorPOI.isOpaque()); | 298 SkASSERT(!colorPOI.isOpaque()); |
| 299 SkASSERT(!colorPOI.isSolidWhite()); | 299 SkASSERT(!colorPOI.isSolidWhite()); |
| 300 SkASSERT(covPOI.isSolidWhite()); | 300 SkASSERT(covPOI.isSolidWhite()); |
| 301 SkASSERT(!covPOI.isFourChannelOutput()); | 301 SkASSERT(!covPOI.isFourChannelOutput()); |
| 302 | 302 |
| 303 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 303 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 304 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 304 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 305 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 305 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 306 | 306 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 break; | 487 break; |
| 488 default: | 488 default: |
| 489 ERRORF(reporter, "Invalid xfermode."); | 489 ERRORF(reporter, "Invalid xfermode."); |
| 490 break; | 490 break; |
| 491 } | 491 } |
| 492 } | 492 } |
| 493 } | 493 } |
| 494 | 494 |
| 495 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { | 495 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const
GrCaps& caps) { |
| 496 GrProcOptInfo colorPOI, covPOI; | 496 GrProcOptInfo colorPOI, covPOI; |
| 497 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon
entFlag, false); | 497 colorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), kA_GrColorCom
ponentFlag, false); |
| 498 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true); | 498 covPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, tru
e); |
| 499 | 499 |
| 500 SkASSERT(colorPOI.isOpaque()); | 500 SkASSERT(colorPOI.isOpaque()); |
| 501 SkASSERT(!colorPOI.isSolidWhite()); | 501 SkASSERT(!colorPOI.isSolidWhite()); |
| 502 SkASSERT(!covPOI.isSolidWhite()); | 502 SkASSERT(!covPOI.isSolidWhite()); |
| 503 SkASSERT(!covPOI.isFourChannelOutput()); | 503 SkASSERT(!covPOI.isFourChannelOutput()); |
| 504 | 504 |
| 505 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 505 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 506 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 506 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 507 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 507 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 508 | 508 |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 break; | 684 break; |
| 685 default: | 685 default: |
| 686 ERRORF(reporter, "Invalid xfermode."); | 686 ERRORF(reporter, "Invalid xfermode."); |
| 687 break; | 687 break; |
| 688 } | 688 } |
| 689 } | 689 } |
| 690 } | 690 } |
| 691 | 691 |
| 692 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps) { | 692 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr
Caps& caps) { |
| 693 GrProcOptInfo colorPOI, covPOI; | 693 GrProcOptInfo colorPOI, covPOI; |
| 694 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255), | 694 colorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255), |
| 695 kG_GrColorComponentFlag | kA_GrColorComponent
Flag, false); | 695 kG_GrColorComponentFlag | kA_GrColorComponent
Flag, false); |
| 696 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo
nentFlags, true); | 696 covPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), kRGBA_GrColorCo
mponentFlags, true); |
| 697 | 697 |
| 698 SkASSERT(colorPOI.isOpaque()); | 698 SkASSERT(colorPOI.isOpaque()); |
| 699 SkASSERT(!colorPOI.isSolidWhite()); | 699 SkASSERT(!colorPOI.isSolidWhite()); |
| 700 SkASSERT(covPOI.isSolidWhite()); | 700 SkASSERT(covPOI.isSolidWhite()); |
| 701 SkASSERT(!covPOI.isFourChannelOutput()); | 701 SkASSERT(!covPOI.isFourChannelOutput()); |
| 702 | 702 |
| 703 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 703 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 704 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 704 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 705 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); | 705 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c
ovPOI); |
| 706 | 706 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 } | 909 } |
| 910 | 910 |
| 911 const char* name() const override { return "Test LCD Text Batch"; } | 911 const char* name() const override { return "Test LCD Text Batch"; } |
| 912 void initBatchTracker(const GrPipelineOptimizations&) override {} | 912 void initBatchTracker(const GrPipelineOptimizations&) override {} |
| 913 bool onCombineIfPossible(GrBatch*, const GrCaps&) override { return fal
se; } | 913 bool onCombineIfPossible(GrBatch*, const GrCaps&) override { return fal
se; } |
| 914 void onPrepareDraws(Target*) override {}; | 914 void onPrepareDraws(Target*) override {}; |
| 915 | 915 |
| 916 } testLCDCoverageBatch; | 916 } testLCDCoverageBatch; |
| 917 | 917 |
| 918 GrProcOptInfo colorPOI, covPOI; | 918 GrProcOptInfo colorPOI, covPOI; |
| 919 colorPOI.calcColorWithBatch(&testLCDCoverageBatch, NULL, 0); | 919 colorPOI.calcColorWithBatch(&testLCDCoverageBatch, nullptr, 0); |
| 920 covPOI.calcCoverageWithBatch(&testLCDCoverageBatch, NULL, 0); | 920 covPOI.calcCoverageWithBatch(&testLCDCoverageBatch, nullptr, 0); |
| 921 | 921 |
| 922 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags()); | 922 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags()); |
| 923 SkASSERT(covPOI.isFourChannelOutput()); | 923 SkASSERT(covPOI.isFourChannelOutput()); |
| 924 | 924 |
| 925 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrc
Over_Mode)); | 925 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrc
Over_Mode)); |
| 926 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI, false)); | 926 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI, false)); |
| 927 | 927 |
| 928 SkAutoTUnref<GrXferProcessor> xp( | 928 SkAutoTUnref<GrXferProcessor> xp( |
| 929 xpf->createXferProcessor(colorPOI, covPOI, false, NULL, caps)); | 929 xpf->createXferProcessor(colorPOI, covPOI, false, nullptr, caps)); |
| 930 if (!xp) { | 930 if (!xp) { |
| 931 ERRORF(reporter, "Failed to create an XP with LCD coverage."); | 931 ERRORF(reporter, "Failed to create an XP with LCD coverage."); |
| 932 return; | 932 return; |
| 933 } | 933 } |
| 934 | 934 |
| 935 GrXPFactory::InvariantBlendedColor blendedColor; | 935 GrXPFactory::InvariantBlendedColor blendedColor; |
| 936 xpf->getInvariantBlendedColor(colorPOI, &blendedColor); | 936 xpf->getInvariantBlendedColor(colorPOI, &blendedColor); |
| 937 TEST_ASSERT(blendedColor.fWillBlendWithDst); | 937 TEST_ASSERT(blendedColor.fWillBlendWithDst); |
| 938 TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags); | 938 TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags); |
| 939 | 939 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 978 }; | 978 }; |
| 979 static const GrColorComponentFlags testColorFlags[] = { | 979 static const GrColorComponentFlags testColorFlags[] = { |
| 980 kNone_GrColorComponentFlags, | 980 kNone_GrColorComponentFlags, |
| 981 kG_GrColorComponentFlag | kA_GrColorComponentFlag, | 981 kG_GrColorComponentFlag | kA_GrColorComponentFlag, |
| 982 kRGBA_GrColorComponentFlags | 982 kRGBA_GrColorComponentFlags |
| 983 }; | 983 }; |
| 984 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags
)); | 984 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags
)); |
| 985 | 985 |
| 986 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) { | 986 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) { |
| 987 GrProcOptInfo colorPOI; | 987 GrProcOptInfo colorPOI; |
| 988 colorPOI.calcWithInitialValues(NULL, 0, testColors[c], testColorFlags[c]
, false); | 988 colorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags
[c], false); |
| 989 for (int f = 0; f <= 1; f++) { | 989 for (int f = 0; f <= 1; f++) { |
| 990 GrProcOptInfo covPOI; | 990 GrProcOptInfo covPOI; |
| 991 if (!f) { | 991 if (!f) { |
| 992 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentF
lags, true); | 992 covPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorCompone
ntFlags, true); |
| 993 } else { | 993 } else { |
| 994 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), | 994 covPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), |
| 995 kRGBA_GrColorComponentFlags, true); | 995 kRGBA_GrColorComponentFlags, true); |
| 996 } | 996 } |
| 997 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { | 997 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
| 998 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); | 998 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
| 999 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfer
mode)); | 999 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfer
mode)); |
| 1000 GrXferProcessor::DstTexture* dstTexture = | 1000 GrXferProcessor::DstTexture* dstTexture = |
| 1001 xpf->willNeedDstTexture(caps, colorPOI, covPOI, false) ? &fa
keDstTexture : 0; | 1001 xpf->willNeedDstTexture(caps, colorPOI, covPOI, false) ? &fa
keDstTexture : 0; |
| 1002 SkAutoTUnref<GrXferProcessor> xp( | 1002 SkAutoTUnref<GrXferProcessor> xp( |
| 1003 xpf->createXferProcessor(colorPOI, covPOI, false, dstTexture
, caps)); | 1003 xpf->createXferProcessor(colorPOI, covPOI, false, dstTexture
, caps)); |
| 1004 if (!xp) { | 1004 if (!xp) { |
| 1005 ERRORF(reporter, "Failed to create an XP without dual source
blending."); | 1005 ERRORF(reporter, "Failed to create an XP without dual source
blending."); |
| 1006 return; | 1006 return; |
| 1007 } | 1007 } |
| 1008 TEST_ASSERT(!xp->hasSecondaryOutput()); | 1008 TEST_ASSERT(!xp->hasSecondaryOutput()); |
| 1009 xp->getOptimizations(colorPOI, covPOI, false, 0, caps); | 1009 xp->getOptimizations(colorPOI, covPOI, false, 0, caps); |
| 1010 TEST_ASSERT(!xp->hasSecondaryOutput()); | 1010 TEST_ASSERT(!xp->hasSecondaryOutput()); |
| 1011 } | 1011 } |
| 1012 } | 1012 } |
| 1013 } | 1013 } |
| 1014 } | 1014 } |
| 1015 | 1015 |
| 1016 #endif | 1016 #endif |
| 1017 | 1017 |
| OLD | NEW |