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" 9aec251012542e971100e218bf463adbfb5d21d20caryclark#include "SkPathOpsCurve.h" 1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "Test.h" 1107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 1207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkRect sectTests[][2] = { 1307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {4, 0, 6, 1}}, 1407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 0, 5, 1}}, 1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 0, 5, 0}}, 1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 1, 5, 2}}, 1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 1, 4, 2}, {1, 0, 5, 3}}, 1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 1, 5, 3}, {3, 1, 4, 2}}, 1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 0, 3, 0}}, // intersecting an empty bounds is OK 2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {4, 1, 5, 2}}, // touching just on a corner is OK 2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 23ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t sectTestsCount = SK_ARRAY_COUNT(sectTests); 2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 2507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkRect noSectTests[][2] = { 2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {5, 0, 6, 1}}, 2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{2, 0, 4, 1}, {3, 2, 5, 2}}, 2807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 2907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 30ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t noSectTestsCount = SK_ARRAY_COUNT(noSectTests); 3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 3278e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.orgDEF_TEST(PathOpsBounds, reporter) { 3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (size_t index = 0; index < sectTestsCount; ++index) { 3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds1 = static_cast<const SkPathOpsBounds&>(sectTests[index][0]); 358d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds1)); 3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds2 = static_cast<const SkPathOpsBounds&>(sectTests[index][1]); 378d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds2)); 3807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bool touches = SkPathOpsBounds::Intersects(bounds1, bounds2); 3907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, touches); 4007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 4107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (size_t index = 0; index < noSectTestsCount; ++index) { 4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds1 = static_cast<const SkPathOpsBounds&>(noSectTests[index][0]); 438d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds1)); 4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPathOpsBounds& bounds2 = static_cast<const SkPathOpsBounds&>(noSectTests[index][1]); 458d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidBounds(bounds2)); 4607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bool touches = SkPathOpsBounds::Intersects(bounds1, bounds2); 4707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, !touches); 4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 4907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPathOpsBounds bounds; 5007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setEmpty(); 5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.add(1, 2, 3, 4); 5207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPathOpsBounds expected; 5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com expected.set(0, 0, 3, 4); 5407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.setEmpty(); 5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkPathOpsBounds ordinal; 5707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com ordinal.set(1, 2, 3, 4); 5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.add(ordinal); 5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 60624637cc8ec22c000409704d0b403ac1b81ad4b0caryclark bounds.setEmpty(); 61aec251012542e971100e218bf463adbfb5d21d20caryclark SkDPoint botRight = {3, 4}; 6207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com bounds.add(botRight); 6307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 6407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkPoint curvePts[] = {{0, 0}, {1, 2}, {3, 4}, {5, 6}}; 65aec251012542e971100e218bf463adbfb5d21d20caryclark SkDCurve curve; 66aec251012542e971100e218bf463adbfb5d21d20caryclark curve.fQuad.set(curvePts); 67aec251012542e971100e218bf463adbfb5d21d20caryclark curve.setQuadBounds(curvePts, 1, 0, 1, &bounds); 6807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com expected.set(0, 0, 3, 4); 6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 70aec251012542e971100e218bf463adbfb5d21d20caryclark curve.fCubic.set(curvePts); 71aec251012542e971100e218bf463adbfb5d21d20caryclark curve.setCubicBounds(curvePts, 1, 0, 1, &bounds); 7207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com expected.set(0, 0, 5, 6); 7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, bounds == expected); 7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 75