PathOpsDRectTest.cpp revision 8d0a524a4847bc7e1cc63a93b78922739466c201
107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/* 207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2012 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 "SkPathOpsCubic.h" 907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsLine.h" 1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsQuad.h" 1107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsRect.h" 1207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "Test.h" 1307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 1407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkDLine lineTests[] = { 1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{2, 1}, {2, 1}}}, 1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{2, 1}, {1, 1}}}, 1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{2, 1}, {2, 2}}}, 1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{1, 1}, {2, 2}}}, 1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{3, 0}, {2, 1}}}, 2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{3, 2}, {1, 1}}}, 2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkDQuad quadTests[] = { 2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{1, 1}, {2, 1}, {0, 2}}}, 2507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{0, 0}, {1, 1}, {3, 1}}}, 2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{2, 0}, {1, 1}, {2, 2}}}, 2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{4, 0}, {0, 1}, {4, 2}}}, 2807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{0, 0}, {0, 1}, {1, 1}}}, 2907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkDCubic cubicTests[] = { 3207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{2, 0}, {3, 1}, {2, 2}, {1, 1}}}, 3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{3, 1}, {2, 2}, {1, 1}, {2, 0}}}, 3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com {{{3, 0}, {2, 1}, {3, 2}, {1, 1}}}, 3507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}; 3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 37ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t lineTests_count = SK_ARRAY_COUNT(lineTests); 38ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t quadTests_count = SK_ARRAY_COUNT(quadTests); 39ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t cubicTests_count = SK_ARRAY_COUNT(cubicTests); 4007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 41ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic void PathOpsDRectTest(skiatest::Reporter* reporter) { 4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com size_t index; 4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDRect rect, rect2; 4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (index = 0; index < lineTests_count; ++index) { 4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkDLine& line = lineTests[index]; 468d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidLine(line)); 4707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com rect.setBounds(line); 483b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fLeft == SkTMin(line[0].fX, line[1].fX)); 493b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fTop == SkTMin(line[0].fY, line[1].fY)); 503b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fRight == SkTMax(line[0].fX, line[1].fX)); 513b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fBottom == SkTMax(line[0].fY, line[1].fY)); 5207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com rect2.set(line[0]); 5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com rect2.add(line[1]); 543b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect2.fLeft == SkTMin(line[0].fX, line[1].fX)); 553b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect2.fTop == SkTMin(line[0].fY, line[1].fY)); 563b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect2.fRight == SkTMax(line[0].fX, line[1].fX)); 573b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect2.fBottom == SkTMax(line[0].fY, line[1].fY)); 5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.contains(line[0])); 5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.intersects(&rect2)); 6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 6107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (index = 0; index < quadTests_count; ++index) { 6207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkDQuad& quad = quadTests[index]; 638d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidQuad(quad)); 6407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com rect.setRawBounds(quad); 653b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fLeft == SkTMin(quad[0].fX, 663b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMin(quad[1].fX, quad[2].fX))); 673b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fTop == SkTMin(quad[0].fY, 683b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMin(quad[1].fY, quad[2].fY))); 693b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fRight == SkTMax(quad[0].fX, 703b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMax(quad[1].fX, quad[2].fX))); 713b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fBottom == SkTMax(quad[0].fY, 723b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMax(quad[1].fY, quad[2].fY))); 7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com rect2.setBounds(quad); 7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.intersects(&rect2)); 7507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com // FIXME: add a recursive box subdivision method to verify that tight bounds is correct 7607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDPoint leftTop = {rect2.fLeft, rect2.fTop}; 7707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.contains(leftTop)); 7807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDPoint rightBottom = {rect2.fRight, rect2.fBottom}; 7907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.contains(rightBottom)); 8007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 8107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com for (index = 0; index < cubicTests_count; ++index) { 8207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com const SkDCubic& cubic = cubicTests[index]; 838d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com SkASSERT(ValidCubic(cubic)); 8407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com rect.setRawBounds(cubic); 853b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fLeft == SkTMin(cubic[0].fX, 863b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMin(cubic[1].fX, SkTMin(cubic[2].fX, cubic[3].fX)))); 873b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fTop == SkTMin(cubic[0].fY, 883b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMin(cubic[1].fY, SkTMin(cubic[2].fY, cubic[3].fY)))); 893b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fRight == SkTMax(cubic[0].fX, 903b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMax(cubic[1].fX, SkTMax(cubic[2].fX, cubic[3].fX)))); 913b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com REPORTER_ASSERT(reporter, rect.fBottom == SkTMax(cubic[0].fY, 923b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com SkTMax(cubic[1].fY, SkTMax(cubic[2].fY, cubic[3].fY)))); 9307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com rect2.setBounds(cubic); 9407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.intersects(&rect2)); 9507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com // FIXME: add a recursive box subdivision method to verify that tight bounds is correct 9607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDPoint leftTop = {rect2.fLeft, rect2.fTop}; 9707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.contains(leftTop)); 9807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com SkDPoint rightBottom = {rect2.fRight, rect2.fBottom}; 9907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com REPORTER_ASSERT(reporter, rect.contains(rightBottom)); 10007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com } 10107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com} 10207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com 10307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "TestClassDef.h" 104ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comDEFINE_TESTCLASS_SHORT(PathOpsDRectTest) 105