107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* 207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2013 Google Inc. 307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * 407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be 507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * found in the LICENSE file. 607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com */ 78d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com#include "PathOpsTestCommon.h" 807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsBounds.h" 907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "Test.h" 1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 1107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkRect sectTests[][2] = { 1207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {4, 0, 6, 1}}, 1307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 0, 5, 1}}, 1407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 0, 5, 0}}, 1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 1, 5, 2}}, 1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 1, 4, 2}, {1, 0, 5, 3}}, 1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 1, 5, 3}, {3, 1, 4, 2}}, 1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 0, 3, 0}}, // intersecting an empty bounds is OK 1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {4, 1, 5, 2}}, // touching just on a corner is OK 2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 22ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t sectTestsCount = SK_ARRAY_COUNT(sectTests); 2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkRect noSectTests[][2] = { 2507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {5, 0, 6, 1}}, 2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 2, 5, 2}}, 2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 2807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 29ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t noSectTestsCount = SK_ARRAY_COUNT(noSectTests); 3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkRect reallyEmpty[] = { 3207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {0, 0, 0, 0}, 3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {1, 1, 1, 0}, 3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {1, 1, 0, 1}, 3507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {1, 1, 0, 0}, 3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {1, 2, 3, SK_ScalarNaN}, 3707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 3807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 39ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t emptyTestsCount = SK_ARRAY_COUNT(reallyEmpty); 4007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 4107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkRect notReallyEmpty[] = { 4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {0, 0, 1, 0}, 4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {0, 0, 0, 1}, 4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {0, 0, 1, 1}, 4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 4607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 47ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t notEmptyTestsCount = SK_ARRAY_COUNT(notReallyEmpty); 4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 4978e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.orgDEF_TEST(PathOpsBounds, reporter) { 5007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (size_t index = 0; index < sectTestsCount; ++index) { 5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds1 = static_cast<const SkPathOpsBounds&>(sectTests[index][0]); 528d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds1)); 5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds2 = static_cast<const SkPathOpsBounds&>(sectTests[index][1]); 548d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds2)); 5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bool touches = SkPathOpsBounds::Intersects(bounds1, bounds2); 5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, touches); 5707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (size_t index = 0; index < noSectTestsCount; ++index) { 5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds1 = static_cast<const SkPathOpsBounds&>(noSectTests[index][0]); 608d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds1)); 6107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds2 = static_cast<const SkPathOpsBounds&>(noSectTests[index][1]); 628d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds2)); 6307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bool touches = SkPathOpsBounds::Intersects(bounds1, bounds2); 6407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, !touches); 6507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 6607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPathOpsBounds bounds; 6707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setEmpty(); 6807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.add(1, 2, 3, 4); 6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPathOpsBounds expected; 7007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com expected.set(0, 0, 3, 4); 7107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 7207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setEmpty(); 7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPathOpsBounds ordinal; 7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com ordinal.set(1, 2, 3, 4); 7507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.add(ordinal); 7607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 7707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPoint topLeft = {0, 0}; 7807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setPointBounds(topLeft); 7907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPoint botRight = {3, 4}; 8007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.add(botRight); 8107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 8207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (size_t index = 0; index < emptyTestsCount; ++index) { 8307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds = static_cast<const SkPathOpsBounds&>(reallyEmpty[index]); 848d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com // SkASSERT(ValidBounds(bounds)); // don't check because test may contain nan 8507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bool empty = bounds.isReallyEmpty(); 8607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, empty); 8707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 8807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (size_t index = 0; index < notEmptyTestsCount; ++index) { 8907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds = static_cast<const SkPathOpsBounds&>(notReallyEmpty[index]); 908d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds)); 9107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bool empty = bounds.isReallyEmpty(); 9207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, !empty); 9307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 9407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPoint curvePts[] = {{0, 0}, {1, 2}, {3, 4}, {5, 6}}; 9507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setLineBounds(curvePts); 9607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com expected.set(0, 0, 1, 2); 9707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 9807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com (bounds.*SetCurveBounds[1])(curvePts); 9907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 10007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setQuadBounds(curvePts); 10107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com expected.set(0, 0, 3, 4); 10207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 10307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com (bounds.*SetCurveBounds[2])(curvePts); 10407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 10507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setCubicBounds(curvePts); 10607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com expected.set(0, 0, 5, 6); 10707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 10807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com (bounds.*SetCurveBounds[3])(curvePts); 10907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 11007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 111