PathOpsDRectTest.cpp revision 78e7b4e1b928fa69f672be3c743df6d6c3ecbced
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"
1378e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.org#include "TestClassDef.h"
1407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkDLine lineTests[] = {
1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{2, 1}, {2, 1}}},
1707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{2, 1}, {1, 1}}},
1807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{2, 1}, {2, 2}}},
1907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{1, 1}, {2, 2}}},
2007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{3, 0}, {2, 1}}},
2107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{3, 2}, {1, 1}}},
2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkDQuad quadTests[] = {
2507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{1, 1}, {2, 1}, {0, 2}}},
2607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{0, 0}, {1, 1}, {3, 1}}},
2707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{2, 0}, {1, 1}, {2, 2}}},
2807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{4, 0}, {0, 1}, {4, 2}}},
2907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{0, 0}, {0, 1}, {1, 1}}},
3007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
3207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic const SkDCubic cubicTests[] = {
3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{2, 0}, {3, 1}, {2, 2}, {1, 1}}},
3407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{3, 1}, {2, 2}, {1, 1}, {2, 0}}},
3507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    {{{3, 0}, {2, 1}, {3, 2}, {1, 1}}},
3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
3707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
38ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t lineTests_count = SK_ARRAY_COUNT(lineTests);
39ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t quadTests_count = SK_ARRAY_COUNT(quadTests);
40ad65a3e5fb1f94699f183551b828efbcc6a133cecaryclark@google.comstatic const size_t cubicTests_count = SK_ARRAY_COUNT(cubicTests);
4107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
4278e7b4e1b928fa69f672be3c743df6d6c3ecbcedtfarina@chromium.orgDEF_TEST(PathOpsDRect, reporter) {
4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    size_t index;
4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    SkDRect rect, rect2;
4507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    for (index = 0; index < lineTests_count; ++index) {
4607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        const SkDLine& line = lineTests[index];
478d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com        SkASSERT(ValidLine(line));
4807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect.setBounds(line);
493b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fLeft == SkTMin(line[0].fX, line[1].fX));
503b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fTop == SkTMin(line[0].fY, line[1].fY));
513b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fRight == SkTMax(line[0].fX, line[1].fX));
523b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fBottom == SkTMax(line[0].fY, line[1].fY));
5307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.set(line[0]);
5407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.add(line[1]);
553b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect2.fLeft == SkTMin(line[0].fX, line[1].fX));
563b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect2.fTop == SkTMin(line[0].fY, line[1].fY));
573b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect2.fRight == SkTMax(line[0].fX, line[1].fX));
583b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect2.fBottom == SkTMax(line[0].fY, line[1].fY));
5907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(line[0]));
6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.intersects(&rect2));
6107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
6207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    for (index = 0; index < quadTests_count; ++index) {
6307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        const SkDQuad& quad = quadTests[index];
648d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com        SkASSERT(ValidQuad(quad));
6507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect.setRawBounds(quad);
663b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fLeft == SkTMin(quad[0].fX,
673b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMin(quad[1].fX, quad[2].fX)));
683b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fTop == SkTMin(quad[0].fY,
693b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMin(quad[1].fY, quad[2].fY)));
703b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fRight == SkTMax(quad[0].fX,
713b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMax(quad[1].fX, quad[2].fX)));
723b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fBottom == SkTMax(quad[0].fY,
733b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMax(quad[1].fY, quad[2].fY)));
7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.setBounds(quad);
7507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.intersects(&rect2));
7607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
7707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
7807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(leftTop));
7907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
8007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(rightBottom));
8107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
8207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    for (index = 0; index < cubicTests_count; ++index) {
8307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        const SkDCubic& cubic = cubicTests[index];
848d0a524a4847bc7e1cc63a93b78922739466c201caryclark@google.com        SkASSERT(ValidCubic(cubic));
8507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect.setRawBounds(cubic);
863b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fLeft == SkTMin(cubic[0].fX,
873b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMin(cubic[1].fX, SkTMin(cubic[2].fX, cubic[3].fX))));
883b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fTop == SkTMin(cubic[0].fY,
893b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMin(cubic[1].fY, SkTMin(cubic[2].fY, cubic[3].fY))));
903b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fRight == SkTMax(cubic[0].fX,
913b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMax(cubic[1].fX, SkTMax(cubic[2].fX, cubic[3].fX))));
923b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com        REPORTER_ASSERT(reporter, rect.fBottom == SkTMax(cubic[0].fY,
933b97af5add04489d57c7926ba6dc6f0013daf40fcaryclark@google.com                SkTMax(cubic[1].fY, SkTMax(cubic[2].fY, cubic[3].fY))));
9407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        rect2.setBounds(cubic);
9507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.intersects(&rect2));
9607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        // FIXME: add a recursive box subdivision method to verify that tight bounds is correct
9707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint leftTop = {rect2.fLeft, rect2.fTop};
9807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(leftTop));
9907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        SkDPoint rightBottom = {rect2.fRight, rect2.fBottom};
10007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        REPORTER_ASSERT(reporter, rect.contains(rightBottom));
10107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
10207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
103