Fix saveLayer() clipping w/filters, GPU path.
Don't modify the clipstack in saveLayer() if the kClipToLayer_SaveFlag is
not set. Without this the GPU path will clip the offscreen to the layer's
bounds, even if the flag is not set.
R=robertphillips@google.com
BUG=skia:
Review URL: https://codereview.chromium.org/164203002
git-svn-id: http://skia.googlecode.com/svn/trunk@13561 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/CanvasStateTest.cpp b/tests/CanvasStateTest.cpp
index 29e67f2..3c7552f 100644
--- a/tests/CanvasStateTest.cpp
+++ b/tests/CanvasStateTest.cpp
@@ -228,9 +228,43 @@
SkClearLastError();
}
+static void test_saveLayer_clip(skiatest::Reporter* reporter) {
+ const int WIDTH = 100;
+ const int HEIGHT = 100;
+ const int LAYER_WIDTH = 50;
+ const int LAYER_HEIGHT = 50;
+
+ SkBitmap bitmap;
+ bitmap.allocN32Pixels(WIDTH, HEIGHT);
+ SkCanvas canvas(bitmap);
+
+ SkRect bounds = SkRect::MakeWH(SkIntToScalar(LAYER_WIDTH), SkIntToScalar(LAYER_HEIGHT));
+ canvas.clipRect(SkRect::MakeWH(SkIntToScalar(WIDTH), SkIntToScalar(HEIGHT)));
+
+ // Check that saveLayer without the kClipToLayer_SaveFlag leaves the
+ // clip stack unchanged.
+ canvas.saveLayer(&bounds, NULL, SkCanvas::kARGB_NoClipLayer_SaveFlag);
+ SkRect clipStackBounds;
+ SkClipStack::BoundsType boundsType;
+ canvas.getClipStack()->getBounds(&clipStackBounds, &boundsType);
+ REPORTER_ASSERT(reporter, clipStackBounds.width() == WIDTH);
+ REPORTER_ASSERT(reporter, clipStackBounds.height() == HEIGHT);
+ canvas.restore();
+
+ // Check that saveLayer with the kClipToLayer_SaveFlag sets the clip
+ // stack to the layer bounds.
+ canvas.saveLayer(&bounds, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag);
+ canvas.getClipStack()->getBounds(&clipStackBounds, &boundsType);
+ REPORTER_ASSERT(reporter, clipStackBounds.width() == LAYER_WIDTH);
+ REPORTER_ASSERT(reporter, clipStackBounds.height() == LAYER_HEIGHT);
+
+ canvas.restore();
+}
+
DEF_TEST(CanvasState, reporter) {
test_complex_layers(reporter);
test_complex_clips(reporter);
test_draw_filters(reporter);
test_soft_clips(reporter);
+ test_saveLayer_clip(reporter);
}