Index: tests/GrPorterDuffTest.cpp |
diff --git a/tests/GrPorterDuffTest.cpp b/tests/GrPorterDuffTest.cpp |
index 87b7a2edfa7a46a2e791a85f8df58a23ac10e859..1328272a6a5e87fb749b5315fd0ec9b66bda4698 100644 |
--- a/tests/GrPorterDuffTest.cpp |
+++ b/tests/GrPorterDuffTest.cpp |
@@ -26,6 +26,7 @@ static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G |
static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps); |
static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps); |
static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps); |
+static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps); |
static void test_no_dual_source_blending(skiatest::Reporter* reporter); |
DEF_GPUTEST(GrPorterDuff, reporter, factory) { |
@@ -46,6 +47,7 @@ DEF_GPUTEST(GrPorterDuff, reporter, factory) { |
test_color_opaque_with_coverage(reporter, caps); |
test_color_opaque_no_coverage(reporter, caps); |
test_lcd_coverage(reporter, caps); |
+ test_lcd_coverage_fallback_case(reporter, caps); |
test_no_dual_source_blending(reporter); |
} |
@@ -57,6 +59,7 @@ enum { |
kNone_OutputType, |
kCoverage_OutputType, |
kModulate_OutputType, |
+ kSAModulate_OutputType, |
kISAModulate_OutputType, |
kISCModulate_OutputType |
}; |
@@ -98,6 +101,197 @@ public: |
} |
}; |
+static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { |
+ GrProcOptInfo colorPOI, covPOI; |
+ colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false); |
+ // Setting 2nd to last value to false and last to true will force covPOI to LCD coverage. |
+ covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false, true); |
+ |
+ SkASSERT(!colorPOI.isOpaque()); |
+ SkASSERT(!colorPOI.isSolidWhite()); |
+ SkASSERT(!covPOI.isSolidWhite()); |
+ SkASSERT(covPOI.isFourChannelOutput()); |
+ |
+ for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { |
+ SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
+ const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, covPOI); |
+ |
+ switch (xfermode) { |
+ case SkXfermode::kClear_Mode: |
+ TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); |
+ TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); |
+ TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kSrc_Mode: |
+ TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kDst_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kSkipDraw_OptFlag | |
+ kIgnoreColor_OptFlag | |
+ kIgnoreCoverage_OptFlag | |
+ kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); |
+ TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kSrcOver_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kDstOver_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kSrcIn_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kDstIn_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kSrcOut_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kDstOut_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kSrcATop_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kDstATop_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kXor_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kPlus_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kModulate_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ case SkXfermode::kScreen_Mode: |
+ TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); |
+ TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); |
+ TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); |
+ TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); |
+ TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); |
+ TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); |
+ TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); |
+ TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); |
+ TEST_ASSERT(xpi.fBlendInfo.fWriteColor); |
+ break; |
+ default: |
+ ERRORF(reporter, "Invalid xfermode."); |
+ break; |
+ } |
+ } |
+} |
static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { |
GrProcOptInfo colorPOI, covPOI; |
colorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, false); |
@@ -112,6 +306,7 @@ static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const |
SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); |
const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, covPOI); |
+ |
switch (xfermode) { |
case SkXfermode::kClear_Mode: |
TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); |
@@ -897,7 +1092,7 @@ static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr |
} |
} |
-static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { |
+static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) { |
class : public GrVertexBatch { |
void getInvariantOutputColor(GrInitInvariantOutput* out) const override { |
out->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221)); |