ClipStackTest.cpp revision 1e1c36f4f89ad39e1d248edb745919e493242c68
1bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com#include "Test.h"
2bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com#include "SkClipStack.h"
31e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org#include "SkPath.h"
41e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org#include "SkRect.h"
51e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
61e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.orgstatic void test_assign_and_comparison(skiatest::Reporter* reporter) {
71e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    SkClipStack s;
81e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
91e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Build up a clip stack with a path, an empty clip, and a rect.
101e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
111e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    SkPath p;
121e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    p.moveTo(5, 6);
131e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    p.lineTo(7, 8);
141e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    p.lineTo(5, 9);
151e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    p.close();
161e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevPath(p);
171e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
181e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
191e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    SkRect r = SkRect::MakeLTRB(1, 2, 3, 4);
201e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevRect(r);
211e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    r = SkRect::MakeLTRB(10, 11, 12, 13);
221e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevRect(r);
231e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
241e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
251e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    r = SkRect::MakeLTRB(14, 15, 16, 17);
261e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevRect(r, SkRegion::kUnion_Op);
271e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
281e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Test that assignment works.
291e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    SkClipStack copy = s;
301e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s == copy);
311e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
321e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Test that different save levels triggers not equal.
331e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.restore();
341e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s != copy);
351e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
361e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Test that an equal, but not copied version is equal.
371e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
381e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    r = SkRect::MakeLTRB(14, 15, 16, 17);
391e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevRect(r, SkRegion::kUnion_Op);
401e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s == copy);
411e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
421e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Test that a different op on one level triggers not equal.
431e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.restore();
441e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
451e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    r = SkRect::MakeLTRB(14, 15, 16, 17);
461e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevRect(r);
471e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s != copy);
481e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
491e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Test that different state (clip type) triggers not equal.
501e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.restore();
511e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
521e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    SkPath rp;
531e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    rp.addRect(r);
541e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevPath(rp, SkRegion::kUnion_Op);
551e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s != copy);
561e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
571e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Test that different rects triggers not equal.
581e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.restore();
591e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
601e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    r = SkRect::MakeLTRB(24, 25, 26, 27);
611e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevRect(r, SkRegion::kUnion_Op);
621e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s != copy);
631e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
641e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Sanity check
651e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.restore();
661e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    copy.restore();
671e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s == copy);
681e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.restore();
691e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    copy.restore();
701e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s == copy);
711e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
721e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    // Test that different paths triggers not equal.
731e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.restore();
741e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.save();
751e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    p.addRect(r);
761e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    s.clipDevPath(p);
771e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    REPORTER_ASSERT(reporter, s != copy);
781e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org}
79bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
80bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.comstatic void assert_count(skiatest::Reporter* reporter, const SkClipStack& stack,
81bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com                         int count) {
82bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, count == stack.getSaveCount());
83bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
84bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    SkClipStack::B2FIter iter(stack);
85bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    int counter = 0;
86bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    while (iter.next()) {
87bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com        counter += 1;
88bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    }
89bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, count == counter);
90bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com}
91bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
92bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.comstatic void TestClipStack(skiatest::Reporter* reporter) {
93bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    SkClipStack stack;
94bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
95bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    assert_count(reporter, stack, 0);
96bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
97bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    static const SkIRect gRects[] = {
98bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com        { 0, 0, 100, 100 },
99bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com        { 25, 25, 125, 125 },
100bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com        { 0, 0, 1000, 1000 },
101bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com        { 0, 0, 75, 75 }
102bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    };
103bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gRects); i++) {
104bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com        stack.clipDevRect(gRects[i]);
105bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    }
106bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
107bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    // all of the above rects should have been intersected, leaving only 1 rect
108bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    SkClipStack::B2FIter iter(stack);
109bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    const SkClipStack::B2FIter::Clip* clip = iter.next();
110bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    const SkRect answer = { 25, 25, 75, 75 };
111bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
112bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, clip);
113bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, clip->fRect);
114bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, !clip->fPath);
115bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, SkRegion::kIntersect_Op == clip->fOp);
116bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, *clip->fRect == answer);
117bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    // now check that we only had one in our iterator
118bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    REPORTER_ASSERT(reporter, !iter.next());
119bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
120bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    stack.reset();
121bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com    assert_count(reporter, stack, 0);
1221e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org
1231e1c36f4f89ad39e1d248edb745919e493242c68vandebo@chromium.org    test_assign_and_comparison(reporter);
124bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com}
125bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com
126bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.com#include "TestClassDef.h"
127bdee9fc778d4387d805d717f2cd7fc7074991fdbreed@google.comDEFINE_TESTCLASS("ClipStack", TestClipStackClass, TestClipStack)
128