Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1945)

Unified Diff: tests/ClipStackTest.cpp

Issue 16160020: Compact the clipstack for kReplace_Op'd geometry (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Fix nits Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkClipStack.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/ClipStackTest.cpp
diff --git a/tests/ClipStackTest.cpp b/tests/ClipStackTest.cpp
index 4de667367e5bf87563bfe553009e5ab0821b304a..cbed19364ffd88e06d189b79fa88d8756b94a984 100644
--- a/tests/ClipStackTest.cpp
+++ b/tests/ClipStackTest.cpp
@@ -392,6 +392,107 @@ static void test_rect_inverse_fill(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, bounds == rect);
}
+static void test_rect_replace(skiatest::Reporter* reporter) {
+ SkRect rect = SkRect::MakeWH(100, 100);
+ SkRect rect2 = SkRect::MakeXYWH(50, 50, 100, 100);
+
+ SkRect bound;
+ SkClipStack::BoundsType type;
+ bool isIntersectionOfRects;
+
+ // Adding a new rect with the replace operator should not increase
+ // the stack depth. BW replacing BW.
+ {
+ SkClipStack stack;
+ REPORTER_ASSERT(reporter, 0 == count(stack));
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ }
+
+ // Adding a new rect with the replace operator should not increase
+ // the stack depth. AA replacing AA.
+ {
+ SkClipStack stack;
+ REPORTER_ASSERT(reporter, 0 == count(stack));
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, true);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, true);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ }
+
+ // Adding a new rect with the replace operator should not increase
+ // the stack depth. BW replacing AA replacing BW.
+ {
+ SkClipStack stack;
+ REPORTER_ASSERT(reporter, 0 == count(stack));
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, true);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ }
+
+ // Make sure replace clip rects don't collapse too much.
+ {
+ SkClipStack stack;
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ stack.clipDevRect(rect2, SkRegion::kIntersect_Op, false);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+
+ stack.save();
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 2 == count(stack));
+ stack.getBounds(&bound, &type, &isIntersectionOfRects);
+ REPORTER_ASSERT(reporter, bound == rect);
+ stack.restore();
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+
+ stack.save();
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 2 == count(stack));
+ stack.restore();
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+
+ stack.save();
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ stack.clipDevRect(rect2, SkRegion::kIntersect_Op, false);
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 2 == count(stack));
+ stack.restore();
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ }
+}
+
+// Simplified path-based version of test_rect_replace.
+static void test_path_replace(skiatest::Reporter* reporter) {
+ SkRect rect = SkRect::MakeWH(100, 100);
+ SkPath path;
+ path.addCircle(50, 50, 50);
+
+ // Replace operation doesn't grow the stack.
+ {
+ SkClipStack stack;
+ REPORTER_ASSERT(reporter, 0 == count(stack));
+ stack.clipDevPath(path, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ stack.clipDevPath(path, SkRegion::kReplace_Op, false);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ }
+
+ // Replacing rect with path.
+ {
+ SkClipStack stack;
+ stack.clipDevRect(rect, SkRegion::kReplace_Op, true);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ stack.clipDevPath(path, SkRegion::kReplace_Op, true);
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+ }
+}
+
// Test out SkClipStack's merging of rect clips. In particular exercise
// merging of aa vs. bw rects.
static void test_rect_merging(skiatest::Reporter* reporter) {
@@ -950,7 +1051,9 @@ static void TestClipStack(skiatest::Reporter* reporter) {
test_bounds(reporter, false); // once with paths
test_isWideOpen(reporter);
test_rect_merging(reporter);
+ test_rect_replace(reporter);
test_rect_inverse_fill(reporter);
+ test_path_replace(reporter);
test_quickContains(reporter);
#if SK_SUPPORT_GPU
test_reduced_clip_stack(reporter);
« no previous file with comments | « src/core/SkClipStack.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698