| /* |
| * 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)); |
| } |
| } |