Index: tests/CanvasStateTest.cpp |
diff --git a/tests/CanvasStateTest.cpp b/tests/CanvasStateTest.cpp |
index c6756a732e9c3adb4579b96d69a88124b0747eaa..604c4948db85072f2dec0d84a798206415dc0354 100644 |
--- a/tests/CanvasStateTest.cpp |
+++ b/tests/CanvasStateTest.cpp |
@@ -16,7 +16,6 @@ |
#include "SkRRect.h" |
static void test_complex_layers(skiatest::Reporter* reporter) { |
- |
const int WIDTH = 400; |
const int HEIGHT = 400; |
const int SPACER = 10; |
@@ -91,6 +90,95 @@ static void test_complex_layers(skiatest::Reporter* reporter) { |
//////////////////////////////////////////////////////////////////////////////// |
+static void test_complex_clips(skiatest::Reporter* reporter) { |
+ |
+ const int WIDTH = 400; |
+ const int HEIGHT = 400; |
+ const SkScalar SPACER = SkIntToScalar(10); |
+ |
+ SkRect layerRect = SkRect::MakeWH(SkIntToScalar(WIDTH), SkIntToScalar(HEIGHT / 4)); |
+ layerRect.inset(2*SPACER, 2*SPACER); |
+ |
+ SkRect clipRect = layerRect; |
+ clipRect.fRight = clipRect.fLeft + (clipRect.width() / 2) - (2*SPACER); |
+ clipRect.outset(SPACER, SPACER); |
+ |
+ SkIRect regionBounds; |
+ clipRect.roundIn(®ionBounds); |
+ regionBounds.offset(clipRect.width() + (2*SPACER), 0); |
+ |
+ SkIRect regionInterior = regionBounds; |
+ regionInterior.inset(SPACER*3, SPACER*3); |
+ |
+ SkRegion clipRegion; |
+ clipRegion.setRect(regionBounds); |
+ clipRegion.op(regionInterior, SkRegion::kDifference_Op); |
+ |
+ |
+ const SkRegion::Op clipOps[] = { SkRegion::kIntersect_Op, |
+ SkRegion::kIntersect_Op, |
+ SkRegion::kReplace_Op, |
+ }; |
+ const SkCanvas::SaveFlags flags[] = { SkCanvas::kARGB_NoClipLayer_SaveFlag, |
+ SkCanvas::kARGB_ClipLayer_SaveFlag, |
+ SkCanvas::kARGB_NoClipLayer_SaveFlag, |
+ }; |
+ REPORTER_ASSERT(reporter, sizeof(clipOps) == sizeof(flags)); |
+ const int layerCombinations = sizeof(flags) / sizeof(SkCanvas::SaveFlags); |
+ |
+ SkBitmap bitmaps[2]; |
+ for (int i = 0; i < 2; ++i) { |
+ bitmaps[i].setConfig(SkBitmap::kARGB_8888_Config, WIDTH, HEIGHT); |
+ bitmaps[i].allocPixels(); |
+ |
+ SkCanvas canvas(bitmaps[i]); |
+ |
+ canvas.drawColor(SK_ColorRED); |
+ |
+ SkRegion localRegion = clipRegion; |
+ |
+ for (int j = 0; j < layerCombinations; ++j) { |
+ canvas.saveLayerAlpha(&layerRect, 128, flags[j]); |
+ |
+ SkCanvasState* state = NULL; |
+ SkCanvas* tmpCanvas = NULL; |
+ if (i) { |
+ state = SkCanvasStateUtils::CaptureCanvasState(&canvas); |
+ REPORTER_ASSERT(reporter, state); |
+ tmpCanvas = SkCanvasStateUtils::CreateFromCanvasState(state); |
+ REPORTER_ASSERT(reporter, tmpCanvas); |
+ } else { |
+ tmpCanvas = SkRef(&canvas); |
+ } |
+ |
+ tmpCanvas->save(); |
+ tmpCanvas->clipRect(clipRect, clipOps[j]); |
+ tmpCanvas->drawColor(SK_ColorBLUE); |
+ tmpCanvas->restore(); |
+ |
+ tmpCanvas->clipRegion(localRegion, clipOps[j]); |
+ tmpCanvas->drawColor(SK_ColorBLUE); |
+ |
+ tmpCanvas->unref(); |
+ SkCanvasStateUtils::ReleaseCanvasState(state); |
+ |
+ canvas.restore(); |
+ |
+ // translate the canvas and region for the next iteration |
+ canvas.translate(0, 2*(layerRect.height() + SPACER)); |
+ localRegion.translate(0, 2*(layerRect.height() + SPACER)); |
+ } |
+ } |
+ |
+ // now we memcmp the two bitmaps |
+ REPORTER_ASSERT(reporter, bitmaps[0].getSize() == bitmaps[1].getSize()); |
+ REPORTER_ASSERT(reporter, !memcmp(bitmaps[0].getPixels(), |
+ bitmaps[1].getPixels(), |
+ bitmaps[0].getSize())); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
class TestDrawFilter : public SkDrawFilter { |
public: |
virtual bool filter(SkPaint*, Type) SK_OVERRIDE { return true; } |
@@ -134,6 +222,7 @@ static void test_soft_clips(skiatest::Reporter* reporter) { |
static void test_canvas_state_utils(skiatest::Reporter* reporter) { |
test_complex_layers(reporter); |
+ test_complex_clips(reporter); |
test_draw_filters(reporter); |
test_soft_clips(reporter); |
} |