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
14a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclarkstatic const QuadPts quadTests[] = {
1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{1, 1}, {2, 1}, {0, 2}}},
1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{0, 0}, {1, 1}, {3, 1}}},
1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{2, 0}, {1, 1}, {2, 2}}},
1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{4, 0}, {0, 1}, {4, 2}}},
1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{0, 0}, {0, 1}, {1, 1}}},
2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
22a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclarkstatic const CubicPts cubicTests[] = {
2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{2, 0}, {3, 1}, {2, 2}, {1, 1}}},
2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{3, 1}, {2, 2}, {1, 1}, {2, 0}}},
2507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{3, 0}, {2, 1}, {3, 2}, {1, 1}}},
2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
28ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t quadTests_count = SK_ARRAY_COUNT(quadTests);
29ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t cubicTests_count = SK_ARRAY_COUNT(cubicTests);
3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3154359294a7c9dc54802d512a5d891a35c1663392caryclarkstatic void setRawBounds(const SkDQuad& quad, SkDRect* rect) {
3254359294a7c9dc54802d512a5d891a35c1663392caryclark    rect->set(quad[0]);
3354359294a7c9dc54802d512a5d891a35c1663392caryclark    rect->add(quad[1]);
3454359294a7c9dc54802d512a5d891a35c1663392caryclark    rect->add(quad[2]);
3554359294a7c9dc54802d512a5d891a35c1663392caryclark}
3654359294a7c9dc54802d512a5d891a35c1663392caryclark
3754359294a7c9dc54802d512a5d891a35c1663392caryclarkstatic void setRawBounds(const SkDCubic& cubic, SkDRect* rect) {
3854359294a7c9dc54802d512a5d891a35c1663392caryclark    rect->set(cubic[0]);
3954359294a7c9dc54802d512a5d891a35c1663392caryclark    rect->add(cubic[1]);
4054359294a7c9dc54802d512a5d891a35c1663392caryclark    rect->add(cubic[2]);
4154359294a7c9dc54802d512a5d891a35c1663392caryclark    rect->add(cubic[3]);
4254359294a7c9dc54802d512a5d891a35c1663392caryclark}
4354359294a7c9dc54802d512a5d891a35c1663392caryclark
4478e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.orgDEF_TEST(PathOpsDRect, reporter) {
4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    size_t index;
4607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    SkDRect rect, rect2;
4707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    for (index = 0; index < quadTests_count; ++index) {
48a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        const QuadPts& q = quadTests[index];
49a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        SkDQuad quad;
50a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        quad.debugSet(q.fPts);
518d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com        SkASSERT(ValidQuad(quad));
5254359294a7c9dc54802d512a5d891a35c1663392caryclark        setRawBounds(quad, &rect);
5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.setBounds(quad);
5454359294a7c9dc54802d512a5d891a35c1663392caryclark        REPORTER_ASSERT(reporter, rect.intersects(rect2));
5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
5707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(leftTop));
5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(rightBottom));
6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
6107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    for (index = 0; index < cubicTests_count; ++index) {
62a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        const CubicPts& c = cubicTests[index];
63a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        SkDCubic cubic;
64a35ab3e6e024d0b548ded26a2e3b8ecd838ead93caryclark        cubic.debugSet(c.fPts);
658d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com        SkASSERT(ValidCubic(cubic));
6654359294a7c9dc54802d512a5d891a35c1663392caryclark        setRawBounds(cubic, &rect);
6707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.setBounds(cubic);
6854359294a7c9dc54802d512a5d891a35c1663392caryclark        REPORTER_ASSERT(reporter, rect.intersects(rect2));
6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
7007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
7107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(leftTop));
7207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(rightBottom));
7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
7507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
76