1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 88cae8358f78b81539f1006afe592a37f1604e67creed@google.com#include "SkCanvas.h" 955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com#include "SkPaint.h" 1004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com#include "SkParse.h" 113e71a887628ff25c806675366b081c70bb10b74dreed@google.com#include "SkParsePath.h" 128f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkPath.h" 138b06f1a7ff6d5a59387a90433064550de20787eereed@google.com#include "SkPathEffect.h" 148f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkRRect.h" 156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org#include "SkRandom.h" 1653effc5e327749ea47bc0c678cb45246644600b0reed@google.com#include "SkReader32.h" 1760bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com#include "SkSize.h" 188cae8358f78b81539f1006afe592a37f1604e67creed@google.com#include "SkSurface.h" 199c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#include "SkTypes.h" 209c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#include "SkWriter32.h" 218f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 228cae8358f78b81539f1006afe592a37f1604e67creed@google.com 234e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void make_path_crbug364224(SkPath* path) { 244e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->reset(); 254e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->moveTo(3.747501373f, 2.724499941f); 264e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.747501373f, 3.75f); 274e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.747501373f, 3.88774991f, 3.635501385f, 4.0f, 3.497501373f, 4.0f); 284e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.7475013733f, 4.0f); 294e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.6095013618f, 4.0f, 0.4975013733f, 3.88774991f, 0.4975013733f, 3.75f); 304e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.4975013733f, 1.0f); 314e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.4975013733f, 0.8622499704f, 0.6095013618f, 0.75f, 0.7475013733f,0.75f); 324e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.497501373f, 0.75f); 334e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.50275135f, 0.75f, 3.5070014f, 0.7527500391f, 3.513001442f, 0.753000021f); 344e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.715001345f, 0.5512499809f); 354e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.648251295f, 0.5194999576f, 3.575501442f, 0.4999999702f, 3.497501373f, 0.4999999702f); 364e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.7475013733f, 0.4999999702f); 374e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.4715013802f, 0.4999999702f, 0.2475013733f, 0.7239999771f, 0.2475013733f, 1.0f); 384e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.2475013733f, 3.75f); 394e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.2475013733f, 4.026000023f, 0.4715013504f, 4.25f, 0.7475013733f, 4.25f); 404e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.497501373f, 4.25f); 414e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.773501396f, 4.25f, 3.997501373f, 4.026000023f, 3.997501373f, 3.75f); 424e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.997501373f, 2.474750042f); 434e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.747501373f, 2.724499941f); 444e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->close(); 454e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 464e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 474e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void make_path_crbug364224_simplified(SkPath* path) { 484e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->moveTo(3.747501373f, 2.724499941f); 494e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.648251295f, 0.5194999576f, 3.575501442f, 0.4999999702f, 3.497501373f, 0.4999999702f); 504e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->close(); 514e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 524e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 534e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void test_path_crbug364224() { 544e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkPath path; 554e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkPaint paint; 564e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(84, 88)); 574e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkCanvas* canvas = surface->getCanvas(); 584e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 594e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org make_path_crbug364224_simplified(&path); 604e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org canvas->drawPath(path, paint); 614e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 624e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org make_path_crbug364224(&path); 634e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org canvas->drawPath(path, paint); 644e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 654e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 66cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void make_path0(SkPath* path) { 67cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com // from * https://code.google.com/p/skia/issues/detail?id=1706 68cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 69cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->moveTo(146.939f, 1012.84f); 70cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(181.747f, 1009.18f); 71cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(182.165f, 1013.16f); 72cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(147.357f, 1016.82f); 73cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(146.939f, 1012.84f); 74cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->close(); 75cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 76cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 77cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void make_path1(SkPath* path) { 78cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->addRect(SkRect::MakeXYWH(10, 10, 10, 1)); 79cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 80cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 81cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comtypedef void (*PathProc)(SkPath*); 82cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 83cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com/* 84cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * Regression test: we used to crash (overwrite internal storage) during 85cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * construction of the region when the path was INVERSE. That is now fixed, 86cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * so test these regions (which used to assert/crash). 87cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * 88cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * https://code.google.com/p/skia/issues/detail?id=1706 89cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com */ 90cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void test_path_to_region(skiatest::Reporter* reporter) { 91cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com PathProc procs[] = { 92cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com make_path0, 93cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com make_path1, 94cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com }; 95472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 96cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkRegion clip; 97cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com clip.setRect(0, 0, 1255, 1925); 98472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 99cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) { 100cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkPath path; 101cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com procs[i](&path); 102472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 103cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkRegion rgn; 104cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com rgn.setPath(path, clip); 105cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path.toggleInverseFillType(); 106cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com rgn.setPath(path, clip); 107cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com } 108cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 109cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 11056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#if defined(WIN32) 11156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com #define SUPPRESS_VISIBILITY_WARNING 11256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#else 11356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com #define SUPPRESS_VISIBILITY_WARNING __attribute__((visibility("hidden"))) 11456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#endif 11556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 1169d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.orgstatic void test_path_close_issue1474(skiatest::Reporter* reporter) { 1179d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // This test checks that r{Line,Quad,Conic,Cubic}To following a close() 1189d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // are relative to the point we close to, not relative to the point we close from. 1199d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org SkPath path; 1209d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org SkPoint last; 1219d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1229d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rLineTo(). 1239d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 1249d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 1259d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); // Returns us back to 0,0. 1269d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(50, 50); // This should go to 50,50. 1279d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1289d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 1299d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 50 == last.fX); 1309d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 50 == last.fY); 1319d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1329d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rQuadTo(). 1339d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 1349d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 1359d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 1369d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 1379d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rQuadTo(50, 50, 75, 75); 1389d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1399d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 1409d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 75 == last.fX); 1419d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 75 == last.fY); 1429d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1439d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rConicTo(). 1449d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 1459d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 1469d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 1479d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 1489d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rConicTo(50, 50, 85, 85, 2); 1499d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1509d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 1519d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 85 == last.fX); 1529d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 85 == last.fY); 1539d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1549d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rCubicTo(). 1559d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 1569d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 1579d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 1589d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 1599d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rCubicTo(50, 50, 85, 85, 95, 95); 1609d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1619d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 1629d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 95 == last.fX); 1639d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 95 == last.fY); 1649d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org} 1659d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1669c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.comstatic void test_android_specific_behavior(skiatest::Reporter* reporter) { 1679c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#ifdef SK_BUILD_FOR_ANDROID 168cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com // Make sure we treat fGenerationID and fSourcePath correctly for each of 169cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com // copy, assign, rewind, reset, and swap. 170cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com SkPath original, source, anotherSource; 171cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com original.setSourcePath(&source); 1729c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com original.moveTo(0, 0); 1739c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com original.lineTo(1, 1); 174cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com REPORTER_ASSERT(reporter, original.getSourcePath() == &source); 1759c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com 176cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com uint32_t copyID, assignID; 177cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com 178cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com // Test copy constructor. Copy generation ID, copy source path. 179cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com SkPath copy(original); 1809c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com REPORTER_ASSERT(reporter, copy.getGenerationID() == original.getGenerationID()); 181cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com REPORTER_ASSERT(reporter, copy.getSourcePath() == original.getSourcePath()); 1829c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com 1831ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org // Test assigment operator. Change generation ID, copy source path. 1849c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com SkPath assign; 185cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com assignID = assign.getGenerationID(); 1869c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com assign = original; 1871ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, assign.getGenerationID() != assignID); 188cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com REPORTER_ASSERT(reporter, assign.getSourcePath() == original.getSourcePath()); 189cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com 1901ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org // Test rewind. Change generation ID, don't touch source path. 191cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com copyID = copy.getGenerationID(); 192cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com copy.rewind(); 1931ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, copy.getGenerationID() != copyID); 194cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com REPORTER_ASSERT(reporter, copy.getSourcePath() == original.getSourcePath()); 195cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com 1961ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org // Test reset. Change generation ID, don't touch source path. 197cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com assignID = assign.getGenerationID(); 198cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com assign.reset(); 1991ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, assign.getGenerationID() != assignID); 200cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com REPORTER_ASSERT(reporter, assign.getSourcePath() == original.getSourcePath()); 201cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com 2021ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org // Test swap. Swap the generation IDs, swap source paths. 2031ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org copy.reset(); 2041ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org copy.moveTo(2, 2); 205cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com copy.setSourcePath(&anotherSource); 206cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com copyID = copy.getGenerationID(); 2071ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org assign.moveTo(3, 3); 208cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com assignID = assign.getGenerationID(); 209cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com copy.swap(assign); 2101ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, copy.getGenerationID() != copyID); 2111ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, assign.getGenerationID() != assignID); 212cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com REPORTER_ASSERT(reporter, copy.getSourcePath() == original.getSourcePath()); 213cb8b0eeacfc2ff79a2b9721e3ef21d1efb507dc8mtklein@google.com REPORTER_ASSERT(reporter, assign.getSourcePath() == &anotherSource); 2149c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#endif 2159c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com} 2169c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com 2171ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.orgstatic void test_gen_id(skiatest::Reporter* reporter) { 2181ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org SkPath a, b; 2191ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == b.getGenerationID()); 2201ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2211ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.moveTo(0, 0); 2221ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t z = a.getGenerationID(); 2231ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, z != b.getGenerationID()); 2241ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2251ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.reset(); 2261ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == b.getGenerationID()); 2271ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2281ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.moveTo(1, 1); 2291ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t y = a.getGenerationID(); 2301ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, z != y); 2311ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2321ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org b.moveTo(2, 2); 2331ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t x = b.getGenerationID(); 2341ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, x != y && x != z); 2351ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2361ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.swap(b); 2371ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == y && a.getGenerationID() == x); 2381ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2391ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org b = a; 2401ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == x); 2411ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2421ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org SkPath c(a); 2431ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, c.getGenerationID() == x); 2441ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2451ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.lineTo(3, 3); 2461ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t w = c.getGenerationID(); 2471ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == x); 2481ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == x); 2491ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, w != x); 2501ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2511ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org#ifdef SK_BUILD_FOR_ANDROID 2521ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org static bool kExpectGenIDToIgnoreFill = false; 2531ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org#else 2541ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org static bool kExpectGenIDToIgnoreFill = true; 2551ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org#endif 2561ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2571ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.toggleInverseFillType(); 2581ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t v = c.getGenerationID(); 2591ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, (v == w) == kExpectGenIDToIgnoreFill); 2601ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2611ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.rewind(); 2621ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, v != c.getGenerationID()); 2631ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org} 2641ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2653eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com// This used to assert in the debug build, as the edges did not all line-up. 2663eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.comstatic void test_bad_cubic_crbug234190() { 2673eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com SkPath path; 2683eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com path.moveTo(13.8509f, 3.16858f); 2693eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com path.cubicTo(-2.35893e+08f, -4.21044e+08f, 2703eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com -2.38991e+08f, -4.26573e+08f, 2713eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com -2.41016e+08f, -4.30188e+08f); 2723eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com 2733eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com SkPaint paint; 2743eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com paint.setAntiAlias(true); 275d28ba8010c6058bf073f7e815d5b2d7fdf698601reed@google.com SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(84, 88)); 2763eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com surface->getCanvas()->drawPath(path, paint); 2773eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com} 2783eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com 2797a90daf25878a7459ba9fbda581bb97cda034f02reed@google.comstatic void test_bad_cubic_crbug229478() { 2807a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com const SkPoint pts[] = { 281391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4595.91064f, -11596.9873f }, 282391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4597.2168f, -11595.9414f }, 283391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4598.52344f, -11594.8955f }, 284391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4599.83008f, -11593.8496f }, 2857a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com }; 286391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 2877a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPath path; 2887a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com path.moveTo(pts[0]); 2897a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 290391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 2917a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPaint paint; 2927a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.setStyle(SkPaint::kStroke_Style); 2937a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.setStrokeWidth(20); 294391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 2957a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPath dst; 2967a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com // Before the fix, this would infinite-recurse, and run out of stack 2977a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com // because we would keep trying to subdivide a degenerate cubic segment. 2987a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.getFillPath(path, &dst, NULL); 2997a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com} 3007a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com 30164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.comstatic void build_path_170666(SkPath& path) { 30264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(17.9459f, 21.6344f); 30364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.545f, -47.8105f); 30464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.545f, -47.8105f); 30564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(131.07f, -47.3888f); 30664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(131.07f, -47.3888f); 30764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.586f, -46.9532f); 30864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.586f, -46.9532f); 30964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 31064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 31164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18085.1f, 31390.5f); 31264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18085.1f, 31390.5f); 31364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 31464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 31564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.3f); 31664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.3f); 31764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17963.5f, 31459.9f); 31864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17963.5f, 31459.9f); 31964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 32064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 32164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9551f, 21.6205f); 32264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9551f, 21.6205f); 32364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(9.47091f, 22.0561f); 32464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(9.47091f, 22.0561f); 32564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9459f, 21.6344f); 32664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9459f, 21.6344f); 32764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close();path.moveTo(0.995934f, 22.4779f); 32864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.986725f, 22.4918f); 32964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.986725f, 22.4918f); 33064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.4f); 33164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.4f); 33264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 33364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 33464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390.1f); 33564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390.1f); 33664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390); 33764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390); 33864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.555f, -47.8244f); 33964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.555f, -47.8244f); 34064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.595f, -46.9671f); 34164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.595f, -46.9671f); 34264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.995934f, 22.4779f); 34364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.995934f, 22.4779f); 34464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close(); 34564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(5.43941f, 25.5223f); 34664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798267, -28871.1f); 34764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798267, -28871.1f); 34864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(3.12512e+06f, -113102); 34964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(3.12512e+06f, -113102); 35064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(5.16324e+06f, -186882, 8.15247e+06f, -295092, 1.1957e+07f, -432813); 35164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.95659e+07f, -708257, 3.04359e+07f, -1.10175e+06f, 4.34798e+07f, -1.57394e+06f); 35264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(6.95677e+07f, -2.51831e+06f, 1.04352e+08f, -3.77748e+06f, 1.39135e+08f, -5.03666e+06f); 35364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.73919e+08f, -6.29583e+06f, 2.08703e+08f, -7.555e+06f, 2.34791e+08f, -8.49938e+06f); 35464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.47835e+08f, -8.97157e+06f, 2.58705e+08f, -9.36506e+06f, 2.66314e+08f, -9.6405e+06f); 35564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.70118e+08f, -9.77823e+06f, 2.73108e+08f, -9.88644e+06f, 2.75146e+08f, -9.96022e+06f); 35664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.76165e+08f, -9.99711e+06f, 2.76946e+08f, -1.00254e+07f, 2.77473e+08f, -1.00444e+07f); 35764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.78271e+08f, -1.00733e+07f); 35864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.78271e+08f, -1.00733e+07f); 35964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.78271e+08f, -1.00733e+07f, 2.08703e+08f, -7.555e+06f, 135.238f, 23.3517f); 36064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(131.191f, 23.4981f, 125.995f, 23.7976f, 123.631f, 24.0206f); 36164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(121.267f, 24.2436f, 122.631f, 24.3056f, 126.677f, 24.1591f); 36264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 2.78271e+08f, -1.00733e+07f, 2.78271e+08f, -1.00733e+07f); 36364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.77473e+08f, -1.00444e+07f); 36464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.77473e+08f, -1.00444e+07f); 36564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.76946e+08f, -1.00254e+07f, 2.76165e+08f, -9.99711e+06f, 2.75146e+08f, -9.96022e+06f); 36664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.73108e+08f, -9.88644e+06f, 2.70118e+08f, -9.77823e+06f, 2.66314e+08f, -9.6405e+06f); 36764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.58705e+08f, -9.36506e+06f, 2.47835e+08f, -8.97157e+06f, 2.34791e+08f, -8.49938e+06f); 36864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 1.73919e+08f, -6.29583e+06f, 1.39135e+08f, -5.03666e+06f); 36964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.04352e+08f, -3.77749e+06f, 6.95677e+07f, -2.51831e+06f, 4.34798e+07f, -1.57394e+06f); 37064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(3.04359e+07f, -1.10175e+06f, 1.95659e+07f, -708258, 1.1957e+07f, -432814); 37164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(8.15248e+06f, -295092, 5.16324e+06f, -186883, 3.12513e+06f, -113103); 37264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798284, -28872); 37364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798284, -28872); 37464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(22.4044f, 24.6677f); 37564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(22.4044f, 24.6677f); 37664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(22.5186f, 24.5432f, 18.8134f, 24.6337f, 14.1287f, 24.8697f); 37764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(9.4439f, 25.1057f, 5.55359f, 25.3978f, 5.43941f, 25.5223f); 37864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close(); 37964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 38064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 38164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.comstatic void build_path_simple_170666(SkPath& path) { 38264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(126.677f, 24.1591f); 38364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 2.78271e+08f, -1.00733e+07f, 2.78271e+08f, -1.00733e+07f); 38464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 38564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 38664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// This used to assert in the SK_DEBUG build, as the clip step would fail with 38764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// too-few interations in our cubic-line intersection code. That code now runs 38864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// 24 interations (instead of 16). 38954f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_crbug_170666() { 39064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com SkPath path; 39164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com SkPaint paint; 39264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com paint.setAntiAlias(true); 39364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 394d28ba8010c6058bf073f7e815d5b2d7fdf698601reed@google.com SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(1000, 1000)); 39536df7ed46b41ac31cb2205bfd3ae37659d61e2fbskia.committer@gmail.com 39664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com build_path_simple_170666(path); 39764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com surface->getCanvas()->drawPath(path, paint); 39836df7ed46b41ac31cb2205bfd3ae37659d61e2fbskia.committer@gmail.com 39964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com build_path_170666(path); 40064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com surface->getCanvas()->drawPath(path, paint); 40164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 40264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 403a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_addrect(skiatest::Reporter* reporter) { 404a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath path; 405a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(0, 0); 406a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 407a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, path.isRect(NULL)); 408a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 409a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 410a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(FLT_EPSILON, FLT_EPSILON); 411a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 412a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 413a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 414a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 415a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.quadTo(0, 0, 0, 0); 416a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 417a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 418a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 419a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 420a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conicTo(0, 0, 0, 0, 0.5f); 421a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 422a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 423a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 424a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 425a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.cubicTo(0, 0, 0, 0, 0, 0); 426a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 427a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 428a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 429a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 430a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com// Make sure we stay non-finite once we get there (unless we reset or rewind). 431a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.comstatic void test_addrect_isfinite(skiatest::Reporter* reporter) { 432a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com SkPath path; 4338b0e2340e11e973d27aea39ec65e6bc9738224a5skia.committer@gmail.com 434a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 435a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 436a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 437a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.moveTo(0, 0); 438a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.lineTo(SK_ScalarInfinity, 42); 439a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 440a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 441a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 442a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 443a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 444a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.reset(); 445a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 4468b0e2340e11e973d27aea39ec65e6bc9738224a5skia.committer@gmail.com 447a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 448a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 449a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com} 450a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 451848148ec109172f9eef9a26fa23a520cf9072b5creed@google.comstatic void build_big_path(SkPath* path, bool reducedCase) { 452848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com if (reducedCase) { 453848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(577330, 1971.72f); 454848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f); 455848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } else { 456848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(60.1631f, 7.70567f); 457848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(60.1631f, 7.70567f, 0.99474f, 0.901199f); 458848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->lineTo(577379, 1977.77f); 459848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577364, 1979.57f, 577325, 1980.26f); 460848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577286, 1980.95f, 577245, 1980.13f); 461848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577205, 1979.3f, 577187, 1977.45f); 462848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577168, 1975.6f, 577183, 1973.8f); 463848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577198, 1972, 577238, 1971.31f); 464848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577277, 1970.62f, 577317, 1971.45f); 465848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577330, 1971.72f, 577341, 1972.11f); 466848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f); 467848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(306.718f, -32.912f); 468848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(30.531f, 10.0005f, 1502.47f, 13.2804f, 84.3088f, 9.99601f); 469848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 470848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com} 471848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 47254f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_clipped_cubic() { 473d28ba8010c6058bf073f7e815d5b2d7fdf698601reed@google.com SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterPMColor(640, 480)); 474848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 475848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // This path used to assert, because our cubic-chopping code incorrectly 476848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // moved control points after the chop. This test should be run in SK_DEBUG 477848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // mode to ensure that we no long assert. 478848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com SkPath path; 479848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com for (int doReducedCase = 0; doReducedCase <= 1; ++doReducedCase) { 480848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com build_big_path(&path, SkToBool(doReducedCase)); 481ff21c2e0ae23da0f4742b47d4d37969a2a18bd99skia.committer@gmail.com 482848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com SkPaint paint; 483848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com for (int doAA = 0; doAA <= 1; ++doAA) { 484848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com paint.setAntiAlias(SkToBool(doAA)); 485848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com surface->getCanvas()->drawPath(path, paint); 486848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 487848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 488848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com} 489848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 4908cae8358f78b81539f1006afe592a37f1604e67creed@google.com// Inspired by http://ie.microsoft.com/testdrive/Performance/Chalkboard/ 4918cae8358f78b81539f1006afe592a37f1604e67creed@google.com// which triggered an assert, from a tricky cubic. This test replicates that 4928cae8358f78b81539f1006afe592a37f1604e67creed@google.com// example, so we can ensure that we handle it (in SkEdge.cpp), and don't 4938cae8358f78b81539f1006afe592a37f1604e67creed@google.com// assert in the SK_DEBUG build. 49454f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_tricky_cubic() { 4958cae8358f78b81539f1006afe592a37f1604e67creed@google.com const SkPoint pts[] = { 496055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8943768), SkDoubleToScalar(129.121277) }, 497055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8937435), SkDoubleToScalar(129.121689) }, 498055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8950119), SkDoubleToScalar(129.120422) }, 499055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.5030727), SkDoubleToScalar(129.13121) }, 5008cae8358f78b81539f1006afe592a37f1604e67creed@google.com }; 5018cae8358f78b81539f1006afe592a37f1604e67creed@google.com 5028cae8358f78b81539f1006afe592a37f1604e67creed@google.com SkPath path; 5038cae8358f78b81539f1006afe592a37f1604e67creed@google.com path.moveTo(pts[0]); 5048cae8358f78b81539f1006afe592a37f1604e67creed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 5058cae8358f78b81539f1006afe592a37f1604e67creed@google.com 5068cae8358f78b81539f1006afe592a37f1604e67creed@google.com SkPaint paint; 5078cae8358f78b81539f1006afe592a37f1604e67creed@google.com paint.setAntiAlias(true); 5088cae8358f78b81539f1006afe592a37f1604e67creed@google.com 509d28ba8010c6058bf073f7e815d5b2d7fdf698601reed@google.com SkSurface* surface = SkSurface::NewRasterPMColor(19, 130); 5108cae8358f78b81539f1006afe592a37f1604e67creed@google.com surface->getCanvas()->drawPath(path, paint); 5118cae8358f78b81539f1006afe592a37f1604e67creed@google.com surface->unref(); 5128cae8358f78b81539f1006afe592a37f1604e67creed@google.com} 5133abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 514ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com// Inspired by http://code.google.com/p/chromium/issues/detail?id=141651 515ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com// 516ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.comstatic void test_isfinite_after_transform(skiatest::Reporter* reporter) { 517ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com SkPath path; 518ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.quadTo(157, 366, 286, 208); 519ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.arcTo(37, 442, 315, 163, 957494590897113.0f); 520d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 521ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com SkMatrix matrix; 522ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com matrix.setScale(1000*1000, 1000*1000); 523ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 524ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // Be sure that path::transform correctly updates isFinite and the bounds 525ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // if the transformation overflows. The previous bug was that isFinite was 526ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // set to true in this case, but the bounds were not set to empty (which 527ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // they should be). 528ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com while (path.isFinite()) { 529ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isFinite()); 530ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, !path.getBounds().isEmpty()); 531ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.transform(matrix); 532ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com } 533ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isEmpty()); 534ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 535ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com matrix.setTranslate(SK_Scalar1, SK_Scalar1); 536ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.transform(matrix); 537ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // we need to still be non-finite 538ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 539ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isEmpty()); 540ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com} 541ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 5426a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.comstatic void add_corner_arc(SkPath* path, const SkRect& rect, 5436a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.com SkScalar xIn, SkScalar yIn, 544b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com int startAngle) 545b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com{ 546b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 547b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar rx = SkMinScalar(rect.width(), xIn); 548b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar ry = SkMinScalar(rect.height(), yIn); 549b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 550b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkRect arcRect; 551b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.set(-rx, -ry, rx, ry); 552b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com switch (startAngle) { 553b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 0: 554b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom); 555b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 556b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 90: 557b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom); 558b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 559b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 180: 560b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop); 561b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 562b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 270: 563b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop); 564b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 565b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com default: 566b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 567b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 568b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 569b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false); 570b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 571b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 5726a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.comstatic void make_arb_round_rect(SkPath* path, const SkRect& r, 573b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar xCorner, SkScalar yCorner) { 574b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com // we are lazy here and use the same x & y for each corner 575b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 270); 576b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 0); 577b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 90); 578b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 180); 579158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com path->close(); 580b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 581b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 582b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different. 583b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Performance will suffer if they are not convex. 584b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Note: PathBench::ArbRoundRectBench performs almost exactly 585b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with drawing) 586b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.comstatic void test_arb_round_rect_is_convex(skiatest::Reporter* reporter) { 587e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 588b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkRect r; 589b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 590b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com for (int i = 0; i < 5000; ++i) { 591b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 592158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 593158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 594b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com continue; 595b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 596b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 597b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 598158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 599158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 600b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 601b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkPath temp; 602b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 603b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15); 604b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 605b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com REPORTER_ASSERT(reporter, temp.isConvex()); 606b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 607b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 608b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 609158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome will sometimes create a 0 radius round rect. The degenerate 610158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// quads prevent the path from being converted to a rect 611158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Note: PathBench::ArbRoundRectBench performs almost exactly 612158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// the same test (but with drawing) 613158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.comstatic void test_arb_zero_rad_round_rect_is_rect(skiatest::Reporter* reporter) { 614e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 615158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkRect r; 616158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 617158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com for (int i = 0; i < 5000; ++i) { 618158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 619158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 620158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 621158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com continue; 622158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 623158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 624158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 625158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 626158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 627158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 628158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkPath temp; 629158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 630158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, 0, 0); 631158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 632158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkRect result; 633158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com REPORTER_ASSERT(reporter, temp.isRect(&result)); 634158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com REPORTER_ASSERT(reporter, r == result); 635158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 636158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com} 637158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 6380bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_rect_isfinite(skiatest::Reporter* reporter) { 6390bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar inf = SK_ScalarInfinity; 6407abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com const SkScalar negInf = SK_ScalarNegativeInfinity; 6410bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar nan = SK_ScalarNaN; 642d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6430bb18bb264b26afca45452910437c09445e23a3creed@google.com SkRect r; 6440bb18bb264b26afca45452910437c09445e23a3creed@google.com r.setEmpty(); 6450bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isFinite()); 6467abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com r.set(0, 0, inf, negInf); 6470bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isFinite()); 6480bb18bb264b26afca45452910437c09445e23a3creed@google.com r.set(0, 0, nan, 0); 6490bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isFinite()); 650d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6510bb18bb264b26afca45452910437c09445e23a3creed@google.com SkPoint pts[] = { 6520bb18bb264b26afca45452910437c09445e23a3creed@google.com { 0, 0 }, 6530bb18bb264b26afca45452910437c09445e23a3creed@google.com { SK_Scalar1, 0 }, 6540bb18bb264b26afca45452910437c09445e23a3creed@google.com { 0, SK_Scalar1 }, 6550bb18bb264b26afca45452910437c09445e23a3creed@google.com }; 656d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6570bb18bb264b26afca45452910437c09445e23a3creed@google.com bool isFine = r.setBoundsCheck(pts, 3); 6580bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, isFine); 6590bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isEmpty()); 660d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6610bb18bb264b26afca45452910437c09445e23a3creed@google.com pts[1].set(inf, 0); 6620bb18bb264b26afca45452910437c09445e23a3creed@google.com isFine = r.setBoundsCheck(pts, 3); 6630bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !isFine); 6640bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isEmpty()); 665d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6660bb18bb264b26afca45452910437c09445e23a3creed@google.com pts[1].set(nan, 0); 6670bb18bb264b26afca45452910437c09445e23a3creed@google.com isFine = r.setBoundsCheck(pts, 3); 6680bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !isFine); 6690bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isEmpty()); 6700bb18bb264b26afca45452910437c09445e23a3creed@google.com} 6710bb18bb264b26afca45452910437c09445e23a3creed@google.com 6720bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_path_isfinite(skiatest::Reporter* reporter) { 6730bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar inf = SK_ScalarInfinity; 67450c79d886bf435d3a9cad056885370e2c3f526adbsalomon@google.com const SkScalar negInf = SK_ScalarNegativeInfinity; 6750bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar nan = SK_ScalarNaN; 676d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6770bb18bb264b26afca45452910437c09445e23a3creed@google.com SkPath path; 6780bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 6790bb18bb264b26afca45452910437c09445e23a3creed@google.com 6800bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 6810bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 6820bb18bb264b26afca45452910437c09445e23a3creed@google.com 6830bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 6840bb18bb264b26afca45452910437c09445e23a3creed@google.com path.moveTo(SK_Scalar1, 0); 6850bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 6860bb18bb264b26afca45452910437c09445e23a3creed@google.com 6870bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 68850c79d886bf435d3a9cad056885370e2c3f526adbsalomon@google.com path.moveTo(inf, negInf); 6890bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 6900bb18bb264b26afca45452910437c09445e23a3creed@google.com 6910bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 6920bb18bb264b26afca45452910437c09445e23a3creed@google.com path.moveTo(nan, 0); 6930bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 6940bb18bb264b26afca45452910437c09445e23a3creed@google.com} 6950bb18bb264b26afca45452910437c09445e23a3creed@google.com 6960bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_isfinite(skiatest::Reporter* reporter) { 6970bb18bb264b26afca45452910437c09445e23a3creed@google.com test_rect_isfinite(reporter); 6980bb18bb264b26afca45452910437c09445e23a3creed@google.com test_path_isfinite(reporter); 6990bb18bb264b26afca45452910437c09445e23a3creed@google.com} 7000bb18bb264b26afca45452910437c09445e23a3creed@google.com 701744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// assert that we always 702744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// start with a moveTo 703744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have 1 moveTo 704744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have Lines after that 705744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// end with a single close 706744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have (at most) 1 close 707744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// 708744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comstatic void test_poly(skiatest::Reporter* reporter, const SkPath& path, 70954f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com const SkPoint srcPts[], bool expectClose) { 710744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPath::RawIter iter(path); 711744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPoint pts[4]; 712744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 713744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com bool firstTime = true; 714744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com bool foundClose = false; 715744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (;;) { 716744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com switch (iter.next(pts)) { 717744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kMove_Verb: 718744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, firstTime); 719744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, pts[0] == srcPts[0]); 720744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com srcPts++; 721744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com firstTime = false; 722744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 723744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kLine_Verb: 724744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !firstTime); 725744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, pts[1] == srcPts[0]); 726744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com srcPts++; 727744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 728744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kQuad_Verb: 729330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected quad verb"); 730744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 731277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 732330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected conic verb"); 733277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 734744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kCubic_Verb: 735330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected cubic verb"); 736744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 737744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kClose_Verb: 738744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !firstTime); 739744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !foundClose); 740744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, expectClose); 741744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com foundClose = true; 742744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 743744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kDone_Verb: 744744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com goto DONE; 745744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 746744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 747744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comDONE: 748744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, foundClose == expectClose); 749744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com} 750744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 751744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comstatic void test_addPoly(skiatest::Reporter* reporter) { 752744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPoint pts[32]; 753e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 754d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 755744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 756744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com pts[i].fX = rand.nextSScalar1(); 757744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com pts[i].fY = rand.nextSScalar1(); 758744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 759744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 760744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (int doClose = 0; doClose <= 1; ++doClose) { 761744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (size_t count = 1; count <= SK_ARRAY_COUNT(pts); ++count) { 762744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPath path; 763744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com path.addPoly(pts, count, SkToBool(doClose)); 76454f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_poly(reporter, path, pts, SkToBool(doClose)); 765744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 766744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 767744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com} 768744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 7698b06f1a7ff6d5a59387a90433064550de20787eereed@google.comstatic void test_strokerec(skiatest::Reporter* reporter) { 7708b06f1a7ff6d5a59387a90433064550de20787eereed@google.com SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); 7718b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, rec.isFillStyle()); 772d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7738b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setHairlineStyle(); 7748b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, rec.isHairlineStyle()); 775d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7768b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(SK_Scalar1, false); 7778b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kStroke_Style == rec.getStyle()); 778d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7798b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(SK_Scalar1, true); 7808b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kStrokeAndFill_Style == rec.getStyle()); 781d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7828b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(0, false); 7838b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kHairline_Style == rec.getStyle()); 784d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7858b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(0, true); 7868b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kFill_Style == rec.getStyle()); 7878b06f1a7ff6d5a59387a90433064550de20787eereed@google.com} 7888b06f1a7ff6d5a59387a90433064550de20787eereed@google.com 78930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com// Set this for paths that don't have a consistent direction such as a bowtie. 79030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com// (cheapComputeDirection is not expected to catch these.) 79130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic const SkPath::Direction kDontCheckDir = static_cast<SkPath::Direction>(-1); 79230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 79330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void check_direction(skiatest::Reporter* reporter, const SkPath& path, 79430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction expected) { 79530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (expected == kDontCheckDir) { 79630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com return; 79730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 79830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath copy(path); // we make a copy so that we don't cache the result on the passed in path. 79930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 80030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir; 80130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (copy.cheapComputeDirection(&dir)) { 80230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, dir == expected); 80330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 80430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kUnknown_Direction == expected); 805f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com } 806f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com} 807f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 8083e71a887628ff25c806675366b081c70bb10b74dreed@google.comstatic void test_direction(skiatest::Reporter* reporter) { 8093e71a887628ff25c806675366b081c70bb10b74dreed@google.com size_t i; 8103e71a887628ff25c806675366b081c70bb10b74dreed@google.com SkPath path; 8113e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapComputeDirection(NULL)); 8123e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapIsDirection(SkPath::kCW_Direction)); 8133e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapIsDirection(SkPath::kCCW_Direction)); 814a8a3b3d9a027ad54ce20f8b4ed7c577a176b31careed@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(SkPath::kUnknown_Direction)); 8153e71a887628ff25c806675366b081c70bb10b74dreed@google.com 8163e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gDegen[] = { 8173e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10", 8183e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 M 20 20", 8193e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 L 20 20", 8203e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 L 10 10 L 10 10", 8213e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 Q 10 10 10 10", 8223e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 10 10 10 10 10 10", 8233e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 8243e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gDegen); ++i) { 8253e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 8263e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gDegen[i], &path); 8273e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 8283e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapComputeDirection(NULL)); 8293e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 830d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8313e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gCW[] = { 832cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com "M 10 10 L 10 10 Q 20 10 20 20", 8333e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 20 10 20 20 20 20", 834d414666d18fa9dca1cb310bc66c574aac3d79b72reed@google.com "M 20 10 Q 20 20 30 20 L 10 20", // test double-back at y-max 8354eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // rect with top two corners replaced by cubics with identical middle 8364eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // control points 83720fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 10 10 C 10 0 10 0 20 0 L 40 0 C 50 0 50 0 50 10", 83820fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 20 10 L 0 10 Q 10 10 20 0", // left, degenerate serif 8393e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 8403e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gCW); ++i) { 8413e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 8423e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gCW[i], &path); 8433e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 84430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCW_Direction); 8453e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 846d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8473e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gCCW[] = { 848cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com "M 10 10 L 10 10 Q 20 10 20 -20", 8493e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 20 10 20 -20 20 -20", 850d414666d18fa9dca1cb310bc66c574aac3d79b72reed@google.com "M 20 10 Q 20 20 10 20 L 30 20", // test double-back at y-max 8514eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // rect with top two corners replaced by cubics with identical middle 8524eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // control points 85320fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 50 10 C 50 0 50 0 40 0 L 20 0 C 10 0 10 0 10 10", 85420fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 10 10 L 30 10 Q 20 10 10 0", // right, degenerate serif 8553e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 8563e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gCCW); ++i) { 8573e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 8583e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gCCW[i], &path); 8593e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 86030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCCW_Direction); 8613e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 862ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com 863ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com // Test two donuts, each wound a different direction. Only the outer contour 864ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com // determines the cheap direction 865ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.reset(); 866ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(2), SkPath::kCW_Direction); 867ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(1), SkPath::kCCW_Direction); 86830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCW_Direction); 869f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 870ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.reset(); 871ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(1), SkPath::kCW_Direction); 872ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(2), SkPath::kCCW_Direction); 87330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCCW_Direction); 874f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 875f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com // triangle with one point really far from the origin. 876f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com path.reset(); 877f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com // the first point is roughly 1.05e10, 1.05e10 8784b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org path.moveTo(SkBits2Float(0x501c7652), SkBits2Float(0x501c7652)); 87953aab7813ca20360426524361941cf43567fc7aebsalomon@google.com path.lineTo(110 * SK_Scalar1, -10 * SK_Scalar1); 88053aab7813ca20360426524361941cf43567fc7aebsalomon@google.com path.lineTo(-10 * SK_Scalar1, 60 * SK_Scalar1); 88130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCCW_Direction); 882a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 883a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 884a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conicTo(20, 0, 20, 20, 0.5f); 885a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 886a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_direction(reporter, path, SkPath::kCW_Direction); 887a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 888a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 889a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(1, 1e7f); 890a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(1e7f, 2e7f); 891a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 892a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kConvex_Convexity == path.getConvexity()); 893a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_direction(reporter, path, SkPath::kCCW_Direction); 8943e71a887628ff25c806675366b081c70bb10b74dreed@google.com} 8953e71a887628ff25c806675366b081c70bb10b74dreed@google.com 896ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.comstatic void add_rect(SkPath* path, const SkRect& r) { 897ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->moveTo(r.fLeft, r.fTop); 898ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fRight, r.fTop); 899ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fRight, r.fBottom); 900ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fLeft, r.fBottom); 901ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->close(); 902ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com} 903ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 904ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.comstatic void test_bounds(skiatest::Reporter* reporter) { 905ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com static const SkRect rects[] = { 9063563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(160), SkIntToScalar(610), SkIntToScalar(160) }, 9073563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(610), SkIntToScalar(160), SkIntToScalar(610), SkIntToScalar(199) }, 9083563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(198), SkIntToScalar(610), SkIntToScalar(199) }, 9093563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(160), SkIntToScalar(10), SkIntToScalar(199) }, 910ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com }; 911ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 912ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com SkPath path0, path1; 913ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(rects); ++i) { 914ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path0.addRect(rects[i]); 915ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com add_rect(&path1, rects[i]); 916ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com } 917ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 918ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com REPORTER_ASSERT(reporter, path0.getBounds() == path1.getBounds()); 919ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com} 920ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 92155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.comstatic void stroke_cubic(const SkPoint pts[4]) { 92255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPath path; 92355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com path.moveTo(pts[0]); 92455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 925d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 92655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPaint paint; 92755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.setStyle(SkPaint::kStroke_Style); 92855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.setStrokeWidth(SK_Scalar1 * 2); 929d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 93055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPath fill; 93155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.getFillPath(path, &fill); 93255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com} 93355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 93455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// just ensure this can run w/o any SkASSERTS firing in the debug build 93555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// we used to assert due to differences in how we determine a degenerate vector 93655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// but that was fixed with the introduction of SkPoint::CanNormalize 93755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.comstatic void stroke_tiny_cubic() { 93855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPoint p0[] = { 93955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 94055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 94155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 94255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 94355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com }; 944d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 94555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_cubic(p0); 946d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 94755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPoint p1[] = { 94855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 94955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0007f, 92.000755f }, 95055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 371.99927f, 92.003922f }, 95155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 371.99826f, 92.003899f }, 95255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com }; 953d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 95455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_cubic(p1); 95555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com} 95655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 957b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.comstatic void check_close(skiatest::Reporter* reporter, const SkPath& path) { 958b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com for (int i = 0; i < 2; ++i) { 95909042b80d22837c760bb530124aaa67469b19b8frobertphillips@google.com SkPath::Iter iter(path, SkToBool(i)); 960b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPoint mv; 961b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPoint pts[4]; 962b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath::Verb v; 963b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com int nMT = 0; 964b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com int nCL = 0; 965221db3c3364eb110bc03db78cb09aae51d117b27tomhudson@google.com mv.set(0, 0); 966b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com while (SkPath::kDone_Verb != (v = iter.next(pts))) { 967b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com switch (v) { 968b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com case SkPath::kMove_Verb: 969b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com mv = pts[0]; 970b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com ++nMT; 971b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 972b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com case SkPath::kClose_Verb: 973b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com REPORTER_ASSERT(reporter, mv == pts[0]); 974b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com ++nCL; 975b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 976b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com default: 977b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 978b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 979b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 980b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com // if we force a close on the interator we should have a close 981b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com // for every moveTo 982b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com REPORTER_ASSERT(reporter, !i || nMT == nCL); 983b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 984b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com} 985b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 986b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.comstatic void test_close(skiatest::Reporter* reporter) { 987b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath closePt; 988b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com closePt.moveTo(0, 0); 989b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com closePt.close(); 990b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, closePt); 991b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 992b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath openPt; 993b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com openPt.moveTo(0, 0); 994b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, openPt); 995b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 996b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath empty; 997b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, empty); 998b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com empty.close(); 999b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, empty); 1000b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1001b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath rect; 1002b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1003b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect); 1004b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect.close(); 1005b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect); 1006b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1007b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath quad; 1008b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com quad.quadTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1009b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, quad); 1010b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com quad.close(); 1011b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, quad); 1012b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1013b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath cubic; 1014d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com quad.cubicTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 1015b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 10*SK_Scalar1, 20 * SK_Scalar1, 20*SK_Scalar1); 1016b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, cubic); 1017b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com cubic.close(); 1018b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, cubic); 1019b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1020b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath line; 1021b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.moveTo(SK_Scalar1, SK_Scalar1); 1022b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.lineTo(10 * SK_Scalar1, 10*SK_Scalar1); 1023b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, line); 1024b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.close(); 1025b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, line); 1026b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1027b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath rect2; 1028b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1029b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.close(); 1030b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1031b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect2); 1032b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.close(); 1033b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect2); 1034b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1035b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath oval3; 1036b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.addOval(SkRect::MakeWH(SK_Scalar1*100,SK_Scalar1*100)); 1037b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.close(); 1038b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.addOval(SkRect::MakeWH(SK_Scalar1*200,SK_Scalar1*200)); 1039b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, oval3); 1040b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.close(); 1041b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, oval3); 1042b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1043b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath moves; 1044b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(SK_Scalar1, SK_Scalar1); 1045b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(5 * SK_Scalar1, SK_Scalar1); 1046b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(SK_Scalar1, 10 * SK_Scalar1); 1047b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(10 *SK_Scalar1, SK_Scalar1); 1048b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, moves); 104955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 105055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_tiny_cubic(); 1051b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com} 1052b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 10537c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.comstatic void check_convexity(skiatest::Reporter* reporter, const SkPath& path, 10547c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath::Convexity expected) { 105530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath copy(path); // we make a copy so that we don't cache the result on the passed in path. 105630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Convexity c = copy.getConvexity(); 10577c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com REPORTER_ASSERT(reporter, c == expected); 10587c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com} 10597c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com 10607c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.comstatic void test_convexity2(skiatest::Reporter* reporter) { 10617c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath pt; 10627c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com pt.moveTo(0, 0); 10637c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com pt.close(); 1064b54455e440e66e0b1c30954d226226f49aac26d6reed@google.com check_convexity(reporter, pt, SkPath::kConvex_Convexity); 106530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, pt, SkPath::kUnknown_Direction); 1066d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 10677c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath line; 10686c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org line.moveTo(12*SK_Scalar1, 20*SK_Scalar1); 10696c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org line.lineTo(-12*SK_Scalar1, -20*SK_Scalar1); 10707c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com line.close(); 107130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, line, SkPath::kConvex_Convexity); 107230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, line, SkPath::kUnknown_Direction); 1073d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 10747c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath triLeft; 10757c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triLeft.moveTo(0, 0); 10766c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triLeft.lineTo(SK_Scalar1, 0); 10776c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triLeft.lineTo(SK_Scalar1, SK_Scalar1); 10787c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triLeft.close(); 10797c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, triLeft, SkPath::kConvex_Convexity); 108030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, triLeft, SkPath::kCW_Direction); 1081d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 10827c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath triRight; 10837c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triRight.moveTo(0, 0); 10846c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triRight.lineTo(-SK_Scalar1, 0); 10856c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triRight.lineTo(SK_Scalar1, SK_Scalar1); 10867c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triRight.close(); 10877c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, triRight, SkPath::kConvex_Convexity); 108830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, triRight, SkPath::kCCW_Direction); 1089d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 10907c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath square; 10917c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com square.moveTo(0, 0); 10926c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(SK_Scalar1, 0); 10936c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(SK_Scalar1, SK_Scalar1); 10946c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(0, SK_Scalar1); 10957c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com square.close(); 10967c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, square, SkPath::kConvex_Convexity); 109730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, square, SkPath::kCW_Direction); 1098d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 10997c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath redundantSquare; 11007c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.moveTo(0, 0); 11017c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.lineTo(0, 0); 11027c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.lineTo(0, 0); 11036c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 11046c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 11056c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 11066c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 11076c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 11086c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 11096c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 11106c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 11116c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 11127c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.close(); 11137c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, redundantSquare, SkPath::kConvex_Convexity); 111430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, redundantSquare, SkPath::kCW_Direction); 1115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11167c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath bowTie; 11177c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.moveTo(0, 0); 11187c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.lineTo(0, 0); 11197c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.lineTo(0, 0); 11206c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 11216c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 11226c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 11236c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 11246c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 11256c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 11266c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 11276c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 11286c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 11297c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.close(); 11307c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, bowTie, SkPath::kConcave_Convexity); 113130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, bowTie, kDontCheckDir); 1132d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11337c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath spiral; 11347c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com spiral.moveTo(0, 0); 11356c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(100*SK_Scalar1, 0); 11366c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(100*SK_Scalar1, 100*SK_Scalar1); 11376c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(0, 100*SK_Scalar1); 11386c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(0, 50*SK_Scalar1); 11396c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(50*SK_Scalar1, 50*SK_Scalar1); 11406c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(50*SK_Scalar1, 75*SK_Scalar1); 11417c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com spiral.close(); 114285b6e399d56d2421980daa432f30910beda41922reed@google.com check_convexity(reporter, spiral, SkPath::kConcave_Convexity); 114330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, spiral, kDontCheckDir); 1144d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11457c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath dent; 11466c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.moveTo(0, 0); 11476c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(100*SK_Scalar1, 100*SK_Scalar1); 11486c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(0, 100*SK_Scalar1); 11496c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(-50*SK_Scalar1, 200*SK_Scalar1); 11506c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(-200*SK_Scalar1, 100*SK_Scalar1); 11517c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com dent.close(); 11527c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, dent, SkPath::kConcave_Convexity); 115330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, dent, SkPath::kCW_Direction); 11548be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org 11558be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org // http://skbug.com/2235 11568be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkPath strokedSin; 11578be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org for (int i = 0; i < 2000; i++) { 11588be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkScalar x = SkIntToScalar(i) / 2; 11598be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkScalar y = 500 - (x + SkScalarSin(x / 100) * 40) / 3; 11608be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org if (0 == i) { 11618be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org strokedSin.moveTo(x, y); 11628be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } else { 11638be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org strokedSin.lineTo(x, y); 11648be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } 11658be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } 11668be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 11678be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org stroke.setStrokeStyle(2 * SK_Scalar1); 11688be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org stroke.applyToPath(&strokedSin, strokedSin); 11698be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org check_convexity(reporter, strokedSin, SkPath::kConcave_Convexity); 11708be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org check_direction(reporter, strokedSin, kDontCheckDir); 11717c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com} 11727c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com 11736b82d1adc6a4726e36674e468ff1157e0b75373freed@android.comstatic void check_convex_bounds(skiatest::Reporter* reporter, const SkPath& p, 11746b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com const SkRect& bounds) { 11756b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p.isConvex()); 11766b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p.getBounds() == bounds); 117762047cf1980861234e7367a225928b84ce492c68reed@google.com 11786b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com SkPath p2(p); 11796b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p2.isConvex()); 11806b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p2.getBounds() == bounds); 11816b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 11826b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com SkPath other; 11836b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com other.swap(p2); 11846b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, other.isConvex()); 11856b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, other.getBounds() == bounds); 11866b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com} 11876b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 118804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.comstatic void setFromString(SkPath* path, const char str[]) { 118904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com bool first = true; 119004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com while (str) { 119104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkScalar x, y; 119204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com str = SkParse::FindScalar(str, &x); 119304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com if (NULL == str) { 119404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com break; 119504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 119604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com str = SkParse::FindScalar(str, &y); 119704863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkASSERT(str); 119804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com if (first) { 119904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path->moveTo(x, y); 120004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com first = false; 120104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } else { 120204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path->lineTo(x, y); 120304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 120404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 120504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com} 120604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 120704863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.comstatic void test_convexity(skiatest::Reporter* reporter) { 120804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath path; 120904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 121030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1211e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addCircle(0, 0, SkIntToScalar(10)); 121230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1213e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addCircle(0, 0, SkIntToScalar(10)); // 2nd circle 121430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConcave_Convexity); 121530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 121604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path.reset(); 1217e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addRect(0, 0, SkIntToScalar(10), SkIntToScalar(10), SkPath::kCCW_Direction); 121830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 12193e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(SkPath::kCCW_Direction)); 122030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 122104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path.reset(); 1222e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addRect(0, 0, SkIntToScalar(10), SkIntToScalar(10), SkPath::kCW_Direction); 122330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 12243e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(SkPath::kCW_Direction)); 1225d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 122604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com static const struct { 122704863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com const char* fPathStr; 122804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath::Convexity fExpectedConvexity; 122930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction fExpectedDirection; 123004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } gRec[] = { 123130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "", SkPath::kConvex_Convexity, SkPath::kUnknown_Direction }, 123230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0", SkPath::kConvex_Convexity, SkPath::kUnknown_Direction }, 123330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10", SkPath::kConvex_Convexity, SkPath::kUnknown_Direction }, 123430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 20 20 0 0 10 10", SkPath::kConcave_Convexity, SkPath::kUnknown_Direction }, 123530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 10 20", SkPath::kConvex_Convexity, SkPath::kCW_Direction }, 123630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 10 0", SkPath::kConvex_Convexity, SkPath::kCCW_Direction }, 123730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 10 0 0 10", SkPath::kConcave_Convexity, kDontCheckDir }, 123830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 0 0 10 -10 -10", SkPath::kConcave_Convexity, SkPath::kCW_Direction }, 123904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com }; 124004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 124104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 124204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath path; 124304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com setFromString(&path, gRec[i].fPathStr); 124430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, gRec[i].fExpectedConvexity); 124530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, gRec[i].fExpectedDirection); 1246a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // check after setting the initial convex and direction 1247a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org if (kDontCheckDir != gRec[i].fExpectedDirection) { 1248a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath copy(path); 1249a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir; 1250a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool foundDir = copy.cheapComputeDirection(&dir); 1251a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, (gRec[i].fExpectedDirection == SkPath::kUnknown_Direction) 1252a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org ^ foundDir); 1253a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !foundDir || gRec[i].fExpectedDirection == dir); 1254a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_convexity(reporter, copy, gRec[i].fExpectedConvexity); 1255a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 1256a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, gRec[i].fExpectedConvexity == path.getConvexity()); 1257a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_direction(reporter, path, gRec[i].fExpectedDirection); 125804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 125904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com} 126004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 12617e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.comstatic void test_isLine(skiatest::Reporter* reporter) { 12627e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com SkPath path; 12637e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com SkPoint pts[2]; 12647e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar value = SkIntToScalar(5); 12657e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 12667e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(NULL)); 1267d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12687e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // set some non-zero values 12697e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com pts[0].set(value, value); 12707e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com pts[1].set(value, value); 12717e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 12727e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // check that pts was untouched 12737e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(value, value)); 12747e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(value, value)); 12757e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 12767e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar moveX = SkIntToScalar(1); 12777e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar moveY = SkIntToScalar(2); 1278a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, value != moveX && value != moveY); 12797e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 12807e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.moveTo(moveX, moveY); 12817e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(NULL)); 12827e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 12837e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // check that pts was untouched 12847e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(value, value)); 12857e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(value, value)); 12867e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 12877e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar lineX = SkIntToScalar(2); 12887e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar lineY = SkIntToScalar(2); 1289a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, value != lineX && value != lineY); 12907e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 12917e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.lineTo(lineX, lineY); 12927e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, path.isLine(NULL)); 12937e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 12947e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !pts[0].equals(moveX, moveY)); 12957e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !pts[1].equals(lineX, lineY)); 12967e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, path.isLine(pts)); 12977e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(moveX, moveY)); 12987e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(lineX, lineY)); 12997e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 13007e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.lineTo(0, 0); // too many points/verbs 13017e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(NULL)); 13027e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 13037e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(moveX, moveY)); 13047e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(lineX, lineY)); 1305a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1306a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1307a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.quadTo(1, 1, 2, 2); 1308a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isLine(NULL)); 13097e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com} 13107e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 13119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comstatic void test_conservativelyContains(skiatest::Reporter* reporter) { 13129bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath path; 13139bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // kBaseRect is used to construct most our test paths: a rect, a circle, and a round-rect. 13159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBaseRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 13169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // A circle that bounds kBaseRect (with a significant amount of slop) 13189bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkScalar circleR = SkMaxScalar(kBaseRect.width(), kBaseRect.height()); 1319a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org circleR = SkScalarMul(circleR, 1.75f) / 2; 13209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkPoint kCircleC = {kBaseRect.centerX(), kBaseRect.centerY()}; 13219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13229bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // round-rect radii 13239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkScalar kRRRadii[] = {SkIntToScalar(5), SkIntToScalar(3)}; 1324cec8de68217186d0f5676a696de44343aaa61de7skia.committer@gmail.com 132556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com static const struct SUPPRESS_VISIBILITY_WARNING { 13269bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect fQueryRect; 13279bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInRect; 13289bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInCircle; 13299bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInRR; 1330a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool fInCubicRR; 13319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } kQueries[] = { 1332a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {kBaseRect, true, true, false, false}, 13339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // rect well inside of kBaseRect 13354b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org {SkRect::MakeLTRB(kBaseRect.fLeft + 0.25f*kBaseRect.width(), 13364b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fTop + 0.25f*kBaseRect.height(), 13374b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fRight - 0.25f*kBaseRect.width(), 13384b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fBottom - 0.25f*kBaseRect.height()), 1339a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 13409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // rects with edges off by one from kBaseRect's edges 13429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 13439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height() + 1), 1344a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 13469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, kBaseRect.height()), 1347a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 13499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, kBaseRect.height() + 1), 1350a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 1, kBaseRect.fTop, 13529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height()), 1353a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop - 1, 13559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height()), 1356a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13579bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 1, kBaseRect.fTop, 13589bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 2, kBaseRect.height()), 1359a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop - 1, 13619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 2, kBaseRect.height()), 1362a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // zero-w/h rects at each corner of kBaseRect 1365a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 0, 0), true, true, false, false}, 1366a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fRight, kBaseRect.fTop, 0, 0), true, true, false, true}, 1367a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fBottom, 0, 0), true, true, false, true}, 1368a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fRight, kBaseRect.fBottom, 0, 0), true, true, false, true}, 13699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // far away rect 13719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(10 * kBaseRect.fRight, 10 * kBaseRect.fBottom, 13729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), SkIntToScalar(10)), 1373a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, false, false, false}, 13749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // very large rect containing kBaseRect 13769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 5 * kBaseRect.width(), 13779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.fTop - 5 * kBaseRect.height(), 13789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 11 * kBaseRect.width(), 11 * kBaseRect.height()), 1379a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, false, false, false}, 13809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // skinny rect that spans same y-range as kBaseRect 13829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.centerX(), kBaseRect.fTop, 13839bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(1), kBaseRect.height()), 1384a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 13859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // short rect that spans same x-range as kBaseRect 13879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.centerY(), kBaseRect.width(), SkScalar(1)), 1388a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 13899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // skinny rect that spans slightly larger y-range than kBaseRect 13919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.centerX(), kBaseRect.fTop, 13929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(1), kBaseRect.height() + 1), 1393a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 13959bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // short rect that spans slightly larger x-range than kBaseRect 13969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.centerY(), 13979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, SkScalar(1)), 1398a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 13999bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 14009bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14019bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int inv = 0; inv < 4; ++inv) { 140256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (size_t q = 0; q < SK_ARRAY_COUNT(kQueries); ++q) { 14039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect qRect = kQueries[q].fQueryRect; 14049bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com if (inv & 0x1) { 14059bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTSwap(qRect.fLeft, qRect.fRight); 14069bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 14079bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com if (inv & 0x2) { 14089bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTSwap(qRect.fTop, qRect.fBottom); 14099bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 14109bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int d = 0; d < 2; ++d) { 14119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath::Direction dir = d ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 14129bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 14139bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addRect(kBaseRect, dir); 14149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInRect == 14159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 14169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 14189bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addCircle(kCircleC.fX, kCircleC.fY, circleR, dir); 14199bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInCircle == 14209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 14219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14229bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 14239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1], dir); 14249bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInRR == 14259bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 1426a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1427a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1428a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.moveTo(kBaseRect.fLeft + kRRRadii[0], kBaseRect.fTop); 1429a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.cubicTo(kBaseRect.fLeft + kRRRadii[0] / 2, kBaseRect.fTop, 1430a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org kBaseRect.fLeft, kBaseRect.fTop + kRRRadii[1] / 2, 1431a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org kBaseRect.fLeft, kBaseRect.fTop + kRRRadii[1]); 1432a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fLeft, kBaseRect.fBottom); 1433a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fRight, kBaseRect.fBottom); 1434a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fRight, kBaseRect.fTop); 1435a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 1436a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, kQueries[q].fInCubicRR == 1437a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conservativelyContainsRect(qRect)); 1438a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 14399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 14409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // Slightly non-convex shape, shouldn't contain any rects. 14419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 14429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.moveTo(0, 0); 14434b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org path.lineTo(SkIntToScalar(50), 0.05f); 14449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), 0); 14459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), SkIntToScalar(100)); 14469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(0, SkIntToScalar(100)); 14479bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.close(); 14489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(qRect)); 14499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 14509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 14519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // make sure a minimal convex shape works, a right tri with edges along pos x and y axes. 14539bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 14549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.moveTo(0, 0); 14559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), 0); 14569bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(0, SkIntToScalar(100)); 14579bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14589bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // inside, on along top edge 14599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 14609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), 14619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10)))); 14629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // above 14639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect( 14649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect::MakeXYWH(SkIntToScalar(50), 14659bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(-10), 14669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), 14679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10)))); 14689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // to the left 14699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(-10), 14709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5), 14719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5), 14729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5)))); 14739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // outside the diagonal edge 14759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(10), 14769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(200), 14779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(20), 14789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5)))); 147962df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 148062df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org // same as above path and first test but with an extra moveTo. 148162df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.reset(); 148262df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.moveTo(100, 100); 148362df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.moveTo(0, 0); 148462df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.lineTo(SkIntToScalar(100), 0); 148562df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.lineTo(0, SkIntToScalar(100)); 148662df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 148762df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 148862df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org SkIntToScalar(10), 148962df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org SkIntToScalar(10)))); 149062df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 1491a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1492a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(100, 100); 1493a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(0, 0, 1, 1))); 14949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com} 14959bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 1496f32322b9cefd950013ead6f914678580eff20b5breed@google.comstatic void test_isRect_open_close(skiatest::Reporter* reporter) { 1497f32322b9cefd950013ead6f914678580eff20b5breed@google.com SkPath path; 1498f32322b9cefd950013ead6f914678580eff20b5breed@google.com bool isClosed; 1499f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1500f32322b9cefd950013ead6f914678580eff20b5breed@google.com path.moveTo(0, 0); path.lineTo(1, 0); path.lineTo(1, 1); path.lineTo(0, 1); 1501f32322b9cefd950013ead6f914678580eff20b5breed@google.com path.close(); 150205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 1503f32322b9cefd950013ead6f914678580eff20b5breed@google.com REPORTER_ASSERT(reporter, path.isRect(NULL, NULL)); 1504f32322b9cefd950013ead6f914678580eff20b5breed@google.com REPORTER_ASSERT(reporter, path.isRect(&isClosed, NULL)); 1505f32322b9cefd950013ead6f914678580eff20b5breed@google.com REPORTER_ASSERT(reporter, isClosed); 15067e90e8dbb96f2084f7dd4a6a20cb4b880b362438commit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kStroke_PathAsRect == path.asRect(NULL)); 1507f32322b9cefd950013ead6f914678580eff20b5breed@google.com} 1508f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1509f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com// Simple isRect test is inline TestPath, below. 1510f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com// test_isRect provides more extensive testing. 1511f131694617ce0410eafcb01124459382576bb1d9caryclark@google.comstatic void test_isRect(skiatest::Reporter* reporter) { 1512f32322b9cefd950013ead6f914678580eff20b5breed@google.com test_isRect_open_close(reporter); 1513f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1514f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // passing tests (all moveTo / lineTo... 1515f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; 1516f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r2[] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}}; 1517f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r3[] = {{1, 1}, {0, 1}, {0, 0}, {1, 0}}; 1518f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r4[] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}}; 1519f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r5[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; 1520f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r6[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1521f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r7[] = {{1, 1}, {1, 0}, {0, 0}, {0, 1}}; 1522f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r8[] = {{1, 0}, {0, 0}, {0, 1}, {1, 1}}; 1523f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r9[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1524b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint ra[] = {{0, 0}, {0, .5f}, {0, 1}, {.5f, 1}, {1, 1}, {1, .5f}, {1, 0}, {.5f, 0}}; 1525b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint rb[] = {{0, 0}, {.5f, 0}, {1, 0}, {1, .5f}, {1, 1}, {.5f, 1}, {0, 1}, {0, .5f}}; 1526f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint rc[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}; 1527f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint rd[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1528f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint re[] = {{0, 0}, {1, 0}, {1, 0}, {1, 1}, {0, 1}}; 1529bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint rf[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 0}}; 1530d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1531f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // failing tests 1532f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f1[] = {{0, 0}, {1, 0}, {1, 1}}; // too few points 1533f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f2[] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; // diagonal 1534f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f3[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}; // wraps 1535f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f4[] = {{0, 0}, {1, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 1}}; // backs up 1536f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f5[] = {{0, 0}, {1, 0}, {1, 1}, {2, 0}}; // end overshoots 1537f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f6[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 2}}; // end overshoots 1538f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f7[] = {{0, 0}, {1, 0}, {1, 1}, {0, 2}}; // end overshoots 1539f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f8[] = {{0, 0}, {1, 0}, {1, 1}, {1, 0}}; // 'L' 1540bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint f9[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 0}, {2, 0}}; // overlaps 1541bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint fa[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, -1}, {1, -1}}; // non colinear gap 1542bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint fb[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 1}}; // falls short 1543d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 154405ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // no close, but we should detect them as fillably the same as a rect 154505ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; 154605ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}}; 154705ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c3[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}, {0, 0}}; // hit the start 154805ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 154905ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // like c2, but we double-back on ourselves 155005ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d1[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}, {0, 2}}; 155105ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // like c2, but we overshoot the start point 155205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, -1}}; 155305ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d3[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, -1}, {0, 0}}; 1554f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 1555b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com struct IsRectTest { 1556b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint *fPoints; 1557b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com size_t fPointCount; 1558b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fClose; 1559b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fIsRect; 1560b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com } tests[] = { 1561b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r1, SK_ARRAY_COUNT(r1), true, true }, 1562b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r2, SK_ARRAY_COUNT(r2), true, true }, 1563b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r3, SK_ARRAY_COUNT(r3), true, true }, 1564b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r4, SK_ARRAY_COUNT(r4), true, true }, 1565b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r5, SK_ARRAY_COUNT(r5), true, true }, 1566b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r6, SK_ARRAY_COUNT(r6), true, true }, 1567b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r7, SK_ARRAY_COUNT(r7), true, true }, 1568b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r8, SK_ARRAY_COUNT(r8), true, true }, 1569b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r9, SK_ARRAY_COUNT(r9), true, true }, 1570b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { ra, SK_ARRAY_COUNT(ra), true, true }, 1571b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rb, SK_ARRAY_COUNT(rb), true, true }, 1572b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rc, SK_ARRAY_COUNT(rc), true, true }, 1573b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rd, SK_ARRAY_COUNT(rd), true, true }, 1574b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { re, SK_ARRAY_COUNT(re), true, true }, 1575b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rf, SK_ARRAY_COUNT(rf), true, true }, 1576b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1577b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f1, SK_ARRAY_COUNT(f1), true, false }, 1578b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f2, SK_ARRAY_COUNT(f2), true, false }, 1579b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f3, SK_ARRAY_COUNT(f3), true, false }, 1580b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f4, SK_ARRAY_COUNT(f4), true, false }, 1581b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f5, SK_ARRAY_COUNT(f5), true, false }, 1582b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f6, SK_ARRAY_COUNT(f6), true, false }, 1583b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f7, SK_ARRAY_COUNT(f7), true, false }, 1584b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f8, SK_ARRAY_COUNT(f8), true, false }, 1585b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f9, SK_ARRAY_COUNT(f9), true, false }, 1586b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { fa, SK_ARRAY_COUNT(fa), true, false }, 1587b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { fb, SK_ARRAY_COUNT(fb), true, false }, 1588b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 158905ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c1, SK_ARRAY_COUNT(c1), false, true }, 159005ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c2, SK_ARRAY_COUNT(c2), false, true }, 159105ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c3, SK_ARRAY_COUNT(c3), false, true }, 159205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 159305ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d1, SK_ARRAY_COUNT(d1), false, false }, 159405ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d2, SK_ARRAY_COUNT(d2), false, false }, 159505ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d3, SK_ARRAY_COUNT(d3), false, false }, 1596f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com }; 1597b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1598b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com const size_t testCount = SK_ARRAY_COUNT(tests); 1599f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com size_t index; 1600f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com for (size_t testIndex = 0; testIndex < testCount; ++testIndex) { 1601f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPath path; 1602b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.moveTo(tests[testIndex].fPoints[0].fX, tests[testIndex].fPoints[0].fY); 1603b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < tests[testIndex].fPointCount; ++index) { 1604b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.lineTo(tests[testIndex].fPoints[index].fX, tests[testIndex].fPoints[index].fY); 1605f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1606b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fClose) { 1607f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path.close(); 1608f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1609b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, tests[testIndex].fIsRect == path.isRect(NULL)); 1610b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, tests[testIndex].fIsRect == path.isRect(NULL, NULL)); 1611f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com 1612b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fIsRect) { 161356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect computed, expected; 1614b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com expected.set(tests[testIndex].fPoints, tests[testIndex].fPointCount); 161556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, path.isRect(&computed)); 161656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, expected == computed); 16171c9c0d37111e6ff7a74a2908bf62a0d3954f2bb5skia.committer@gmail.com 1618f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com bool isClosed; 1619f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com SkPath::Direction direction, cheapDirection; 1620f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, path.cheapComputeDirection(&cheapDirection)); 16218fd160350ca5f57fbb1b2e03383c5778414a9b48robertphillips@google.com REPORTER_ASSERT(reporter, path.isRect(&isClosed, &direction)); 1622b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, isClosed == tests[testIndex].fClose); 1623f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, direction == cheapDirection); 1624c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org direction = (SkPath::Direction) -1; 16257e90e8dbb96f2084f7dd4a6a20cb4b880b362438commit-bot@chromium.org if (!tests[testIndex].fClose) { 1626c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kFill_PathAsRect == path.asRect()); 1627c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kFill_PathAsRect == path.asRect(&direction)); 1628c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org } else { 1629c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kStroke_PathAsRect == path.asRect()); 1630c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kStroke_PathAsRect == path.asRect(&direction)); 1631c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org } 1632c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, direction == cheapDirection); 1633f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com } else { 1634f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com SkRect computed; 1635f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com computed.set(123, 456, 789, 1011); 1636f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, !path.isRect(&computed)); 1637f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, computed.fLeft == 123 && computed.fTop == 456); 1638f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, computed.fRight == 789 && computed.fBottom == 1011); 1639f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com 1640f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com bool isClosed = (bool) -1; 1641f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com SkPath::Direction direction = (SkPath::Direction) -1; 16428fd160350ca5f57fbb1b2e03383c5778414a9b48robertphillips@google.com REPORTER_ASSERT(reporter, !path.isRect(&isClosed, &direction)); 1643f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, isClosed == (bool) -1); 1644f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, direction == (SkPath::Direction) -1); 1645c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kNone_PathAsRect == path.asRect()); 1646c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kNone_PathAsRect == path.asRect(&direction)); 1647c2abd54edadf94bb86e1635a3515089e4a6a8eeecommit-bot@chromium.org REPORTER_ASSERT(reporter, direction == (SkPath::Direction) -1); 164856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1649f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1650d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1651f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, close then line 1652f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPath path1; 1653f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1654b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 1655f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1656f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1657f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1658f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(1, 0); 1659b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1660d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1661f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, move in the middle 1662f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1663f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1664b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 1665f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1666f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(1, .5f); 1667f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1668f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1669f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1670f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1671b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1672f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 1673f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, move on the edge 1674f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1675b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 1676f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[index - 1].fX, r1[index - 1].fY); 1677f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1678f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1679f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1680b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1681d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1682f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, quad 1683f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1684f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1685b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 1686f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1687f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.quadTo(1, .5f, 1, .5f); 1688f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1689f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1690f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1691f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1692b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1693d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1694f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, cubic 1695f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1696f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1697b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 1698f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1699f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.cubicTo(1, .5f, 1, .5f, 1, .5f); 1700f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1701f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1702f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1703f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1704b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1705f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com} 1706f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 170756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.comstatic void test_isNestedRects(skiatest::Reporter* reporter) { 170856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // passing tests (all moveTo / lineTo... 170983d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // CW 171056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r2[] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}}; 171156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r3[] = {{1, 1}, {0, 1}, {0, 0}, {1, 0}}; 171256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r4[] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}}; 171383d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint r5[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; // CCW 171456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r6[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 171556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r7[] = {{1, 1}, {1, 0}, {0, 0}, {0, 1}}; 171656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r8[] = {{1, 0}, {0, 0}, {0, 1}, {1, 1}}; 171756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r9[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1718b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint ra[] = {{0, 0}, {0, .5f}, {0, 1}, {.5f, 1}, {1, 1}, {1, .5f}, {1, 0}, {.5f, 0}}; // CCW 1719b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint rb[] = {{0, 0}, {.5f, 0}, {1, 0}, {1, .5f}, {1, 1}, {.5f, 1}, {0, 1}, {0, .5f}}; // CW 172083d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint rc[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}; // CW 172183d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint rd[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}; // CCW 172283d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint re[] = {{0, 0}, {1, 0}, {1, 0}, {1, 1}, {0, 1}}; // CW 172356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 172456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // failing tests 172556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f1[] = {{0, 0}, {1, 0}, {1, 1}}; // too few points 172656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f2[] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; // diagonal 172756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f3[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}; // wraps 172856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f4[] = {{0, 0}, {1, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 1}}; // backs up 172956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f5[] = {{0, 0}, {1, 0}, {1, 1}, {2, 0}}; // end overshoots 173056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f6[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 2}}; // end overshoots 173156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f7[] = {{0, 0}, {1, 0}, {1, 1}, {0, 2}}; // end overshoots 173256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f8[] = {{0, 0}, {1, 0}, {1, 1}, {1, 0}}; // 'L' 173356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 173456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // failing, no close 173556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint c1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // close doesn't match 173656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint c2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}}; // ditto 173756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 1738b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com struct IsNestedRectTest { 1739b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint *fPoints; 1740b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com size_t fPointCount; 1741b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPath::Direction fDirection; 1742b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fClose; 1743b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fIsNestedRect; // nests with path.addRect(-1, -1, 2, 2); 1744b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com } tests[] = { 1745b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r1, SK_ARRAY_COUNT(r1), SkPath::kCW_Direction , true, true }, 1746b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r2, SK_ARRAY_COUNT(r2), SkPath::kCW_Direction , true, true }, 1747b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r3, SK_ARRAY_COUNT(r3), SkPath::kCW_Direction , true, true }, 1748b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r4, SK_ARRAY_COUNT(r4), SkPath::kCW_Direction , true, true }, 1749b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r5, SK_ARRAY_COUNT(r5), SkPath::kCCW_Direction, true, true }, 1750b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r6, SK_ARRAY_COUNT(r6), SkPath::kCCW_Direction, true, true }, 1751b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r7, SK_ARRAY_COUNT(r7), SkPath::kCCW_Direction, true, true }, 1752b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r8, SK_ARRAY_COUNT(r8), SkPath::kCCW_Direction, true, true }, 1753b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r9, SK_ARRAY_COUNT(r9), SkPath::kCCW_Direction, true, true }, 1754b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { ra, SK_ARRAY_COUNT(ra), SkPath::kCCW_Direction, true, true }, 1755b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rb, SK_ARRAY_COUNT(rb), SkPath::kCW_Direction, true, true }, 1756b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rc, SK_ARRAY_COUNT(rc), SkPath::kCW_Direction, true, true }, 1757b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rd, SK_ARRAY_COUNT(rd), SkPath::kCCW_Direction, true, true }, 1758b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { re, SK_ARRAY_COUNT(re), SkPath::kCW_Direction, true, true }, 1759b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1760b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f1, SK_ARRAY_COUNT(f1), SkPath::kUnknown_Direction, true, false }, 1761b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f2, SK_ARRAY_COUNT(f2), SkPath::kUnknown_Direction, true, false }, 1762b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f3, SK_ARRAY_COUNT(f3), SkPath::kUnknown_Direction, true, false }, 1763b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f4, SK_ARRAY_COUNT(f4), SkPath::kUnknown_Direction, true, false }, 1764b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f5, SK_ARRAY_COUNT(f5), SkPath::kUnknown_Direction, true, false }, 1765b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f6, SK_ARRAY_COUNT(f6), SkPath::kUnknown_Direction, true, false }, 1766b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f7, SK_ARRAY_COUNT(f7), SkPath::kUnknown_Direction, true, false }, 1767b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f8, SK_ARRAY_COUNT(f8), SkPath::kUnknown_Direction, true, false }, 1768b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1769b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { c1, SK_ARRAY_COUNT(c1), SkPath::kUnknown_Direction, false, false }, 1770b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { c2, SK_ARRAY_COUNT(c2), SkPath::kUnknown_Direction, false, false }, 177156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com }; 177283d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com 1773b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com const size_t testCount = SK_ARRAY_COUNT(tests); 177456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com size_t index; 177556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (int rectFirst = 0; rectFirst <= 1; ++rectFirst) { 177656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (size_t testIndex = 0; testIndex < testCount; ++testIndex) { 177756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPath path; 177856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 177956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 178056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1781b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.moveTo(tests[testIndex].fPoints[0].fX, tests[testIndex].fPoints[0].fY); 1782b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < tests[testIndex].fPointCount; ++index) { 1783b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.lineTo(tests[testIndex].fPoints[index].fX, tests[testIndex].fPoints[index].fY); 178456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1785b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fClose) { 178656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.close(); 178756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 178856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 178956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 179056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1791b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, tests[testIndex].fIsNestedRect == path.isNestedRects(NULL)); 1792b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fIsNestedRect) { 179356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect expected[2], computed[2]; 179483d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPath::Direction expectedDirs[2], computedDirs[2]; 179556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect testBounds; 1796b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com testBounds.set(tests[testIndex].fPoints, tests[testIndex].fPointCount); 179756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com expected[0] = SkRect::MakeLTRB(-1, -1, 2, 2); 179856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com expected[1] = testBounds; 179983d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com if (rectFirst) { 180083d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com expectedDirs[0] = SkPath::kCW_Direction; 180183d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com } else { 180283d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com expectedDirs[0] = SkPath::kCCW_Direction; 180383d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com } 1804b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com expectedDirs[1] = tests[testIndex].fDirection; 180583d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com REPORTER_ASSERT(reporter, path.isNestedRects(computed, computedDirs)); 180656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, expected[0] == computed[0]); 180756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, expected[1] == computed[1]); 180883d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com REPORTER_ASSERT(reporter, expectedDirs[0] == computedDirs[0]); 180983d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com REPORTER_ASSERT(reporter, expectedDirs[1] == computedDirs[1]); 181056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 181156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 181256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 181356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, close then line 181456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPath path1; 181556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 181656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 181756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 181856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1819b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 182056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 182156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 182256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 182356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(1, 0); 182456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 182556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 182656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1827b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isNestedRects(NULL)); 182856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 182956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, move in the middle 183056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 183156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 183256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 183356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 183456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1835b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 183656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 183756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(1, .5f); 183856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 183956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 184056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 184156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 184256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 184356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 184456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1845b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isNestedRects(NULL)); 184656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 184756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, move on the edge 184856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 184956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 185056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 185156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1852b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 185356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[index - 1].fX, r1[index - 1].fY); 185456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 185556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 185656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 185756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 185856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 185956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1860b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isNestedRects(NULL)); 186156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 186256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, quad 186356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 186456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 186556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 186656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 186756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1868b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 186956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 187056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.quadTo(1, .5f, 1, .5f); 187156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 187256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 187356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 187456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 187556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 187656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 187756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1878b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isNestedRects(NULL)); 187956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 188056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, cubic 188156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 188256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 188356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 188456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 188556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 1886b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < SK_ARRAY_COUNT(r1); ++index) { 188756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 188856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.cubicTo(1, .5f, 1, .5f, 1, .5f); 188956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 189056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 189156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 189256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 189356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 189456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 189556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1896b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isNestedRects(NULL)); 18973458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 189856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, not nested 189956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 190056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(1, 1, 3, 3, SkPath::kCW_Direction); 190156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(2, 2, 4, 4, SkPath::kCW_Direction); 1902b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isNestedRects(NULL)); 190356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1904bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com 1905bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com // pass, stroke rect 1906bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPath src, dst; 1907bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com src.addRect(1, 1, 7, 7, SkPath::kCW_Direction); 1908bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPaint strokePaint; 1909bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.setStyle(SkPaint::kStroke_Style); 1910bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.setStrokeWidth(2); 1911bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.getFillPath(src, &dst); 1912b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, dst.isNestedRects(NULL)); 191356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com} 191456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 19152972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.comstatic void write_and_read_back(skiatest::Reporter* reporter, 19162972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkPath& p) { 191719382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org SkWriter32 writer; 19182972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com writer.writePath(p); 19194469938e92d779dff05e745559e67907bbf21e78reed@google.com size_t size = writer.bytesWritten(); 19202972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkAutoMalloc storage(size); 19212972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com writer.flatten(storage.get()); 19222972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkReader32 reader(storage.get(), size); 19232972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 19242972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkPath readBack; 19252972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack != p); 19262972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com reader.readPath(&readBack); 19272972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack == p); 19282972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 1929d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT(reporter, readBack.getConvexityOrUnknown() == 19302972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com p.getConvexityOrUnknown()); 19312972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 19322972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack.isOval(NULL) == p.isOval(NULL)); 19332972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 19342972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkRect& origBounds = p.getBounds(); 19352972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkRect& readBackBounds = readBack.getBounds(); 19362972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 19372972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, origBounds == readBackBounds); 19382972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com} 19392972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 194053effc5e327749ea47bc0c678cb45246644600b0reed@google.comstatic void test_flattening(skiatest::Reporter* reporter) { 194153effc5e327749ea47bc0c678cb45246644600b0reed@google.com SkPath p; 194253effc5e327749ea47bc0c678cb45246644600b0reed@google.com 194353effc5e327749ea47bc0c678cb45246644600b0reed@google.com static const SkPoint pts[] = { 194453effc5e327749ea47bc0c678cb45246644600b0reed@google.com { 0, 0 }, 194553effc5e327749ea47bc0c678cb45246644600b0reed@google.com { SkIntToScalar(10), SkIntToScalar(10) }, 194653effc5e327749ea47bc0c678cb45246644600b0reed@google.com { SkIntToScalar(20), SkIntToScalar(10) }, { SkIntToScalar(20), 0 }, 194753effc5e327749ea47bc0c678cb45246644600b0reed@google.com { 0, 0 }, { 0, SkIntToScalar(10) }, { SkIntToScalar(1), SkIntToScalar(10) } 194853effc5e327749ea47bc0c678cb45246644600b0reed@google.com }; 194953effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.moveTo(pts[0]); 195053effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.lineTo(pts[1]); 195153effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.quadTo(pts[2], pts[3]); 195253effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.cubicTo(pts[4], pts[5], pts[6]); 195353effc5e327749ea47bc0c678cb45246644600b0reed@google.com 19542972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com write_and_read_back(reporter, p); 195594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 195694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com // create a buffer that should be much larger than the path so we don't 195794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com // kill our stack if writer goes too far. 195894e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com char buffer[1024]; 19594faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size1 = p.writeToMemory(NULL); 19604faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size2 = p.writeToMemory(buffer); 196194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size2); 196294e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 196394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com SkPath p2; 19644faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size3 = p2.readFromMemory(buffer, 1024); 196594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size3); 196694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, p == p2); 196794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 1968a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org size3 = p2.readFromMemory(buffer, 0); 1969a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !size3); 1970a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1971a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath tooShort; 1972a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org size3 = tooShort.readFromMemory(buffer, size1 - 1); 1973a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, tooShort.isEmpty()); 1974a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 197594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com char buffer2[1024]; 197694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size3 = p2.writeToMemory(buffer2); 197794e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size3); 197894e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); 19792972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 19802972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com // test persistence of the oval flag & convexity 19812972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com { 19822972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkPath oval; 19832972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkRect rect = SkRect::MakeWH(10, 10); 19842972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com oval.addOval(rect); 19852972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 19862972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com write_and_read_back(reporter, oval); 19872972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com } 198853effc5e327749ea47bc0c678cb45246644600b0reed@google.com} 198953effc5e327749ea47bc0c678cb45246644600b0reed@google.com 199053effc5e327749ea47bc0c678cb45246644600b0reed@google.comstatic void test_transform(skiatest::Reporter* reporter) { 1991b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p; 1992d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1993a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#define CONIC_PERSPECTIVE_BUG_FIXED 0 199453effc5e327749ea47bc0c678cb45246644600b0reed@google.com static const SkPoint pts[] = { 1995a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, // move 1996a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { SkIntToScalar(10), SkIntToScalar(10) }, // line 1997a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { SkIntToScalar(20), SkIntToScalar(10) }, { SkIntToScalar(20), 0 }, // quad 1998a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, { 0, SkIntToScalar(10) }, { SkIntToScalar(1), SkIntToScalar(10) }, // cubic 1999a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_PERSPECTIVE_BUG_FIXED 2000a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, { SkIntToScalar(20), SkIntToScalar(10) }, // conic 2001a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 200253effc5e327749ea47bc0c678cb45246644600b0reed@google.com }; 2003a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org const int kPtCount = SK_ARRAY_COUNT(pts); 2004b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 200553effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.moveTo(pts[0]); 200653effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.lineTo(pts[1]); 200753effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.quadTo(pts[2], pts[3]); 200853effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.cubicTo(pts[4], pts[5], pts[6]); 2009a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_PERSPECTIVE_BUG_FIXED 2010a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(pts[4], pts[5], 0.5f); 2011a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 2012a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 2013b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2014b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2015b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2016b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2017b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2018b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2019b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p == p1); 2020b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2021b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2022b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2023b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2024b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2025b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setScale(SK_Scalar1 * 2, SK_Scalar1 * 3); 2026b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2027b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; // Leave p1 non-unique (i.e., the empty path) 2028b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 20296e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com p.transform(matrix, &p1); 2030b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPoint pts1[kPtCount]; 20316e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com int count = p1.getPoints(pts1, kPtCount); 2032b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, kPtCount == count); 2033b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com for (int i = 0; i < count; ++i) { 2034b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPoint newPt = SkPoint::Make(pts[i].fX * 2, pts[i].fY * 3); 2035b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, newPt == pts1[i]); 2036b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2037b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2038b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2039b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2040b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2041b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2042b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setPerspX(SkScalarToPersp(4)); 2043b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2044b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2045b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); 2046b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2047b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2048b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, matrix.invert(&matrix)); 2049b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.transform(matrix, NULL); 2050b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkRect pBounds = p.getBounds(); 2051b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkRect p1Bounds = p1.getBounds(); 2052b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fLeft, p1Bounds.fLeft)); 2053b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fTop, p1Bounds.fTop)); 2054b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fRight, p1Bounds.fRight)); 2055b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fBottom, p1Bounds.fBottom)); 205653effc5e327749ea47bc0c678cb45246644600b0reed@google.com } 2057b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2058a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2059a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addCircle(0, 0, 1, SkPath::kCW_Direction); 2060b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2061b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2062b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2063b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2064b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2065b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); 2066b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2067b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2068b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p1.cheapIsDirection(SkPath::kCW_Direction)); 2069b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2070b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2071b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2072b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2073b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2074b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2075b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setScaleX(-1); 2076b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2077b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); // Make p1 unique (i.e., not empty path) 2078b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2079b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2080b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p1.cheapIsDirection(SkPath::kCCW_Direction)); 2081b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2082b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2083b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2084b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2085b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setAll(1, 1, 0, 1, 1, 0, 0, 0, 1); 2086b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2087b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); // Make p1 unique (i.e., not empty path) 2088b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2089b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2090b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p1.cheapIsDirection(SkPath::kUnknown_Direction)); 2091b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 209253effc5e327749ea47bc0c678cb45246644600b0reed@google.com} 209353effc5e327749ea47bc0c678cb45246644600b0reed@google.com 20944da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstatic void test_zero_length_paths(skiatest::Reporter* reporter) { 20956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath p; 20967e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org uint8_t verbs[32]; 20977e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 209856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com struct SUPPRESS_VISIBILITY_WARNING zeroPathTestData { 20997e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const char* testPath; 21007e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultPts; 21017e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkRect resultBound; 21027e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPath::Verb* resultVerbs; 21037e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultVerbs; 21047e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 21054da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 21067e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs1[] = { SkPath::kMove_Verb }; 21077e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs2[] = { SkPath::kMove_Verb, SkPath::kMove_Verb }; 21087e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs3[] = { SkPath::kMove_Verb, SkPath::kClose_Verb }; 21097e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs4[] = { SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb }; 21107e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs5[] = { SkPath::kMove_Verb, SkPath::kLine_Verb }; 21117e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs6[] = { SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kMove_Verb, SkPath::kLine_Verb }; 21127e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs7[] = { SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb }; 21137e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs8[] = { 21147e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb 21157e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 21167e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs9[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb }; 21177e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs10[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kMove_Verb, SkPath::kQuad_Verb }; 21187e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs11[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb }; 21197e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs12[] = { 21207e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb 21217e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 21227e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs13[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb }; 21237e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs14[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kMove_Verb, SkPath::kCubic_Verb }; 21247e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs15[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb }; 21257e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs16[] = { 21267e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb 21277e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 21287e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const struct zeroPathTestData gZeroLengthTests[] = { 21297e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "M 1 1", 1, {0, 0, 0, 0}, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2130aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 M 2 1", 2, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs2, SK_ARRAY_COUNT(resultVerbs2) }, 21317e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "M 1 1 z", 1, {0, 0, 0, 0}, resultVerbs3, SK_ARRAY_COUNT(resultVerbs3) }, 2132aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 z M 2 1 z", 2, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs4, SK_ARRAY_COUNT(resultVerbs4) }, 2133aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1", 2, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs5, SK_ARRAY_COUNT(resultVerbs5) }, 2134aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1 M 2 1 L 2 1", 4, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs6, SK_ARRAY_COUNT(resultVerbs6) }, 2135aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1 z", 2, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs7, SK_ARRAY_COUNT(resultVerbs7) }, 2136aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1 z M 2 1 L 2 1 z", 4, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs8, SK_ARRAY_COUNT(resultVerbs8) }, 2137aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 Q 1 1 1 1", 3, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs9, SK_ARRAY_COUNT(resultVerbs9) }, 2138aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 Q 1 1 1 1 M 2 1 Q 2 1 2 1", 6, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs10, SK_ARRAY_COUNT(resultVerbs10) }, 2139aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 Q 1 1 1 1 z", 3, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs11, SK_ARRAY_COUNT(resultVerbs11) }, 2140aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 Q 1 1 1 1 z M 2 1 Q 2 1 2 1 z", 6, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs12, SK_ARRAY_COUNT(resultVerbs12) }, 2141aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 C 1 1 1 1 1 1", 4, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs13, SK_ARRAY_COUNT(resultVerbs13) }, 2142aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 C 1 1 1 1 1 1 M 2 1 C 2 1 2 1 2 1", 8, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs14, 21437e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SK_ARRAY_COUNT(resultVerbs14) 21447e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }, 2145aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 C 1 1 1 1 1 1 z", 4, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs15, SK_ARRAY_COUNT(resultVerbs15) }, 2146aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 C 1 1 1 1 1 1 z M 2 1 C 2 1 2 1 2 1 z", 8, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs16, 21477e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SK_ARRAY_COUNT(resultVerbs16) 21487e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 21497e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 21504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 21517e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gZeroLengthTests); ++i) { 21527e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org p.reset(); 21537e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org bool valid = SkParsePath::FromSVGString(gZeroLengthTests[i].testPath, &p); 21547e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, valid); 21557e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 21567e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].numResultPts == (size_t)p.countPoints()); 21577e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].resultBound == p.getBounds()); 21587e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].numResultVerbs == (size_t)p.getVerbs(verbs, SK_ARRAY_COUNT(verbs))); 21597e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t j = 0; j < gZeroLengthTests[i].numResultVerbs; ++j) { 21607e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].resultVerbs[j] == verbs[j]); 21617e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 2162df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com } 21634da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org} 21644da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 21654da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstruct SegmentInfo { 21664da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkPath fPath; 21674da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org int fPointCount; 21684da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org}; 21694da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 217010296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com#define kCurveSegmentMask (SkPath::kQuad_SegmentMask | SkPath::kCubic_SegmentMask) 217110296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com 21726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_segment_masks(skiatest::Reporter* reporter) { 2173eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com SkPath p, p2; 2174eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com 21756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(0, 0); 21766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.quadTo(100, 100, 200, 200); 21776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, SkPath::kQuad_SegmentMask == p.getSegmentMasks()); 21786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 2179eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2180eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 21816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(100, 100, 200, 200, 300, 300); 21826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, kCurveSegmentMask == p.getSegmentMasks()); 21836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 2184eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2185eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 2186eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com 21876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 21886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(0, 0); 21896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(100, 100, 200, 200, 300, 300); 21906630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_SegmentMask == p.getSegmentMasks()); 2191eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2192eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 2193d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 21946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 21956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 21966630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 21976630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_iter(skiatest::Reporter* reporter) { 21987e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath p; 21996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint pts[4]; 22006630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 22016630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with no path 22026630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Iter noPathIter; 22036630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 22047e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 22056630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that setting an empty path works 22066630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p, false); 22076630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 22087e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 22096630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that close path makes no difference for an empty path 22106630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p, true); 22116630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 22127e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 22136630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with an initial empty path 22146630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Iter iter(p, false); 22156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 22166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 22176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that close path makes no difference 22187e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org iter.setPath(p, true); 22196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 22206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 2221d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 22227e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org struct iterTestData { 22237e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const char* testPath; 22247e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const bool forceClose; 22257e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const bool consumeDegenerates; 22267e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t* numResultPtsPerVerb; 22277e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPoint* resultPts; 22287e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPath::Verb* resultVerbs; 22297e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultVerbs; 22307e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 22327e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs1[] = { SkPath::kDone_Verb }; 22337e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs2[] = { 22347e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kDone_Verb 22357e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22367e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs3[] = { 22377e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 22387e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22397e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs4[] = { 22407e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 22417e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22427e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs5[] = { 22437e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 22447e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22457e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const size_t resultPtsSizes1[] = { 0 }; 2246fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes2[] = { 1, 2, 2, 0 }; 2247fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes3[] = { 1, 2, 2, 2, 1, 0 }; 2248fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes4[] = { 1, 2, 1, 1, 0 }; 2249fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes5[] = { 1, 2, 1, 1, 1, 0 }; 2250aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org static const SkPoint* resultPts1 = 0; 22517e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts2[] = { 22527e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, SK_Scalar1 }, { SK_Scalar1, SK_Scalar1 }, { 0, SK_Scalar1 } 22537e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22547e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts3[] = { 22557e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, SK_Scalar1 }, { SK_Scalar1, SK_Scalar1 }, { 0, SK_Scalar1 }, 22567e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { 0, SK_Scalar1 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 } 22577e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22587e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts4[] = { 22597e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { 0, 0 }, { 0, 0 } 22607e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22617e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts5[] = { 22627e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { 0, 0 }, { 0, 0 } 22637e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22647e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const struct iterTestData gIterTests[] = { 22657e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "M 1 0", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2266aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 M 2 0 M 3 0 M 4 0 M 5 0", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2267aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 M 1 0 M 3 0 M 4 0 M 5 0", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 22687e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 22697e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 22707e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z M 1 0 z z M 2 0 z M 3 0 M 4 0 z", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 22717e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z M 1 0 z z M 2 0 z M 3 0 M 4 0 z", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2272aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 1 L 0 1 M 0 0 z", false, true, resultPtsSizes2, resultPts2, resultVerbs2, SK_ARRAY_COUNT(resultVerbs2) }, 2273aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 1 L 0 1 M 0 0 z", true, true, resultPtsSizes3, resultPts3, resultVerbs3, SK_ARRAY_COUNT(resultVerbs3) }, 2274aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2275aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2276aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", false, false, resultPtsSizes4, resultPts4, resultVerbs4, SK_ARRAY_COUNT(resultVerbs4) }, 2277aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", true, false, resultPtsSizes5, resultPts5, resultVerbs5, SK_ARRAY_COUNT(resultVerbs5) } 22787e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 22807e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gIterTests); ++i) { 22817e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org p.reset(); 22827e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org bool valid = SkParsePath::FromSVGString(gIterTests[i].testPath, &p); 22837e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, valid); 22847e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org iter.setPath(p, gIterTests[i].forceClose); 22857e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org int j = 0, l = 0; 22867e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org do { 22877e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts, gIterTests[i].consumeDegenerates) == gIterTests[i].resultVerbs[j]); 22887e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (int k = 0; k < (int)gIterTests[i].numResultPtsPerVerb[j]; ++k) { 22897e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, pts[k] == gIterTests[i].resultPts[l++]); 22907e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 22917e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } while (gIterTests[i].resultVerbs[j++] != SkPath::kDone_Verb); 22927e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, j == (int)gIterTests[i].numResultVerbs); 22937e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 22946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 2295a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2296a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2297a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2298a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 1); 2299a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 2300a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2301a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, iter.isClosedContour()); 2302a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2303a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2304a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2305a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 1); 2306a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2307a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, iter.isClosedContour()); 2308a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(0, 0); 2309a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(2, 2); 2310a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2311a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2312a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2313a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this checks to see if the NaN logic is executed in SkPath::autoClose(), but does not 2314a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // check to see if the result is correct. 2315a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (int setNaN = 0; setNaN < 4; ++setNaN) { 2316a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2317a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(setNaN == 0 ? SK_ScalarNaN : 0, setNaN == 1 ? SK_ScalarNaN : 0); 2318a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(setNaN == 2 ? SK_ScalarNaN : 1, setNaN == 3 ? SK_ScalarNaN : 1); 2319a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2320a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2321a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2322a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kClose_Verb == iter.next(pts, false)); 2323a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 2324a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2325a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2326a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(0, 0, 0, 0); 2327a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2328a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2329a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kQuad_Verb == iter.next(pts, false)); 2330a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2331a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2332a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2333a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2334a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2335a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(0, 0, 0, 0, 0.5f); 2336a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2337a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2338a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kConic_Verb == iter.next(pts, false)); 2339a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2340a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2341a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2342a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2343a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2344a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.cubicTo(0, 0, 0, 0, 0, 0); 2345a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2346a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2347a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == iter.next(pts, false)); 2348a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2349a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2350a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2351a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2352a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(1, 1); // add a trailing moveto 2353a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2354a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2355a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == iter.next(pts, false)); 2356a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2357a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2358a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2359a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 23606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // The GM degeneratesegments.cpp test is more extensive 23616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 23626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 23636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_raw_iter(skiatest::Reporter* reporter) { 23646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath p; 23656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint pts[4]; 23666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 23676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with no path 23686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::RawIter noPathIter; 23696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 23706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that setting an empty path works 23716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p); 23726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 2373d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 23746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with an initial empty path 23756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::RawIter iter(p); 23766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 23776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 23786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that a move-only path returns the move. 23796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1, 0); 23806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 23816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 23826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 23836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 23846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 23856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 23866630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // No matter how many moves we add, we should get them all back 23876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*2, SK_Scalar1); 23886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*3, SK_Scalar1*2); 23896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 23906630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 23916630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 23926630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 23936630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 23946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 23956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 23966630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 23976630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*3); 23986630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*2); 23996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 24006630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24016630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Initial close is never ever stored 24026630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 24036630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 24046630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 24056630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 24066630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24076630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Move/close sequences 24086630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 24096630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); // Not stored, no purpose 24106630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1, 0); 24116630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 24126630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); // Not stored, no purpose 24136630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*2, SK_Scalar1); 24146630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 24156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*3, SK_Scalar1*2); 24166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*4, SK_Scalar1*3); 24176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 24186630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 24196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 24206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 24216630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 24226630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 24236630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 24246630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 24256630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 24266630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 24276630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 24286630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 24296630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 24306630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 24316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 24326630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*3); 24336630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*2); 24346630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 24356630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*4); 24366630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*3); 24376630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 24386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*4); 24396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*3); 24406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 24416630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24426630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Generate random paths and verify 24436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint randomPts[25]; 24446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int i = 0; i < 5; ++i) { 24456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int j = 0; j < 5; ++j) { 24466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org randomPts[i*5+j].set(SK_Scalar1*i, SK_Scalar1*j); 24476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 24486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 24496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Max of 10 segments, max 3 points per segment 2451e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand(9876543); 24526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint expectedPts[31]; // May have leading moveTo 2453d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com SkPath::Verb expectedVerbs[22]; // May have leading moveTo 24546630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Verb nextVerb; 2455d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com 24566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int i = 0; i < 500; ++i) { 24576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 24586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org bool lastWasClose = true; 24596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org bool haveMoveTo = false; 2460d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com SkPoint lastMoveToPt = { 0, 0 }; 24616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numPoints = 0; 24626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numVerbs = (rand.nextU() >> 16) % 10; 24636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numIterVerbs = 0; 24646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int j = 0; j < numVerbs; ++j) { 24656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org do { 24666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org nextVerb = static_cast<SkPath::Verb>((rand.nextU() >> 16) % SkPath::kDone_Verb); 24676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } while (lastWasClose && nextVerb == SkPath::kClose_Verb); 24686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org switch (nextVerb) { 24696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kMove_Verb: 24706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 24716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(expectedPts[numPoints]); 2472d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com lastMoveToPt = expectedPts[numPoints]; 24736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 1; 24746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 24756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 24766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 24776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kLine_Verb: 24786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2479d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 24806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 24816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 24826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 24836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 24846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.lineTo(expectedPts[numPoints]); 24856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 1; 24866630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 24876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 24886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kQuad_Verb: 24896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2490d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 24916630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 24926630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 24936630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 24946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 24956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 24966630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.quadTo(expectedPts[numPoints], expectedPts[numPoints + 1]); 24976630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 2; 24986630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 24996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2500277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 2501277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com if (!haveMoveTo) { 2502277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints++] = lastMoveToPt; 2503277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 2504277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com haveMoveTo = true; 2505277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com } 2506277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 2507277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 2508277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com p.conicTo(expectedPts[numPoints], expectedPts[numPoints + 1], 2509277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com rand.nextUScalar1() * 4); 2510277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com numPoints += 2; 2511277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com lastWasClose = false; 2512277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 25136630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kCubic_Verb: 25146630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2515d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 25166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 25176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 25186630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 25196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 25206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 25216630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 2] = randomPts[(rand.nextU() >> 16) % 25]; 25226630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(expectedPts[numPoints], expectedPts[numPoints + 1], 25236630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 2]); 25246630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 3; 25256630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 25266630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 25276630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kClose_Verb: 25286630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 2529d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com haveMoveTo = false; 25306630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = true; 25316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2532277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com default: 2533330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com SkDEBUGFAIL("unexpected verb"); 25346630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 25356630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = nextVerb; 25366630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 2537d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 25386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 25396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numVerbs = numIterVerbs; 25406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterVerbs = 0; 25416630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numIterPts = 0; 25426630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint lastMoveTo; 25436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint lastPt; 25446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastMoveTo.set(0, 0); 25456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt.set(0, 0); 25466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org while ((nextVerb = iter.next(pts)) != SkPath::kDone_Verb) { 25476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, nextVerb == expectedVerbs[numIterVerbs]); 25486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterVerbs++; 25496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org switch (nextVerb) { 25506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kMove_Verb: 25516630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints); 25526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == expectedPts[numIterPts]); 25536630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = lastMoveTo = pts[0]; 25546630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 1; 25556630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 25566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kLine_Verb: 25576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 1); 25586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 25596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 25606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[1]; 25616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 1; 25626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 25636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kQuad_Verb: 2564277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 25656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 2); 25666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 25676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 25686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[2] == expectedPts[numIterPts + 1]); 25696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[2]; 25706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 2; 25716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 25726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kCubic_Verb: 25736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 3); 25746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 25756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 25766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[2] == expectedPts[numIterPts + 1]); 25776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[3] == expectedPts[numIterPts + 2]); 25786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[3]; 25796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 3; 25806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 25816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kClose_Verb: 25826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastMoveTo); 25836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = lastMoveTo; 25846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2585277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com default: 2586330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com SkDEBUGFAIL("unexpected verb"); 25876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 25886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 25896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts == numPoints); 25906630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterVerbs == numVerbs); 25916630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 25926630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 25936630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25946aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void check_for_circle(skiatest::Reporter* reporter, 259530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 259630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com bool expectedCircle, 259730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction expectedDir) { 2598466310dbd3073add2ec934e336c30deaaf702eaerobertphillips@google.com SkRect rect = SkRect::MakeEmpty(); 259930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(&rect) == expectedCircle); 260030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(expectedDir)); 2601fbb0ed959de64f16d236d2f0d81ddf5cb318e1feskia.committer@gmail.com 260230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (expectedCircle) { 26036aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, rect.height() == rect.width()); 26046aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 26056aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 26066aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 26076aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_skew(skiatest::Reporter* reporter, 260830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 260930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 26106aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 26116aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 26126aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 26136aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setSkew(SkIntToScalar(3), SkIntToScalar(5)); 26146aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 261530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com // this matrix reverses the direction. 261630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (SkPath::kCCW_Direction == dir) { 261730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCW_Direction; 261830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2619a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCW_Direction == dir); 262030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCCW_Direction; 262130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 262230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, false, dir); 26236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 26246aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 26256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_translate(skiatest::Reporter* reporter, 262630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 262730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 26286aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 26296aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 26306aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // translate at small offset 26316aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 26326aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setTranslate(SkIntToScalar(15), SkIntToScalar(15)); 26336aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 263430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 26356aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 26366aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 26376aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 26386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 26396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // translate at a relatively big offset 26406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setTranslate(SkIntToScalar(1000), SkIntToScalar(1000)); 26416aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 264230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 26436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 26446aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 26456aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_rotate(skiatest::Reporter* reporter, 264630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 264730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 26486aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com for (int angle = 0; angle < 360; ++angle) { 26496aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 26506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 26516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(angle)); 26526aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 26536aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 265430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com // TODO: a rotated circle whose rotated angle is not a multiple of 90 26556aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // degrees is not an oval anymore, this can be improved. we made this 26566aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // for the simplicity of our implementation. 26576aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com if (angle % 90 == 0) { 265830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 26596aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } else { 266030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, false, dir); 26616aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 26626aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 26636aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 26646aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 266530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_x(skiatest::Reporter* reporter, 266630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 266730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 266830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 266930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 267030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 267130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleX(-SK_Scalar1); 267230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 267330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 267430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (SkPath::kCW_Direction == dir) { 267530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCCW_Direction; 267630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2677a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCCW_Direction == dir); 267830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCW_Direction; 267930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 268030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 268130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 268230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 268330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 268430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_y(skiatest::Reporter* reporter, 268530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 268630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 268730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 268830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 268930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 269030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleY(-SK_Scalar1); 269130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 269230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 269330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (SkPath::kCW_Direction == dir) { 269430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCCW_Direction; 269530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2696a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCCW_Direction == dir); 269730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCW_Direction; 269830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 269930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 270030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 270130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 270230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 270330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_xy(skiatest::Reporter* reporter, 270430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 270530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 270630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 270730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 270830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 270930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleX(-SK_Scalar1); 271030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleY(-SK_Scalar1); 271130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 271230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 271330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 271430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 271530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 27166aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_with_direction(skiatest::Reporter* reporter, 27176aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath::Direction dir) { 27186aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 27196aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27206aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle at origin 27216aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(20), dir); 272230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, true, dir); 272330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_rotate(reporter, path, dir); 272430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_translate(reporter, path, dir); 272530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_skew(reporter, path, dir); 27266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27276aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle at an offset at (10, 10) 27286aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 27296aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(SkIntToScalar(10), SkIntToScalar(10), 27306aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkIntToScalar(20), dir); 273130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, true, dir); 273230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_rotate(reporter, path, dir); 273330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_translate(reporter, path, dir); 273430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_skew(reporter, path, dir); 273530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_x(reporter, path, dir); 273630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_y(reporter, path, dir); 273730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_xy(reporter, path, dir); 27386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 27396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_with_add_paths(skiatest::Reporter* reporter) { 27416aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 27426aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath circle; 27436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath rect; 27446aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath empty; 27456aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 274630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com static const SkPath::Direction kCircleDir = SkPath::kCW_Direction; 274730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com static const SkPath::Direction kCircleDirOpposite = SkPath::kCCW_Direction; 274830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 274930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com circle.addCircle(0, 0, SkIntToScalar(10), kCircleDir); 27506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com rect.addRect(SkIntToScalar(5), SkIntToScalar(5), 27516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkIntToScalar(20), SkIntToScalar(20), SkPath::kCW_Direction); 27526aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27536aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix translate; 27546aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com translate.setTranslate(SkIntToScalar(12), SkIntToScalar(12)); 27556aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27560efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com // Although all the path concatenation related operations leave 27570efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com // the path a circle, most mark it as a non-circle for simplicity 27586aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27596aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // empty + circle (translate) 27606aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = empty; 27616aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addPath(circle, translate); 276230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, kCircleDir); 27636aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27646aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle + empty (translate) 27656aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = circle; 27666aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addPath(empty, translate); 27670efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com check_for_circle(reporter, path, true, kCircleDir); 27686aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27696aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // test reverseAddPath 27706aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = circle; 27716aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reverseAddPath(rect); 277230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, kCircleDirOpposite); 27736aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 27746aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27756aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle(skiatest::Reporter* reporter) { 27766aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_direction(reporter, SkPath::kCW_Direction); 27776aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_direction(reporter, SkPath::kCCW_Direction); 27786aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27796aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // multiple addCircle() 27806aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 27816aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 27826aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(20), SkPath::kCW_Direction); 278330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, SkPath::kCW_Direction); 27846aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27856aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // some extra lineTo() would make isOval() fail 27866aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 27876aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 27886aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.lineTo(0, 0); 278930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, SkPath::kCW_Direction); 27906aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27916aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // not back to the original point 27926aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 27936aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 27946aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.setLastPt(SkIntToScalar(5), SkIntToScalar(5)); 279530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, SkPath::kCW_Direction); 27966aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27976aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_add_paths(reporter); 2798a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2799a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test negative radius 2800a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 2801a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addCircle(0, 0, -1, SkPath::kCW_Direction); 2802a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, path.isEmpty()); 28036aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 28046aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28056aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_oval(skiatest::Reporter* reporter) { 28066aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkRect rect; 28076aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 28086aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 28096aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28106aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com rect = SkRect::MakeWH(SkIntToScalar(30), SkIntToScalar(50)); 28116aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addOval(rect); 28126aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28136aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(NULL)); 28146aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28156aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(90)); 28166aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 28176aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 28186aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // an oval rotated 90 degrees is still an oval. 28196aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, tmp.isOval(NULL)); 28206aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28216aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 28226aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(30)); 28236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 28246aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 28256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // an oval rotated 30 degrees is not an oval anymore. 28266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 28276aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28286aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // since empty path being transformed. 28296aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 28306aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 28316aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 28326aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 28336aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 28346aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28356aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // empty path is not an oval 28366aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 28376aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 28386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // only has moveTo()s 28406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 28416aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.moveTo(0, 0); 28426aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.moveTo(SkIntToScalar(10), SkIntToScalar(10)); 28436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 28446aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28456aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // mimic WebKit's calling convention, 28466aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // call moveTo() first and then call addOval() 28476aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 28486aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.moveTo(0, 0); 28496aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addOval(rect); 28506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(NULL)); 28516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28526aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // copy path 28536aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 28546aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 28556aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.addOval(rect); 28566aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = tmp; 28576aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(NULL)); 28586aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 28596aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 2860a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.comstatic void test_empty(skiatest::Reporter* reporter, const SkPath& p) { 2861a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkPath empty; 286280e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 28633abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isEmpty()); 28644da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, 0 == p.countPoints()); 2865df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, 0 == p.countVerbs()); 286610296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com REPORTER_ASSERT(reporter, 0 == p.getSegmentMasks()); 2867b54455e440e66e0b1c30954d226226f49aac26d6reed@google.com REPORTER_ASSERT(reporter, p.isConvex()); 28683abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.getFillType() == SkPath::kWinding_FillType); 28693abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, !p.isInverseFillType()); 2870a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, p == empty); 2871a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, !(p != empty)); 2872a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com} 2873a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 2874a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_rrect_is_convex(skiatest::Reporter* reporter, SkPath* path, 2875a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir) { 287642feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org REPORTER_ASSERT(reporter, path->isConvex()); 2877a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, path->cheapIsDirection(dir)); 287842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org path->setConvexity(SkPath::kUnknown_Convexity); 287942feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org REPORTER_ASSERT(reporter, path->isConvex()); 288042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org path->reset(); 288142feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org} 288242feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org 288342feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.orgstatic void test_rrect(skiatest::Reporter* reporter) { 288442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkPath p; 288542feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkRRect rr; 288642feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkVector radii[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; 288742feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkRect r = {10, 20, 30, 40}; 288842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org rr.setRectRadii(r, radii); 288942feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRRect(rr); 2890a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 289142feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 2892a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 289342feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, &radii[0].fX); 2894a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 289542feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, &radii[0].fX, SkPath::kCCW_Direction); 2896a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 289742feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, radii[1].fX, radii[1].fY); 2898a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 289942feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, radii[1].fX, radii[1].fY, SkPath::kCCW_Direction); 2900a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 2901a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(radii); ++i) { 2902a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkVector save = radii[i]; 2903a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org radii[i].set(0, 0); 2904a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(r, radii); 2905a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 2906a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 2907a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org radii[i] = save; 2908a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 2909a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRoundRect(r, 0, 0); 2910a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect returnedRect; 2911a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isRect(&returnedRect)); 2912a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, returnedRect == r); 2913a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 2914a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkVector zeroRadii[] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; 2915a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(r, zeroRadii); 2916a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 2917a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool closed; 2918a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir; 2919a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isRect(&closed, &dir)); 2920a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, closed); 2921a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCW_Direction == dir); 2922a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 2923a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCW_Direction); 2924a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCW_Direction); 2925a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.isConvex()); 2926a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2927a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 2928a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 2929a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.isConvex()); 2930a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2931a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect emptyR = {10, 20, 10, 30}; 2932a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(emptyR, radii); 2933a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 2934a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 2935a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect largeR = {0, 0, SK_ScalarMax, SK_ScalarMax}; 2936a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(largeR, radii); 2937a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 2938a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 2939a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect infR = {0, 0, SK_ScalarMax, SK_ScalarInfinity}; 2940a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(infR, radii); 2941a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 2942a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 2943a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect tinyR = {0, 0, 1e-9f, 1e-9f}; 2944a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRoundRect(tinyR, 5e-11f, 5e-11f); 2945a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 2946a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 2947a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2948a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_arc(skiatest::Reporter* reporter) { 2949a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 2950a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect emptyOval = {10, 20, 30, 20}; 2951a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, emptyOval.isEmpty()); 2952a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(emptyOval, 1, 2); 2953a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 2954a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2955a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect oval = {10, 20, 30, 40}; 2956a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 0); 2957a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 2958a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2959a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath cwOval; 2960a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org cwOval.addOval(oval); 2961a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 360); 2962a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p == cwOval); 2963a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2964a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath ccwOval; 2965a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org ccwOval.addOval(oval, SkPath::kCCW_Direction); 2966a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, -360); 2967a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p == ccwOval); 2968a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2969a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 180); 2970a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isConvex()); 2971a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.cheapIsDirection(SkPath::kCW_Direction)); 2972a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setConvexity(SkPath::kUnknown_Convexity); 2973a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isConvex()); 2974a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 2975a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2976a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_move(skiatest::Reporter* reporter, SkPath::RawIter* iter, 2977a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x0, SkScalar y0) { 2978a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 2979a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 2980a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kMove_Verb); 2981a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == x0); 2982a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == y0); 2983a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 2984a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2985a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_line(skiatest::Reporter* reporter, SkPath::RawIter* iter, 2986a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 2987a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 2988a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 2989a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kLine_Verb); 2990a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fX == x1); 2991a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fY == y1); 2992a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 2993a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2994a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_quad(skiatest::Reporter* reporter, SkPath::RawIter* iter, 2995a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 2996a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 2997a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 2998a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kQuad_Verb); 2999a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fX == x1); 3000a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fY == y1); 3001a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[2].fX == x2); 3002a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[2].fY == y2); 3003a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3004a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3005a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_done(skiatest::Reporter* reporter, SkPath* p, SkPath::RawIter* iter) { 3006a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3007a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3008a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kDone_Verb); 3009a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3010a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3011a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_done_and_reset(skiatest::Reporter* reporter, SkPath* p, SkPath::RawIter* iter) { 3012a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done(reporter, p, iter); 3013a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p->reset(); 3014a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3015a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3016a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_move_and_reset(skiatest::Reporter* reporter, SkPath* p, 3017a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x0, SkScalar y0) { 3018a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3019a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, x0, y0); 3020a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3021a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3022a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3023a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line_and_reset(skiatest::Reporter* reporter, SkPath* p, 3024a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3025a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3026a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3027a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3028a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3029a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3030a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3031a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line(skiatest::Reporter* reporter, SkPath* p, 3032a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3033a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3034a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3035a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3036a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done(reporter, p, &iter); 3037a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3038a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3039a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line_pair_and_reset(skiatest::Reporter* reporter, SkPath* p, 3040a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3041a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3042a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3043a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3044a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x2, y2); 3045a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3046a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3047a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3048a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_quad_and_reset(skiatest::Reporter* reporter, SkPath* p, 3049a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3050a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3051a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3052a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_quad(reporter, &iter, x1, y1, x2, y2); 3053a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 305442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org} 305542feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org 3056a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_arcTo(skiatest::Reporter* reporter) { 3057a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3058a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(0, 0, 1, 2, 1); 3059a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 0, 0); 3060a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 1, 2, 1); 3061a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3062a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 3, 4, 0); 3063a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3064a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 0, 0, 1); 3065a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3066a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 0, 1, 1, 1); 3067a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pt; 3068a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt.fX == 1 && pt.fY == 1); 3069a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3070a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 0, 1, -1, 1); 3071a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt.fX == 1 && pt.fY == -1); 3072a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3073a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect oval = {1, 2, 3, 4}; 3074a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 0, 0, true); 3075a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3076a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 0, 0, false); 3077a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3078a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 360, 0, true); 3079a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3080a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 360, 0, false); 3081a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3082a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (float sweep = 359, delta = 0.5f; sweep != (float) (sweep + delta); ) { 30834b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org p.arcTo(oval, 0, sweep, false); 3084a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == oval); 3085a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org sweep += delta; 3086a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org delta /= 2; 3087a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3088a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (float sweep = 361, delta = 0.5f; sweep != (float) (sweep - delta);) { 30894b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org p.arcTo(oval, 0, sweep, false); 3090a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == oval); 3091a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org sweep -= delta; 3092a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org delta /= 2; 3093a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3094a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect noOvalWidth = {1, 2, 0, 3}; 3095a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3096a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(noOvalWidth, 0, 360, false); 3097a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3098a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3099a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect noOvalHeight = {1, 2, 3, 1}; 3100a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3101a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(noOvalHeight, 0, 360, false); 3102a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3103a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3104a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3105a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_addPath(skiatest::Reporter* reporter) { 3106a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p, q; 3107a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 2); 3108a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.moveTo(4, 4); 3109a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.lineTo(7, 8); 3110a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.conicTo(8, 7, 6, 5, 0.5f); 3111a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.quadTo(6, 7, 8, 6); 3112a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.cubicTo(5, 6, 7, 8, 7, 5); 3113a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.close(); 3114a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addPath(q, -4, -4); 3115a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect expected = {0, 0, 4, 4}; 3116a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == expected); 3117a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3118a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reverseAddPath(q); 3119a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect reverseExpected = {4, 4, 8, 8}; 3120a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == reverseExpected); 3121a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3122a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 312314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_addPathMode(skiatest::Reporter* reporter, bool explicitMoveTo, bool extend) { 312414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q; 312514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org if (explicitMoveTo) { 312614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(1, 1); 312714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org } 312814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(1, 2); 312914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org if (explicitMoveTo) { 313014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.moveTo(2, 1); 313114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org } 313214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.lineTo(2, 2); 313314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(q, extend ? SkPath::kExtend_AddPathMode : SkPath::kAppend_AddPathMode); 313414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org uint8_t verbs[4]; 313514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org int verbcount = p.getVerbs(verbs, 4); 313614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbcount == 4); 313714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[0] == SkPath::kMove_Verb); 313814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[1] == SkPath::kLine_Verb); 313914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[2] == (extend ? SkPath::kLine_Verb : SkPath::kMove_Verb)); 314014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[3] == SkPath::kLine_Verb); 314114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org} 314214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 314314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_extendClosedPath(skiatest::Reporter* reporter) { 314414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q; 314514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(1, 1); 314614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(1, 2); 314714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(2, 2); 314814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.close(); 314914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.moveTo(2, 1); 315014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.lineTo(2, 3); 315114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(q, SkPath::kExtend_AddPathMode); 315214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org uint8_t verbs[7]; 315314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org int verbcount = p.getVerbs(verbs, 7); 315414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbcount == 7); 315514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[0] == SkPath::kMove_Verb); 315614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[1] == SkPath::kLine_Verb); 315714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[2] == SkPath::kLine_Verb); 315814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[3] == SkPath::kClose_Verb); 315914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[4] == SkPath::kMove_Verb); 316014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[5] == SkPath::kLine_Verb); 316114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[6] == SkPath::kLine_Verb); 316214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 316314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPoint pt; 316414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt)); 316514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(2, 3)); 316614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, p.getPoint(3) == SkPoint::Make(1, 1)); 316714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org} 316814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 316914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_addEmptyPath(skiatest::Reporter* reporter, SkPath::AddPathMode mode) { 317014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q, r; 317114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 1: dst is empty 317214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(2, 1); 317314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(2, 3); 317414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.addPath(p, mode); 317514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q == p); 317614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 2: src is empty 317714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(r, mode); 317814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q == p); 317914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 3: src and dst are empty 318014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.reset(); 318114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.addPath(r, mode); 318214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q.isEmpty()); 3183877c44956dceff038c0e315c8d311b0d581f2680skia.committer@gmail.com} 318414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 3185a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_conicTo_special_case(skiatest::Reporter* reporter) { 3186a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3187a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, -1); 3188a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 3, 4); 3189a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, SK_ScalarInfinity); 3190a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_pair_and_reset(reporter, &p, 1, 2, 3, 4); 3191a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, 1); 3192a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_quad_and_reset(reporter, &p, 1, 2, 3, 4); 3193a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3194a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3195a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_get_point(skiatest::Reporter* reporter) { 3196a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3197a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pt = p.getPoint(0); 3198a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(0, 0)); 3199a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.getLastPt(NULL)); 3200a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.getLastPt(&pt) && pt == SkPoint::Make(0, 0)); 3201a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setLastPt(10, 10); 3202a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org pt = p.getPoint(0); 3203a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(10, 10)); 3204a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(NULL)); 3205a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.rMoveTo(10, 10); 3206a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt == SkPoint::Make(20, 20)); 3207a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3208a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3209a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_contains(skiatest::Reporter* reporter) { 3210a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3211a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kInverseWinding_FillType); 3212a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(0, 0)); 3213a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kWinding_FillType); 3214a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(0, 0)); 3215a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3216a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(6, 8); 3217a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(8, 4); 3218a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test quick reject 3219a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4, 0)); 3220a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(0, 4)); 3221a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4, 10)); 3222a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(10, 4)); 3223a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test various crossings in x 3224a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(5, 7)); 3225a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(6, 7)); 3226a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 7)); 3227a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3228a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3229a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(8, 6); 3230a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(4, 8); 3231a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test various crossings in y 3232a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 5)); 3233a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(7, 6)); 3234a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 7)); 3235a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test quads 3236a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3237a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3238a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(6, 6, 8, 8); 3239a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(6, 8, 4, 8); 3240a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(4, 6, 4, 4); 3241a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3242a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 3243a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3244a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3245a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(6, 6); 3246a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(8, 8, 6, 8); 3247a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(4, 8, 4, 6); 3248a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(4, 4, 6, 6); 3249a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3250a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 3251a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3252a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#define CONIC_CONTAINS_BUG_FIXED 0 3253a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_CONTAINS_BUG_FIXED 3254a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3255a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3256a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(6, 6, 8, 8, 0.5f); 3257a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(6, 8, 4, 8, 0.5f); 3258a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(4, 6, 4, 4, 0.5f); 3259a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3260a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 3261a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 3262a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3263a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test cubics 3264a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[] = {{5, 4}, {6, 5}, {7, 6}, {6, 6}, {4, 6}, {5, 7}, {5, 5}, {5, 4}, {6, 5}, {7, 6}}; 3265a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (int i = 0; i < 3; ++i) { 3266a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3267a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kEvenOdd_FillType); 3268a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(pts[i].fX, pts[i].fY); 3269a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.cubicTo(pts[i + 1].fX, pts[i + 1].fY, pts[i + 2].fX, pts[i + 2].fY, pts[i + 3].fX, pts[i + 3].fY); 3270a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.cubicTo(pts[i + 4].fX, pts[i + 4].fY, pts[i + 5].fX, pts[i + 5].fY, pts[i + 6].fX, pts[i + 6].fY); 3271a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 3272a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5.5f, 5.5f)); 3273a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4.5f, 5.5f)); 3274a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3275a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3276a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 32770efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.comclass PathRefTest_Private { 32780efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.compublic: 32790efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com static void TestPathRef(skiatest::Reporter* reporter) { 32800efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com static const int kRepeatCnt = 10; 32816b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 32820efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com SkAutoTUnref<SkPathRef> pathRef(SkNEW(SkPathRef)); 32836b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 32840efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com SkPathRef::Editor ed(&pathRef); 32856b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 32860efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 32870efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kMove_Verb, kRepeatCnt); 32880efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 32890efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countPoints()); 32900efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 0 == pathRef->getSegmentMasks()); 32910efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 32920efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kMove_Verb == pathRef->atVerb(i)); 32930efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 32940efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 32956b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 32966b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 32970efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 32980efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kLine_Verb, kRepeatCnt); 32990efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 33000efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countPoints()); 33010efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kLine_SegmentMask == pathRef->getSegmentMasks()); 33020efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 33030efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == pathRef->atVerb(i)); 33040efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 33050efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 33066b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 33076b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 33080efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 33090efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kQuad_Verb, kRepeatCnt); 33100efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 33110efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 2*kRepeatCnt == pathRef->countPoints()); 33120efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kQuad_SegmentMask == pathRef->getSegmentMasks()); 33130efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 33140efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kQuad_Verb == pathRef->atVerb(i)); 33150efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 33160efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 33176b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 33186b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 33190efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 33200efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com SkScalar* weights = NULL; 33210efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kConic_Verb, kRepeatCnt, &weights); 33220efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 33230efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 2*kRepeatCnt == pathRef->countPoints()); 33240efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countWeights()); 33250efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kConic_SegmentMask == pathRef->getSegmentMasks()); 33260efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, NULL != weights); 33270efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 33280efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kConic_Verb == pathRef->atVerb(i)); 33290efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 33300efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 33316b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 33326b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 33330efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 33340efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kCubic_Verb, kRepeatCnt); 33350efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 33360efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 3*kRepeatCnt == pathRef->countPoints()); 33370efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kCubic_SegmentMask == pathRef->getSegmentMasks()); 33380efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 33390efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == pathRef->atVerb(i)); 33400efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 33410efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 33426b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 33436b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 33440efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com}; 33456b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 3346a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_operatorEqual(skiatest::Reporter* reporter) { 3347a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath a; 3348a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath b; 3349a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == a); 3350a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3351a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.setFillType(SkPath::kInverseWinding_FillType); 3352a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3353a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3354a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3355a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 1); 3356a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3357a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3358a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3359a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 1); 3360a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org b.lineTo(1, 2); 3361a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3362a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3363a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 2); 3364a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3365a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3366a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3367a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgclass PathTest_Private { 3368a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgpublic: 3369a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org static void TestPathTo(skiatest::Reporter* reporter) { 3370a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p, q; 3371a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(4, 4); 3372a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3373a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line(reporter, &p, 4, 4); 3374a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.moveTo(-4, -4); 3375a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3376a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line(reporter, &p, 4, 4); 3377a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.lineTo(7, 8); 3378a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.conicTo(8, 7, 6, 5, 0.5f); 3379a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.quadTo(6, 7, 8, 6); 3380a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.cubicTo(5, 6, 7, 8, 7, 5); 3381a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.close(); 3382a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3383a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect reverseExpected = {-4, -4, 8, 8}; 3384a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == reverseExpected); 3385a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3386a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org}; 3387a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 338805ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.orgDEF_TEST(Paths, reporter) { 33894e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org test_path_crbug364224(); 33904e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 3391a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkTSize<SkScalar>::Make(3,4); 3392a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 3393a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkPath p, empty; 3394a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkRect bounds, bounds2; 3395a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 33963abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3397d252db03d9650013b545ef9781fe993c07f8f314reed@android.com REPORTER_ASSERT(reporter, p.getBounds().isEmpty()); 339880e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 3399a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this triggers a code path in SkPath::operator= which is otherwise unexercised 3400a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath& self = p; 3401a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p = self; 3402a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3403a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this triggers a code path in SkPath::swap which is otherwise unexercised 3404a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.swap(self); 3405a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 34063abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.set(0, 0, SK_Scalar1, SK_Scalar1); 34076b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 34086b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.addRoundRect(bounds, SK_Scalar1, SK_Scalar1); 34096b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 341010296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com // we have quads or cubics 341110296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com REPORTER_ASSERT(reporter, p.getSegmentMasks() & kCurveSegmentMask); 34124da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 341362047cf1980861234e7367a225928b84ce492c68reed@google.com 34146b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.reset(); 3415a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 341610296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com 34176b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.addOval(bounds); 34186b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 34194da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 342062047cf1980861234e7367a225928b84ce492c68reed@google.com 3421a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com p.rewind(); 3422a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 3423a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 34243abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.addRect(bounds); 34256b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 342610296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com // we have only lines 342710296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com REPORTER_ASSERT(reporter, SkPath::kLine_SegmentMask == p.getSegmentMasks()); 34284da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 34293abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3430a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, p != empty); 3431a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, !(p == empty)); 34323abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3433df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com // do getPoints and getVerbs return the right result 3434df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, p.getPoints(NULL, 0) == 4); 3435df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, p.getVerbs(NULL, 0) == 5); 34363abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com SkPoint pts[4]; 34373abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com int count = p.getPoints(pts, 4); 34383abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, count == 4); 3439df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com uint8_t verbs[6]; 3440df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com verbs[5] = 0xff; 3441df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com p.getVerbs(verbs, 5); 3442df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kMove_Verb == verbs[0]); 3443df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[1]); 3444df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[2]); 3445df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[3]); 3446df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kClose_Verb == verbs[4]); 3447df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, 0xff == verbs[5]); 34483abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds2.set(pts, 4); 34493abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, bounds == bounds2); 345080e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 34513abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.offset(SK_Scalar1*3, SK_Scalar1*4); 34523abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.offset(SK_Scalar1*3, SK_Scalar1*4); 3453d252db03d9650013b545ef9781fe993c07f8f314reed@android.com REPORTER_ASSERT(reporter, bounds == p.getBounds()); 34543abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 34553abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isRect(NULL)); 3456f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com bounds2.setEmpty(); 34573abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isRect(&bounds2)); 34583abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, bounds == bounds2); 345980e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 34603abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com // now force p to not be a rect 34613abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.set(0, 0, SK_Scalar1/2, SK_Scalar1/2); 34623abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.addRect(bounds); 34633abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, !p.isRect(NULL)); 34643abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3465a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_operatorEqual(reporter); 34667e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com test_isLine(reporter); 34677e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com test_isRect(reporter); 346856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com test_isNestedRects(reporter); 34694da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org test_zero_length_paths(reporter); 3470cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com test_direction(reporter); 347104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com test_convexity(reporter); 34727c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com test_convexity2(reporter); 34739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com test_conservativelyContains(reporter); 3474b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com test_close(reporter); 34756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_segment_masks(reporter); 347653effc5e327749ea47bc0c678cb45246644600b0reed@google.com test_flattening(reporter); 347753effc5e327749ea47bc0c678cb45246644600b0reed@google.com test_transform(reporter); 34783563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com test_bounds(reporter); 34796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_iter(reporter); 34806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_raw_iter(reporter); 34816aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle(reporter); 34826aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_oval(reporter); 34838b06f1a7ff6d5a59387a90433064550de20787eereed@google.com test_strokerec(reporter); 3484744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com test_addPoly(reporter); 34850bb18bb264b26afca45452910437c09445e23a3creed@google.com test_isfinite(reporter); 3486ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com test_isfinite_after_transform(reporter); 3487b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com test_arb_round_rect_is_convex(reporter); 3488158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com test_arb_zero_rad_round_rect_is_rect(reporter); 3489a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_addrect(reporter); 3490a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com test_addrect_isfinite(reporter); 349154f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_tricky_cubic(); 349254f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_clipped_cubic(); 349354f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_crbug_170666(); 34947a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com test_bad_cubic_crbug229478(); 34953eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com test_bad_cubic_crbug234190(); 34969c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com test_android_specific_behavior(reporter); 34971ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org test_gen_id(reporter); 34989d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org test_path_close_issue1474(reporter); 3499b58ba8912ab1a372eb60ab111f477b915eb3da4dreed@google.com test_path_to_region(reporter); 350042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org test_rrect(reporter); 3501a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_arc(reporter); 3502a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_arcTo(reporter); 3503a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_addPath(reporter); 350414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, false, false); 350514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, true, false); 350614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, false, true); 350714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, true, true); 350814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_extendClosedPath(reporter); 350914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addEmptyPath(reporter, SkPath::kExtend_AddPathMode); 351014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addEmptyPath(reporter, SkPath::kAppend_AddPathMode); 3511a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_conicTo_special_case(reporter); 3512a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_get_point(reporter); 3513a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_contains(reporter); 3514a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org PathTest_Private::TestPathTo(reporter); 35150efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com PathRefTest_Private::TestPathRef(reporter); 35163abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com} 3517