Added check for aa/bw rect merging
http://codereview.appspot.com/6449079/
git-svn-id: http://skia.googlecode.com/svn/trunk@4907 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/ClipStackTest.cpp b/tests/ClipStackTest.cpp
index afbbd7e..1def9b4 100644
--- a/tests/ClipStackTest.cpp
+++ b/tests/ClipStackTest.cpp
@@ -127,6 +127,8 @@
REPORTER_ASSERT(reporter, count == counter);
}
+// Exercise the SkClipStack's bottom to top and bidirectional iterators
+// (including the skipToTopmost functionality)
static void test_iterators(skiatest::Reporter* reporter) {
SkClipStack stack;
@@ -183,6 +185,7 @@
}
}
+// Exercise the SkClipStack's getConservativeBounds computation
static void test_bounds(skiatest::Reporter* reporter, bool useRects) {
static const int gNumCases = 20;
@@ -351,6 +354,124 @@
}
}
+int count(const SkClipStack& stack) {
+
+ SkClipStack::Iter iter(stack, SkClipStack::Iter::kTop_IterStart);
+
+ const SkClipStack::Iter::Clip* clip = NULL;
+ int count = 0;
+
+ for (clip = iter.prev(); clip; clip = iter.prev(), ++count) {
+ ;
+ }
+
+ return count;
+}
+
+// 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) {
+
+ SkRect overlapLeft = SkRect::MakeLTRB(10, 10, 50, 50);
+ SkRect overlapRight = SkRect::MakeLTRB(40, 40, 80, 80);
+
+ SkRect nestedParent = SkRect::MakeLTRB(10, 10, 90, 90);
+ SkRect nestedChild = SkRect::MakeLTRB(40, 40, 60, 60);
+
+ SkRect bound;
+ SkClipStack::BoundsType type;
+ bool isIntersectionOfRects;
+
+ // all bw overlapping - should merge
+ {
+ SkClipStack stack;
+
+ stack.clipDevRect(overlapLeft, SkRegion::kReplace_Op, false);
+
+ stack.clipDevRect(overlapRight, SkRegion::kIntersect_Op, false);
+
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+
+ stack.getBounds(&bound, &type, &isIntersectionOfRects);
+
+ REPORTER_ASSERT(reporter, isIntersectionOfRects);
+ }
+
+ // all aa overlapping - should merge
+ {
+ SkClipStack stack;
+
+ stack.clipDevRect(overlapLeft, SkRegion::kReplace_Op, true);
+
+ stack.clipDevRect(overlapRight, SkRegion::kIntersect_Op, true);
+
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+
+ stack.getBounds(&bound, &type, &isIntersectionOfRects);
+
+ REPORTER_ASSERT(reporter, isIntersectionOfRects);
+ }
+
+ // mixed overlapping - should _not_ merge
+ {
+ SkClipStack stack;
+
+ stack.clipDevRect(overlapLeft, SkRegion::kReplace_Op, true);
+
+ stack.clipDevRect(overlapRight, SkRegion::kIntersect_Op, false);
+
+ REPORTER_ASSERT(reporter, 2 == count(stack));
+
+ stack.getBounds(&bound, &type, &isIntersectionOfRects);
+
+ REPORTER_ASSERT(reporter, !isIntersectionOfRects);
+ }
+
+ // mixed nested (bw inside aa) - should merge
+ {
+ SkClipStack stack;
+
+ stack.clipDevRect(nestedParent, SkRegion::kReplace_Op, true);
+
+ stack.clipDevRect(nestedChild, SkRegion::kIntersect_Op, false);
+
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+
+ stack.getBounds(&bound, &type, &isIntersectionOfRects);
+
+ REPORTER_ASSERT(reporter, isIntersectionOfRects);
+ }
+
+ // mixed nested (aa inside bw) - should merge
+ {
+ SkClipStack stack;
+
+ stack.clipDevRect(nestedParent, SkRegion::kReplace_Op, false);
+
+ stack.clipDevRect(nestedChild, SkRegion::kIntersect_Op, true);
+
+ REPORTER_ASSERT(reporter, 1 == count(stack));
+
+ stack.getBounds(&bound, &type, &isIntersectionOfRects);
+
+ REPORTER_ASSERT(reporter, isIntersectionOfRects);
+ }
+
+ // reverse nested (aa inside bw) - should _not_ merge
+ {
+ SkClipStack stack;
+
+ stack.clipDevRect(nestedChild, SkRegion::kReplace_Op, false);
+
+ stack.clipDevRect(nestedParent, SkRegion::kIntersect_Op, true);
+
+ REPORTER_ASSERT(reporter, 2 == count(stack));
+
+ stack.getBounds(&bound, &type, &isIntersectionOfRects);
+
+ REPORTER_ASSERT(reporter, !isIntersectionOfRects);
+ }
+}
static void TestClipStack(skiatest::Reporter* reporter) {
SkClipStack stack;
@@ -388,9 +509,10 @@
test_assign_and_comparison(reporter);
test_iterators(reporter);
- test_bounds(reporter, true);
- test_bounds(reporter, false);
+ test_bounds(reporter, true); // once with rects
+ test_bounds(reporter, false); // once with paths
test_isWideOpen(reporter);
+ test_rect_merging(reporter);
}
#include "TestClassDef.h"