11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "Test.h" 905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "SkClipStack.h" 1035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#include "SkPath.h" 1135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#include "SkRect.h" 1235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 1335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstatic void test_assign_and_comparison(skiatest::Reporter* reporter) { 1435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkClipStack s; 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool doAA = false; 1635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 1735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Build up a clip stack with a path, an empty clip, and a rect. 1835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 1935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkPath p; 2035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger p.moveTo(5, 6); 2135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger p.lineTo(7, 8); 2235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger p.lineTo(5, 9); 2335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger p.close(); 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevPath(p, SkRegion::kIntersect_Op, doAA); 2535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 2635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 2735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkRect r = SkRect::MakeLTRB(1, 2, 3, 4); 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevRect(r, SkRegion::kIntersect_Op, doAA); 2935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger r = SkRect::MakeLTRB(10, 11, 12, 13); 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevRect(r, SkRegion::kIntersect_Op, doAA); 3135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 3235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger r = SkRect::MakeLTRB(14, 15, 16, 17); 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevRect(r, SkRegion::kUnion_Op, doAA); 3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 3635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Test that assignment works. 3735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkClipStack copy = s; 3835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s == copy); 3935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 4035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Test that different save levels triggers not equal. 4135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.restore(); 4235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s != copy); 4335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 4435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Test that an equal, but not copied version is equal. 4535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 4635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger r = SkRect::MakeLTRB(14, 15, 16, 17); 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevRect(r, SkRegion::kUnion_Op, doAA); 4835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s == copy); 4935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 5035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Test that a different op on one level triggers not equal. 5135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.restore(); 5235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 5335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger r = SkRect::MakeLTRB(14, 15, 16, 17); 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevRect(r, SkRegion::kIntersect_Op, doAA); 5535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s != copy); 5635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 5735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Test that different state (clip type) triggers not equal. 5835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.restore(); 5935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 6035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger SkPath rp; 6135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger rp.addRect(r); 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevPath(rp, SkRegion::kUnion_Op, doAA); 6335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s != copy); 6435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 6535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Test that different rects triggers not equal. 6635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.restore(); 6735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 6835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger r = SkRect::MakeLTRB(24, 25, 26, 27); 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevRect(r, SkRegion::kUnion_Op, doAA); 7035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s != copy); 7135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 7235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Sanity check 7335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.restore(); 7435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger copy.restore(); 7535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s == copy); 7635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.restore(); 7735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger copy.restore(); 7835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s == copy); 7935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 8035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger // Test that different paths triggers not equal. 8135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.restore(); 8235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger s.save(); 8335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger p.addRect(r); 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger s.clipDevPath(p, SkRegion::kIntersect_Op, doAA); 8535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger REPORTER_ASSERT(reporter, s != copy); 8635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger} 8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void assert_count(skiatest::Reporter* reporter, const SkClipStack& stack, 8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int count) { 9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, count == stack.getSaveCount()); 9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 9205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger SkClipStack::B2FIter iter(stack); 9305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int counter = 0; 9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger while (iter.next()) { 9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger counter += 1; 9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger } 9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, count == counter); 9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger} 9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic void TestClipStack(skiatest::Reporter* reporter) { 10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger SkClipStack stack; 10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger assert_count(reporter, stack, 0); 10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger static const SkIRect gRects[] = { 10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger { 0, 0, 100, 100 }, 10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger { 25, 25, 125, 125 }, 10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger { 0, 0, 1000, 1000 }, 10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger { 0, 0, 75, 75 } 11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger }; 11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gRects); i++) { 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger stack.clipDevRect(gRects[i], SkRegion::kIntersect_Op); 11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger } 11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 11505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // all of the above rects should have been intersected, leaving only 1 rect 11605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger SkClipStack::B2FIter iter(stack); 11705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const SkClipStack::B2FIter::Clip* clip = iter.next(); 1180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger SkRect answer; 1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger answer.iset(25, 25, 75, 75); 12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 12105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, clip); 12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, clip->fRect); 12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, !clip->fPath); 12405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, SkRegion::kIntersect_Op == clip->fOp); 12505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, *clip->fRect == answer); 12605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // now check that we only had one in our iterator 12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger REPORTER_ASSERT(reporter, !iter.next()); 12805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 12905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger stack.reset(); 13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger assert_count(reporter, stack, 0); 13135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger 13235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger test_assign_and_comparison(reporter); 13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger} 13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "TestClassDef.h" 13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek SollenbergerDEFINE_TESTCLASS("ClipStack", TestClipStackClass, TestClipStack) 137