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