| /* | |
| * Copyright 2012 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "include/core/SkTypes.h" | |
| #include "src/pathops/SkPathOpsCubic.h" | |
| #include "src/pathops/SkPathOpsPoint.h" | |
| #include "src/pathops/SkPathOpsQuad.h" | |
| #include "src/pathops/SkPathOpsRect.h" | |
| #include "tests/PathOpsTestCommon.h" | |
| #include "tests/Test.h" | |
| #include <array> | |
| #include <cstddef> | |
| static const QuadPts quadTests[] = { | |
| {{{1, 1}, {2, 1}, {0, 2}}}, | |
| {{{0, 0}, {1, 1}, {3, 1}}}, | |
| {{{2, 0}, {1, 1}, {2, 2}}}, | |
| {{{4, 0}, {0, 1}, {4, 2}}}, | |
| {{{0, 0}, {0, 1}, {1, 1}}}, | |
| }; | |
| static const CubicPts cubicTests[] = { | |
| {{{2, 0}, {3, 1}, {2, 2}, {1, 1}}}, | |
| {{{3, 1}, {2, 2}, {1, 1}, {2, 0}}}, | |
| {{{3, 0}, {2, 1}, {3, 2}, {1, 1}}}, | |
| }; | |
| static const size_t quadTests_count = std::size(quadTests); | |
| static const size_t cubicTests_count = std::size(cubicTests); | |
| static void setRawBounds(const SkDQuad& quad, SkDRect* rect) { | |
| rect->set(quad[0]); | |
| rect->add(quad[1]); | |
| rect->add(quad[2]); | |
| } | |
| static void setRawBounds(const SkDCubic& cubic, SkDRect* rect) { | |
| rect->set(cubic[0]); | |
| rect->add(cubic[1]); | |
| rect->add(cubic[2]); | |
| rect->add(cubic[3]); | |
| } | |
| DEF_TEST(PathOpsDRect, reporter) { | |
| size_t index; | |
| SkDRect rect, rect2; | |
| for (index = 0; index < quadTests_count; ++index) { | |
| const QuadPts& q = quadTests[index]; | |
| SkDQuad quad; | |
| quad.debugSet(q.fPts); | |
| SkASSERT(ValidQuad(quad)); | |
| setRawBounds(quad, &rect); | |
| rect2.setBounds(quad); | |
| REPORTER_ASSERT(reporter, rect.intersects(rect2)); | |
| // FIXME: add a recursive box subdivision method to verify that tight bounds is correct | |
| SkDPoint leftTop = {rect2.fLeft, rect2.fTop}; | |
| REPORTER_ASSERT(reporter, rect.contains(leftTop)); | |
| SkDPoint rightBottom = {rect2.fRight, rect2.fBottom}; | |
| REPORTER_ASSERT(reporter, rect.contains(rightBottom)); | |
| } | |
| for (index = 0; index < cubicTests_count; ++index) { | |
| const CubicPts& c = cubicTests[index]; | |
| SkDCubic cubic; | |
| cubic.debugSet(c.fPts); | |
| SkASSERT(ValidCubic(cubic)); | |
| setRawBounds(cubic, &rect); | |
| rect2.setBounds(cubic); | |
| REPORTER_ASSERT(reporter, rect.intersects(rect2)); | |
| // FIXME: add a recursive box subdivision method to verify that tight bounds is correct | |
| SkDPoint leftTop = {rect2.fLeft, rect2.fTop}; | |
| REPORTER_ASSERT(reporter, rect.contains(leftTop)); | |
| SkDPoint rightBottom = {rect2.fRight, rect2.fBottom}; | |
| REPORTER_ASSERT(reporter, rect.contains(rightBottom)); | |
| } | |
| } |