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 SkDQuad 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
2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkDCubic 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) {
4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        const SkDQuad& quad = quadTests[index];
498d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com        SkASSERT(ValidQuad(quad));
5054359294a7c9dc54802d512a5d891a35c1663392caryclark        setRawBounds(quad, &rect);
5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.setBounds(quad);
5254359294a7c9dc54802d512a5d891a35c1663392caryclark        REPORTER_ASSERT(reporter, rect.intersects(rect2));
5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
5407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(leftTop));
5607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
5707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(rightBottom));
5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    for (index = 0; index < cubicTests_count; ++index) {
6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        const SkDCubic& cubic = cubicTests[index];
618d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com        SkASSERT(ValidCubic(cubic));
6254359294a7c9dc54802d512a5d891a35c1663392caryclark        setRawBounds(cubic, &rect);
6307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.setBounds(cubic);
6454359294a7c9dc54802d512a5d891a35c1663392caryclark        REPORTER_ASSERT(reporter, rect.intersects(rect2));
6507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
6607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
6707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(leftTop));
6807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(rightBottom));
7007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
7107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
72