Index: skia/ext/analysis_canvas_unittest.cc |
diff --git a/skia/ext/analysis_canvas_unittest.cc b/skia/ext/analysis_canvas_unittest.cc |
index 5bb18eb84c9d0f7a257deffb714c671760539d66..8263075be0fd62b2d67006a3ff8ffe1d330a28f3 100644 |
--- a/skia/ext/analysis_canvas_unittest.cc |
+++ b/skia/ext/analysis_canvas_unittest.cc |
@@ -222,6 +222,49 @@ TEST(AnalysisCanvasTest, ClipPath) { |
EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); |
} |
+TEST(AnalysisCanvasTest, SaveLayerWithXfermode) { |
+ skia::AnalysisCanvas canvas(255, 255); |
+ SkRect bounds = SkRect::MakeWH(255, 255); |
+ SkColor outputColor; |
+ |
+ EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); |
+ EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); |
+ SkPaint paint; |
+ |
+ // Note: nothing is draw to the the save layer, but solid color |
+ // and transparency are handled conservatively in case the layer's |
+ // SkPaint draws something. For example, there could be an |
+ // SkPictureImageFilter. If someday analysis_canvas starts doing |
+ // a deeper analysis of the SkPaint, this test may need to be |
+ // redesigned. |
+ TransparentFill(canvas); |
+ EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); |
+ EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); |
+ paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
+ canvas.saveLayer(&bounds, &paint); |
+ canvas.restore(); |
+ EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); |
+ |
+ TransparentFill(canvas); |
+ EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); |
+ EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); |
+ paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); |
+ canvas.saveLayer(&bounds, &paint); |
+ canvas.restore(); |
+ EXPECT_FALSE(canvas.GetColorIfSolid(&outputColor)); |
+ |
+ // Layer with dst xfermode is a no-op, so this is the only case |
+ // where solid color is unaffected by the layer. |
+ TransparentFill(canvas); |
+ EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); |
+ EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); |
+ paint.setXfermodeMode(SkXfermode::kDst_Mode); |
+ canvas.saveLayer(&bounds, &paint); |
+ canvas.restore(); |
+ EXPECT_TRUE(canvas.GetColorIfSolid(&outputColor)); |
+ EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor); |
+} |
+ |
TEST(AnalysisCanvasTest, SaveLayerRestore) { |
skia::AnalysisCanvas canvas(255, 255); |