18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Redistribution and use in source and binary forms, with or without
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * modification, are permitted provided that the following conditions
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * are met:
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 1. Redistributions of source code must retain the above
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *    copyright notice, this list of conditions and the following
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *    disclaimer.
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 2. Redistributions in binary form must reproduce the above
127fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *    copyright notice, this list of conditions and the following
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *    disclaimer in the documentation and/or other materials
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *    provided with the distribution.
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
167fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
217fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
227fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
257fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
267fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
277fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * OF THE POSSIBILITY OF SUCH DAMAGE.
287fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com */
297fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
305596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#include "config.h"
317fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
325596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#include "platform/geometry/FloatPolygon.h"
337fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
345596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org#include <gtest/gtest.h>
355596a69e9f7884e3042bceba071c468dee52aa7fvollick@chromium.org
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comnamespace blink {
377fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass FloatPolygonTestValue {
397fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.compublic:
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    FloatPolygonTestValue(const float* coordinates, unsigned coordinatesLength, WindRule fillRule)
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    {
427fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        ASSERT(!(coordinatesLength % 2));
437fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        OwnPtr<Vector<FloatPoint> > vertices = adoptPtr(new Vector<FloatPoint>(coordinatesLength / 2));
447fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        for (unsigned i = 0; i < coordinatesLength; i += 2)
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            (*vertices)[i / 2] = FloatPoint(coordinates[i], coordinates[i + 1]);
467fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        m_polygon = adoptPtr(new FloatPolygon(vertices.release(), fillRule));
477fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    }
487fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const FloatPolygon& polygon() const { return *m_polygon; }
507fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
517fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.comprivate:
527fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    OwnPtr<FloatPolygon> m_polygon;
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5504423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com} // namespace blink
567fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
577fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.comnamespace {
587fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
597fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.comusing namespace blink;
607fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
6104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.comstatic bool compareEdgeIndex(const FloatPolygonEdge* edge1, const FloatPolygonEdge* edge2)
6204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com{
635ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com    return edge1->edgeIndex() < edge2->edgeIndex();
647fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com}
657fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
667fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.comstatic Vector<const FloatPolygonEdge*> sortedOverlappingEdges(const FloatPolygon& polygon, float minY, float maxY)
677fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com{
687fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    Vector<const FloatPolygonEdge*> result;
695ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com    polygon.overlappingEdges(minY, maxY, result);
705ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com    std::sort(result.begin(), result.end(), compareEdgeIndex);
71cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com    return result;
727fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com}
73cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com
74cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#define SIZEOF_ARRAY(p) (sizeof(p) / sizeof(p[0]))
7504423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com
7604423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com/**
7704423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com * Checks a right triangle. This test covers all of the trivial FloatPolygon accessors.
7804423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com *
7904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com *                        200,100
8004423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com *                          /|
8104423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com *                         / |
8204423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com *                        /  |
837fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *                       -----
847fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *                 100,200   200,200
857fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com */
867fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.comTEST(FloatPolygonTest, basics)
877fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com{
887fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const float triangleCoordinates[] = {200, 100, 200, 200, 100, 200};
8904423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    FloatPolygonTestValue triangleTestValue(triangleCoordinates, SIZEOF_ARRAY(triangleCoordinates), RULE_NONZERO);
9004423805455de868b1b468cfe4057cb77f74b6b0bsalomon@google.com    const FloatPolygon& triangle = triangleTestValue.polygon();
91fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com
927fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(RULE_NONZERO, triangle.fillRule());
93fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com    EXPECT_FALSE(triangle.isEmpty());
947fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
95fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com    EXPECT_EQ(3u, triangle.numberOfVertices());
96fffb2f1bda1982d451bc249743b8cc414995d6a8justinlin@google.com    EXPECT_EQ(FloatPoint(200, 100), triangle.vertexAt(0));
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(FloatPoint(200, 200), triangle.vertexAt(1));
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(FloatPoint(100, 200), triangle.vertexAt(2));
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1007fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(3u, triangle.numberOfEdges());
1017fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatPoint(200, 100), triangle.edgeAt(0).vertex1());
1027fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatPoint(200, 200), triangle.edgeAt(0).vertex2());
1037fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatPoint(200, 200), triangle.edgeAt(1).vertex1());
1047fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatPoint(100, 200), triangle.edgeAt(1).vertex2());
1057fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatPoint(100, 200), triangle.edgeAt(2).vertex1());
1067fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatPoint(200, 100), triangle.edgeAt(2).vertex2());
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(0u, triangle.edgeAt(0).vertexIndex1());
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(1u, triangle.edgeAt(0).vertexIndex2());
1107fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(1u, triangle.edgeAt(1).vertexIndex1());
1117fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(2u, triangle.edgeAt(1).vertexIndex2());
1127fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(2u, triangle.edgeAt(2).vertexIndex1());
1137fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(0u, triangle.edgeAt(2).vertexIndex2());
1147fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(200, triangle.edgeAt(0).minX());
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(200, triangle.edgeAt(0).maxX());
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(100, triangle.edgeAt(1).minX());
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(200, triangle.edgeAt(1).maxX());
1197fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(100, triangle.edgeAt(2).minX());
1207fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(200, triangle.edgeAt(2).maxX());
1217fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1227fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(100, triangle.edgeAt(0).minY());
1237fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(200, triangle.edgeAt(0).maxY());
1244e23068b374023d43c4c725138d523721d975892bsalomon@google.com    EXPECT_EQ(200, triangle.edgeAt(1).minY());
1257fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(200, triangle.edgeAt(1).maxY());
1262ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.org    EXPECT_EQ(100, triangle.edgeAt(2).minY());
1272ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.org    EXPECT_EQ(200, triangle.edgeAt(2).maxY());
1282ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.org
1297fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(0u, triangle.edgeAt(0).edgeIndex());
1307fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(1u, triangle.edgeAt(1).edgeIndex());
1317fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(2u, triangle.edgeAt(2).edgeIndex());
1324e23068b374023d43c4c725138d523721d975892bsalomon@google.com
1334e23068b374023d43c4c725138d523721d975892bsalomon@google.com    EXPECT_EQ(2u, triangle.edgeAt(0).previousEdge().edgeIndex());
1344e23068b374023d43c4c725138d523721d975892bsalomon@google.com    EXPECT_EQ(1u, triangle.edgeAt(0).nextEdge().edgeIndex());
1354e23068b374023d43c4c725138d523721d975892bsalomon@google.com    EXPECT_EQ(0u, triangle.edgeAt(1).previousEdge().edgeIndex());
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_EQ(2u, triangle.edgeAt(1).nextEdge().edgeIndex());
1377fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(1u, triangle.edgeAt(2).previousEdge().edgeIndex());
1387fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(0u, triangle.edgeAt(2).nextEdge().edgeIndex());
1397fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1407fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatRect(100, 100, 100, 100), triangle.boundingBox());
1417fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1427fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    Vector<const FloatPolygonEdge*> resultA = sortedOverlappingEdges(triangle, 100, 200);
1437fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(3u, resultA.size());
1447fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    if (resultA.size() == 3) {
1457fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(0u, resultA[0]->edgeIndex());
1467fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(1u, resultA[1]->edgeIndex());
1477fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(2u, resultA[2]->edgeIndex());
1487fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    }
1497fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1507fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    Vector<const FloatPolygonEdge*> resultB = sortedOverlappingEdges(triangle, 200, 200);
1517fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(3u, resultB.size());
1527fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    if (resultB.size() == 3) {
1537fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(0u, resultB[0]->edgeIndex());
1547fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(1u, resultB[1]->edgeIndex());
1557fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(2u, resultB[2]->edgeIndex());
1567fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    }
1577fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1587fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    Vector<const FloatPolygonEdge*> resultC = sortedOverlappingEdges(triangle, 100, 150);
1597fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(2u, resultC.size());
1607fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    if (resultC.size() == 2) {
1617fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(0u, resultC[0]->edgeIndex());
1627fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com        EXPECT_EQ(2u, resultC[1]->edgeIndex());
1637fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    }
1647fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1657fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    Vector<const FloatPolygonEdge*> resultD = sortedOverlappingEdges(triangle, 201, 300);
1667fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(0u, resultD.size());
1677fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Vector<const FloatPolygonEdge*> resultE = sortedOverlappingEdges(triangle, 98, 99);
1697fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(0u, resultE.size());
1707fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com}
1717fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1727fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com/**
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Tests FloatPolygon::contains() with a right triangle, and fillRule = nonzero.
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
1757fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *                        200,100
1767fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *                          /|
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *                         / |
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *                        /  |
1797fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *                       -----
18027661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com *                 100,200   200,200
18127661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com */
18227661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.comTEST(FloatPolygonTest, triangle_nonzero)
18327661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com{
18427661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com    const float triangleCoordinates[] = {200, 100, 200, 200, 100, 200};
1857fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    FloatPolygonTestValue triangleTestValue(triangleCoordinates, SIZEOF_ARRAY(triangleCoordinates), RULE_NONZERO);
1867fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const FloatPolygon& triangle = triangleTestValue.polygon();
1877fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
1887fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(RULE_NONZERO, triangle.fillRule());
1897fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(triangle.contains(FloatPoint(200, 100)));
1907fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(triangle.contains(FloatPoint(200, 200)));
1917fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(triangle.contains(FloatPoint(100, 200)));
1927fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(triangle.contains(FloatPoint(150, 150)));
1937fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(triangle.contains(FloatPoint(100, 100)));
1947fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(triangle.contains(FloatPoint(149, 149)));
1957fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(triangle.contains(FloatPoint(150, 200.5)));
19627661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com    EXPECT_FALSE(triangle.contains(FloatPoint(201, 200.5)));
19727661181d757145d98f2dc3e02b88ee3fffce9e5bsalomon@google.com}
198e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org
1992b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com/**
2002b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com * Tests FloatPolygon::contains() with a right triangle, and fillRule = evenodd;
2012b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com *
2022b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com *                        200,100
2032b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com *                          /|
2042b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com *                         / |
2052b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com *                        /  |
2062b343cc2557aa7921fa8b04bf6800ebf37af186bdjsollen@google.com *                       -----
207e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org *                 100,200   200,200
208e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org */
209e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.orgTEST(FloatPolygonTest, triangle_evenodd)
210e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org{
211e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    const float triangleCoordinates[] = {200, 100, 200, 200, 100, 200};
212e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    FloatPolygonTestValue triangleTestValue(triangleCoordinates, SIZEOF_ARRAY(triangleCoordinates), RULE_EVENODD);
213e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    const FloatPolygon& triangle = triangleTestValue.polygon();
214e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org
2157fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(RULE_EVENODD, triangle.fillRule());
216e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    EXPECT_TRUE(triangle.contains(FloatPoint(200, 100)));
217e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    EXPECT_TRUE(triangle.contains(FloatPoint(200, 200)));
218e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    EXPECT_TRUE(triangle.contains(FloatPoint(100, 200)));
219e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    EXPECT_TRUE(triangle.contains(FloatPoint(150, 150)));
220e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    EXPECT_FALSE(triangle.contains(FloatPoint(100, 100)));
2217fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(triangle.contains(FloatPoint(149, 149)));
222e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    EXPECT_FALSE(triangle.contains(FloatPoint(150, 200.5)));
223e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org    EXPECT_FALSE(triangle.contains(FloatPoint(201, 200.5)));
224e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org}
225e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org
226e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org#define TEST_EMPTY(coordinates)                                                                        \
227e4657ed7e1f4ae5b1834b398724c718f21589ca3commit-bot@chromium.org{                                                                                                      \
2285c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    FloatPolygonTestValue emptyPolygonTestValue(coordinates, SIZEOF_ARRAY(coordinates), RULE_NONZERO); \
2295c80ea17d4e4a795bfaeb260fc27e952ba471f1dreed@android.com    const FloatPolygon& emptyPolygon = emptyPolygonTestValue.polygon();                                \
23001c41a556e0ef0ae2338a1b5ae110a501e1ed0a8reed@google.com    EXPECT_TRUE(emptyPolygon.isEmpty());                                                               \
23101c41a556e0ef0ae2338a1b5ae110a501e1ed0a8reed@google.com}
23201c41a556e0ef0ae2338a1b5ae110a501e1ed0a8reed@google.com
23301c41a556e0ef0ae2338a1b5ae110a501e1ed0a8reed@google.comTEST(FloatPolygonTest, emptyPolygons)
2340e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com{
2357fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const float emptyCoordinates1[] = {0, 0};
23601c41a556e0ef0ae2338a1b5ae110a501e1ed0a8reed@google.com    TEST_EMPTY(emptyCoordinates1);
2377fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2380e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com    const float emptyCoordinates2[] = {0, 0, 1, 1};
2390e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com    TEST_EMPTY(emptyCoordinates2);
2400e6e8cc627242cc7e301401cfe112ba98a008101robertphillips@google.com
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const float emptyCoordinates3[] = {0, 0, 1, 1, 2, 2, 3, 3};
2427fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    TEST_EMPTY(emptyCoordinates3);
2437fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const float emptyCoordinates4[] = {0, 0, 1, 1, 2, 2, 3, 3, 1, 1};
2457fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    TEST_EMPTY(emptyCoordinates4);
2467fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const float emptyCoordinates5[] = {0, 0, 0, 1, 0, 2, 0, 3, 0, 1};
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    TEST_EMPTY(emptyCoordinates5);
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2507fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const float emptyCoordinates6[] = {0, 0, 1, 0, 2, 0, 3, 0, 1, 0};
2517fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    TEST_EMPTY(emptyCoordinates6);
2527fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com}
2537fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2547fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com/*
2557fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * Test FloatPolygon::contains() with a trapezoid. The vertices are listed in counter-clockwise order.
2567fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *
2577fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *        150,100   250,100
2587fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *          +----------+
2597fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *         /            \
2607fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *        /              \
2617fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *       +----------------+
2627fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *     100,150          300,150
2637fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com */
2647fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.comTEST(FloatPolygonTest, trapezoid)
2657fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com{
2667fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const float trapezoidCoordinates[] = {100, 150, 300, 150, 250, 100, 150, 100};
2677fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    FloatPolygonTestValue trapezoidTestValue(trapezoidCoordinates, SIZEOF_ARRAY(trapezoidCoordinates), RULE_EVENODD);
2687fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const FloatPolygon& trapezoid = trapezoidTestValue.polygon();
2697fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2707fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(trapezoid.isEmpty());
2717fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(4u, trapezoid.numberOfVertices());
2727fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatRect(100, 100, 200, 50), trapezoid.boundingBox());
2737fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2747fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(trapezoid.contains(FloatPoint(150, 100)));
2757fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(trapezoid.contains(FloatPoint(150, 101)));
2767fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(trapezoid.contains(FloatPoint(200, 125)));
2777fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(trapezoid.contains(FloatPoint(149, 100)));
2787fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(trapezoid.contains(FloatPoint(301, 150)));
2797fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com}
2807fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2817fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
2827fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com/*
2837fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * Test FloatPolygon::contains() with a non-convex rectilinear polygon. The polygon has the same shape
2847fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com * as the letter "H":
2857fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *
2867fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *    100,100  150,100   200,100   250,100
2877fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *       +--------+        +--------+
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *       |        |        |        |
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *       |        |        |        |
2901341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com *       |        +--------+        |
2911341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com *       |     150,150   200,150    |
2921341304449a60713bf9c8ea2e9489f35533f037atomhudson@google.com *       |                          |
2937fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *       |     150,200   200,200    |
2947fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *       |        +--------+        |
2957fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *       |        |        |        |
2967fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *       |        |        |        |
2977fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *       +--------+        +--------+
2987fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com *    100,250  150,250   200,250   250,250
2997fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com */
3007fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.comTEST(FloatPolygonTest, rectilinear)
3017fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com{
3027fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const float hCoordinates[] = {100, 100, 150, 100, 150, 150, 200, 150, 200, 100, 250, 100, 250, 250, 200, 250, 200, 200, 150, 200, 150, 250, 100, 250};
3037fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    FloatPolygonTestValue hTestValue(hCoordinates, SIZEOF_ARRAY(hCoordinates), RULE_NONZERO);
3047fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    const FloatPolygon& h = hTestValue.polygon();
3057fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
3067fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.isEmpty());
3077fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(12u, h.numberOfVertices());
3087fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_EQ(FloatRect(100, 100, 150, 150), h.boundingBox());
3097fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com
3107fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(h.contains(FloatPoint(100, 100)));
3118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_TRUE(h.contains(FloatPoint(125, 100)));
3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    EXPECT_TRUE(h.contains(FloatPoint(125, 125)));
313d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com    EXPECT_TRUE(h.contains(FloatPoint(150, 100)));
314d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com    EXPECT_TRUE(h.contains(FloatPoint(200, 200)));
3155ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com    EXPECT_TRUE(h.contains(FloatPoint(225, 225)));
3167fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_TRUE(h.contains(FloatPoint(250, 250)));
3175ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com    EXPECT_TRUE(h.contains(FloatPoint(100, 250)));
3185ebbbe53779cfe93741dc66f433107d04da74486bungeman@google.com    EXPECT_TRUE(h.contains(FloatPoint(125, 250)));
3194469938e92d779dff05e745559e67907bbf21e78reed@google.com
3207fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.contains(FloatPoint(99, 100)));
3217fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.contains(FloatPoint(251, 100)));
3224469938e92d779dff05e745559e67907bbf21e78reed@google.com    EXPECT_FALSE(h.contains(FloatPoint(151, 100)));
3234469938e92d779dff05e745559e67907bbf21e78reed@google.com    EXPECT_FALSE(h.contains(FloatPoint(199, 100)));
3247fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.contains(FloatPoint(175, 125)));
3257fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.contains(FloatPoint(151, 250)));
3267fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.contains(FloatPoint(199, 250)));
3277fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.contains(FloatPoint(199, 250)));
3287fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com    EXPECT_FALSE(h.contains(FloatPoint(175, 225)));
3297fd1f50bfb9af23c7c1f7e8450f5a0db67ca5fdcbungeman@google.com}
3301950d5f58f56f6a0fb5dc5aa3f5caac991f0b2cemtklein@google.com
3311950d5f58f56f6a0fb5dc5aa3f5caac991f0b2cemtklein@google.com} // namespace
3321950d5f58f56f6a0fb5dc5aa3f5caac991f0b2cemtklein@google.com