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" 99aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark#include "SkGeometry.h" 1055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com#include "SkPaint.h" 1104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com#include "SkParse.h" 123e71a887628ff25c806675366b081c70bb10b74dreed@google.com#include "SkParsePath.h" 13026beb52a29a620290fcfb24f1e7e9e75547b80freed#include "SkPathPriv.h" 148b06f1a7ff6d5a59387a90433064550de20787eereed@google.com#include "SkPathEffect.h" 158f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkRRect.h" 166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org#include "SkRandom.h" 1753effc5e327749ea47bc0c678cb45246644600b0reed@google.com#include "SkReader32.h" 1860bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com#include "SkSize.h" 1966a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark#include "SkStream.h" 20435657fd62960ceffb1c3c63f63e836373560bc5halcanary#include "SkStrokeRec.h" 218cae8358f78b81539f1006afe592a37f1604e67creed@google.com#include "SkSurface.h" 229c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#include "SkTypes.h" 239c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#include "SkWriter32.h" 248f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 258cae8358f78b81539f1006afe592a37f1604e67creed@google.com 265bcbe91304ec2515208b5218517579f48874e928reedstatic void set_radii(SkVector radii[4], int index, float rad) { 275bcbe91304ec2515208b5218517579f48874e928reed sk_bzero(radii, sizeof(SkVector) * 4); 285bcbe91304ec2515208b5218517579f48874e928reed radii[index].set(rad, rad); 295bcbe91304ec2515208b5218517579f48874e928reed} 305bcbe91304ec2515208b5218517579f48874e928reed 315bcbe91304ec2515208b5218517579f48874e928reedstatic void test_add_rrect(skiatest::Reporter* reporter, const SkRect& bounds, 325bcbe91304ec2515208b5218517579f48874e928reed const SkVector radii[4]) { 335bcbe91304ec2515208b5218517579f48874e928reed SkRRect rrect; 345bcbe91304ec2515208b5218517579f48874e928reed rrect.setRectRadii(bounds, radii); 355bcbe91304ec2515208b5218517579f48874e928reed REPORTER_ASSERT(reporter, bounds == rrect.rect()); 365bcbe91304ec2515208b5218517579f48874e928reed 375bcbe91304ec2515208b5218517579f48874e928reed SkPath path; 385bcbe91304ec2515208b5218517579f48874e928reed // this line should not assert in the debug build (from validate) 395bcbe91304ec2515208b5218517579f48874e928reed path.addRRect(rrect); 405bcbe91304ec2515208b5218517579f48874e928reed REPORTER_ASSERT(reporter, bounds == path.getBounds()); 415bcbe91304ec2515208b5218517579f48874e928reed} 425bcbe91304ec2515208b5218517579f48874e928reed 435ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclarkstatic void test_skbug_3469(skiatest::Reporter* reporter) { 445ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark SkPath path; 455ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark path.moveTo(20, 20); 465ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark path.quadTo(20, 50, 80, 50); 475ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark path.quadTo(20, 50, 20, 80); 485ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark REPORTER_ASSERT(reporter, !path.isConvex()); 495ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark} 505ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark 515bcbe91304ec2515208b5218517579f48874e928reedstatic void test_skbug_3239(skiatest::Reporter* reporter) { 525bcbe91304ec2515208b5218517579f48874e928reed const float min = SkBits2Float(0xcb7f16c8); /* -16717512.000000 */ 535bcbe91304ec2515208b5218517579f48874e928reed const float max = SkBits2Float(0x4b7f1c1d); /* 16718877.000000 */ 545bcbe91304ec2515208b5218517579f48874e928reed const float big = SkBits2Float(0x4b7f1bd7); /* 16718807.000000 */ 555bcbe91304ec2515208b5218517579f48874e928reed 565bcbe91304ec2515208b5218517579f48874e928reed const float rad = 33436320; 575bcbe91304ec2515208b5218517579f48874e928reed 585bcbe91304ec2515208b5218517579f48874e928reed const SkRect rectx = SkRect::MakeLTRB(min, min, max, big); 595bcbe91304ec2515208b5218517579f48874e928reed const SkRect recty = SkRect::MakeLTRB(min, min, big, max); 605bcbe91304ec2515208b5218517579f48874e928reed 615bcbe91304ec2515208b5218517579f48874e928reed SkVector radii[4]; 625bcbe91304ec2515208b5218517579f48874e928reed for (int i = 0; i < 4; ++i) { 635bcbe91304ec2515208b5218517579f48874e928reed set_radii(radii, i, rad); 645bcbe91304ec2515208b5218517579f48874e928reed test_add_rrect(reporter, rectx, radii); 655bcbe91304ec2515208b5218517579f48874e928reed test_add_rrect(reporter, recty, radii); 665bcbe91304ec2515208b5218517579f48874e928reed } 675bcbe91304ec2515208b5218517579f48874e928reed} 685bcbe91304ec2515208b5218517579f48874e928reed 694e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void make_path_crbug364224(SkPath* path) { 704e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->reset(); 714e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->moveTo(3.747501373f, 2.724499941f); 724e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.747501373f, 3.75f); 734e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.747501373f, 3.88774991f, 3.635501385f, 4.0f, 3.497501373f, 4.0f); 744e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.7475013733f, 4.0f); 754e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.6095013618f, 4.0f, 0.4975013733f, 3.88774991f, 0.4975013733f, 3.75f); 764e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.4975013733f, 1.0f); 774e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.4975013733f, 0.8622499704f, 0.6095013618f, 0.75f, 0.7475013733f,0.75f); 784e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.497501373f, 0.75f); 794e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.50275135f, 0.75f, 3.5070014f, 0.7527500391f, 3.513001442f, 0.753000021f); 804e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.715001345f, 0.5512499809f); 814e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.648251295f, 0.5194999576f, 3.575501442f, 0.4999999702f, 3.497501373f, 0.4999999702f); 824e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.7475013733f, 0.4999999702f); 834e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.4715013802f, 0.4999999702f, 0.2475013733f, 0.7239999771f, 0.2475013733f, 1.0f); 844e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.2475013733f, 3.75f); 854e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.2475013733f, 4.026000023f, 0.4715013504f, 4.25f, 0.7475013733f, 4.25f); 864e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.497501373f, 4.25f); 874e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.773501396f, 4.25f, 3.997501373f, 4.026000023f, 3.997501373f, 3.75f); 884e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.997501373f, 2.474750042f); 894e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.747501373f, 2.724499941f); 904e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->close(); 914e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 924e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 934e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void make_path_crbug364224_simplified(SkPath* path) { 944e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->moveTo(3.747501373f, 2.724499941f); 954e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.648251295f, 0.5194999576f, 3.575501442f, 0.4999999702f, 3.497501373f, 0.4999999702f); 964e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->close(); 974e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 984e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 994e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void test_path_crbug364224() { 1004e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkPath path; 1014e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkPaint paint; 1023054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(84, 88)); 1034e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkCanvas* canvas = surface->getCanvas(); 1044e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 1054e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org make_path_crbug364224_simplified(&path); 1064e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org canvas->drawPath(path, paint); 1074e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 1084e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org make_path_crbug364224(&path); 1094e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org canvas->drawPath(path, paint); 1104e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 1114e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 112fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr/** 113fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr * In debug mode, this path was causing an assertion to fail in 114fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr * SkPathStroker::preJoinTo() and, in Release, the use of an unitialized value. 115fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr */ 116fac4e0e83666ab59373169d6c157d3654cb479a3piotaixrstatic void make_path_crbugskia2820(SkPath* path, skiatest::Reporter* reporter) { 117fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr SkPoint orig, p1, p2, p3; 118fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr orig = SkPoint::Make(1.f, 1.f); 119fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr p1 = SkPoint::Make(1.f - SK_ScalarNearlyZero, 1.f); 120fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr p2 = SkPoint::Make(1.f, 1.f + SK_ScalarNearlyZero); 121fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr p3 = SkPoint::Make(2.f, 2.f); 122fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 123fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->reset(); 124fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->moveTo(orig); 125fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->cubicTo(p1, p2, p3); 126fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->close(); 127fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr} 128fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 129fac4e0e83666ab59373169d6c157d3654cb479a3piotaixrstatic void test_path_crbugskia2820(skiatest::Reporter* reporter) {//GrContext* context) { 130fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr SkPath path; 131fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr make_path_crbugskia2820(&path, reporter); 132fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 133fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 134fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr stroke.setStrokeStyle(2 * SK_Scalar1); 135fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr stroke.applyToPath(&path, path); 136fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr} 137fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 138cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void make_path0(SkPath* path) { 139cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com // from * https://code.google.com/p/skia/issues/detail?id=1706 140cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 141cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->moveTo(146.939f, 1012.84f); 142cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(181.747f, 1009.18f); 143cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(182.165f, 1013.16f); 144cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(147.357f, 1016.82f); 145cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(146.939f, 1012.84f); 146cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->close(); 147cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 148cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 149cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void make_path1(SkPath* path) { 150cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->addRect(SkRect::MakeXYWH(10, 10, 10, 1)); 151cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 152cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 153cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comtypedef void (*PathProc)(SkPath*); 154cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 155cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com/* 156cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * Regression test: we used to crash (overwrite internal storage) during 157cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * construction of the region when the path was INVERSE. That is now fixed, 158cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * so test these regions (which used to assert/crash). 159cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * 160cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * https://code.google.com/p/skia/issues/detail?id=1706 161cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com */ 162cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void test_path_to_region(skiatest::Reporter* reporter) { 163cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com PathProc procs[] = { 164cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com make_path0, 165cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com make_path1, 166cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com }; 167472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 168cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkRegion clip; 169cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com clip.setRect(0, 0, 1255, 1925); 170472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 171cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) { 172cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkPath path; 173cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com procs[i](&path); 174472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 175cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkRegion rgn; 176cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com rgn.setPath(path, clip); 177cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path.toggleInverseFillType(); 178cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com rgn.setPath(path, clip); 179cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com } 180cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 181cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 18256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#if defined(WIN32) 18356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com #define SUPPRESS_VISIBILITY_WARNING 18456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#else 18556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com #define SUPPRESS_VISIBILITY_WARNING __attribute__((visibility("hidden"))) 18656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#endif 18756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 1889d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.orgstatic void test_path_close_issue1474(skiatest::Reporter* reporter) { 1899d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // This test checks that r{Line,Quad,Conic,Cubic}To following a close() 1909d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // are relative to the point we close to, not relative to the point we close from. 1919d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org SkPath path; 1929d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org SkPoint last; 1939d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1949d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rLineTo(). 1959d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 1969d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 1979d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); // Returns us back to 0,0. 1989d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(50, 50); // This should go to 50,50. 1999d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2009d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 2019d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 50 == last.fX); 2029d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 50 == last.fY); 2039d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2049d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rQuadTo(). 2059d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 2069d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 2079d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 2089d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 2099d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rQuadTo(50, 50, 75, 75); 2109d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2119d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 2129d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 75 == last.fX); 2139d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 75 == last.fY); 2149d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2159d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rConicTo(). 2169d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 2179d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 2189d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 2199d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 2209d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rConicTo(50, 50, 85, 85, 2); 2219d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2229d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 2239d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 85 == last.fX); 2249d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 85 == last.fY); 2259d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2269d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rCubicTo(). 2279d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 2289d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 2299d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 2309d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 2319d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rCubicTo(50, 50, 85, 85, 95, 95); 2329d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2339d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 2349d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 95 == last.fX); 2359d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 95 == last.fY); 2369d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org} 2379d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2381ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.orgstatic void test_gen_id(skiatest::Reporter* reporter) { 2391ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org SkPath a, b; 2401ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == b.getGenerationID()); 2411ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2421ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.moveTo(0, 0); 2431ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t z = a.getGenerationID(); 2441ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, z != b.getGenerationID()); 2451ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2461ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.reset(); 2471ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == b.getGenerationID()); 2481ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2491ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.moveTo(1, 1); 2501ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t y = a.getGenerationID(); 2511ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, z != y); 2521ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2531ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org b.moveTo(2, 2); 2541ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t x = b.getGenerationID(); 2551ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, x != y && x != z); 2561ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2571ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.swap(b); 2581ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == y && a.getGenerationID() == x); 2591ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2601ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org b = a; 2611ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == x); 2621ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2631ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org SkPath c(a); 2641ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, c.getGenerationID() == x); 2651ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2661ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.lineTo(3, 3); 2671ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t w = c.getGenerationID(); 2681ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == x); 2691ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == x); 2701ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, w != x); 2711ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 27250da1d8c3b3799ce22b09c83443b476b12a9af8fdjsollen#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK 2731ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org static bool kExpectGenIDToIgnoreFill = false; 2741ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org#else 2751ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org static bool kExpectGenIDToIgnoreFill = true; 2761ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org#endif 2771ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2781ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.toggleInverseFillType(); 2791ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t v = c.getGenerationID(); 2801ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, (v == w) == kExpectGenIDToIgnoreFill); 2811ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2821ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.rewind(); 2831ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, v != c.getGenerationID()); 2841ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org} 2851ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2863eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com// This used to assert in the debug build, as the edges did not all line-up. 2873eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.comstatic void test_bad_cubic_crbug234190() { 2883eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com SkPath path; 2893eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com path.moveTo(13.8509f, 3.16858f); 2903eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com path.cubicTo(-2.35893e+08f, -4.21044e+08f, 2913eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com -2.38991e+08f, -4.26573e+08f, 2923eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com -2.41016e+08f, -4.30188e+08f); 2933eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com 2943eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com SkPaint paint; 2953eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com paint.setAntiAlias(true); 2963054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(84, 88)); 2973eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com surface->getCanvas()->drawPath(path, paint); 2983eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com} 2993eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com 3007a90daf25878a7459ba9fbda581bb97cda034f02reed@google.comstatic void test_bad_cubic_crbug229478() { 3017a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com const SkPoint pts[] = { 302391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4595.91064f, -11596.9873f }, 303391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4597.2168f, -11595.9414f }, 304391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4598.52344f, -11594.8955f }, 305391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4599.83008f, -11593.8496f }, 3067a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com }; 307391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 3087a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPath path; 3097a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com path.moveTo(pts[0]); 3107a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 311391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 3127a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPaint paint; 3137a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.setStyle(SkPaint::kStroke_Style); 3147a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.setStrokeWidth(20); 315391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 3167a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPath dst; 3177a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com // Before the fix, this would infinite-recurse, and run out of stack 3187a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com // because we would keep trying to subdivide a degenerate cubic segment. 31996fcdcc219d2a0d3579719b84b28bede76efba64halcanary paint.getFillPath(path, &dst, nullptr); 3207a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com} 3217a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com 32264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.comstatic void build_path_170666(SkPath& path) { 32364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(17.9459f, 21.6344f); 32464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.545f, -47.8105f); 32564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.545f, -47.8105f); 32664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(131.07f, -47.3888f); 32764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(131.07f, -47.3888f); 32864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.586f, -46.9532f); 32964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.586f, -46.9532f); 33064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 33164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 33264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18085.1f, 31390.5f); 33364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18085.1f, 31390.5f); 33464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 33564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 33664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.3f); 33764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.3f); 33864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17963.5f, 31459.9f); 33964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17963.5f, 31459.9f); 34064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 34164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 34264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9551f, 21.6205f); 34364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9551f, 21.6205f); 34464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(9.47091f, 22.0561f); 34564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(9.47091f, 22.0561f); 34664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9459f, 21.6344f); 34764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9459f, 21.6344f); 34864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close();path.moveTo(0.995934f, 22.4779f); 34964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.986725f, 22.4918f); 35064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.986725f, 22.4918f); 35164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.4f); 35264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.4f); 35364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 35464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 35564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390.1f); 35664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390.1f); 35764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390); 35864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390); 35964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.555f, -47.8244f); 36064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.555f, -47.8244f); 36164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.595f, -46.9671f); 36264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.595f, -46.9671f); 36364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.995934f, 22.4779f); 36464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.995934f, 22.4779f); 36564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close(); 36664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(5.43941f, 25.5223f); 36764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798267, -28871.1f); 36864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798267, -28871.1f); 36964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(3.12512e+06f, -113102); 37064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(3.12512e+06f, -113102); 37164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(5.16324e+06f, -186882, 8.15247e+06f, -295092, 1.1957e+07f, -432813); 37264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.95659e+07f, -708257, 3.04359e+07f, -1.10175e+06f, 4.34798e+07f, -1.57394e+06f); 37364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(6.95677e+07f, -2.51831e+06f, 1.04352e+08f, -3.77748e+06f, 1.39135e+08f, -5.03666e+06f); 37464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.73919e+08f, -6.29583e+06f, 2.08703e+08f, -7.555e+06f, 2.34791e+08f, -8.49938e+06f); 37564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.47835e+08f, -8.97157e+06f, 2.58705e+08f, -9.36506e+06f, 2.66314e+08f, -9.6405e+06f); 37664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.70118e+08f, -9.77823e+06f, 2.73108e+08f, -9.88644e+06f, 2.75146e+08f, -9.96022e+06f); 37764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.76165e+08f, -9.99711e+06f, 2.76946e+08f, -1.00254e+07f, 2.77473e+08f, -1.00444e+07f); 37864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.78271e+08f, -1.00733e+07f); 37964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.78271e+08f, -1.00733e+07f); 38064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.78271e+08f, -1.00733e+07f, 2.08703e+08f, -7.555e+06f, 135.238f, 23.3517f); 38164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(131.191f, 23.4981f, 125.995f, 23.7976f, 123.631f, 24.0206f); 38264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(121.267f, 24.2436f, 122.631f, 24.3056f, 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 path.lineTo(2.77473e+08f, -1.00444e+07f); 38564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.77473e+08f, -1.00444e+07f); 38664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.76946e+08f, -1.00254e+07f, 2.76165e+08f, -9.99711e+06f, 2.75146e+08f, -9.96022e+06f); 38764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.73108e+08f, -9.88644e+06f, 2.70118e+08f, -9.77823e+06f, 2.66314e+08f, -9.6405e+06f); 38864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.58705e+08f, -9.36506e+06f, 2.47835e+08f, -8.97157e+06f, 2.34791e+08f, -8.49938e+06f); 38964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 1.73919e+08f, -6.29583e+06f, 1.39135e+08f, -5.03666e+06f); 39064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.04352e+08f, -3.77749e+06f, 6.95677e+07f, -2.51831e+06f, 4.34798e+07f, -1.57394e+06f); 39164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(3.04359e+07f, -1.10175e+06f, 1.95659e+07f, -708258, 1.1957e+07f, -432814); 39264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(8.15248e+06f, -295092, 5.16324e+06f, -186883, 3.12513e+06f, -113103); 39364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798284, -28872); 39464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798284, -28872); 39564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(22.4044f, 24.6677f); 39664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(22.4044f, 24.6677f); 39764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(22.5186f, 24.5432f, 18.8134f, 24.6337f, 14.1287f, 24.8697f); 39864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(9.4439f, 25.1057f, 5.55359f, 25.3978f, 5.43941f, 25.5223f); 39964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close(); 40064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 40164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 40264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.comstatic void build_path_simple_170666(SkPath& path) { 40364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(126.677f, 24.1591f); 40464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 2.78271e+08f, -1.00733e+07f, 2.78271e+08f, -1.00733e+07f); 40564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 40664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 40764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// This used to assert in the SK_DEBUG build, as the clip step would fail with 40864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// too-few interations in our cubic-line intersection code. That code now runs 40964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// 24 interations (instead of 16). 41054f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_crbug_170666() { 41164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com SkPath path; 41264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com SkPaint paint; 41364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com paint.setAntiAlias(true); 41464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 4153054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(1000, 1000)); 41636df7ed46b41ac31cb2205bfd3ae37659d61e2fbskia.committer@gmail.com 41764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com build_path_simple_170666(path); 41864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com surface->getCanvas()->drawPath(path, paint); 41936df7ed46b41ac31cb2205bfd3ae37659d61e2fbskia.committer@gmail.com 42064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com build_path_170666(path); 42164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com surface->getCanvas()->drawPath(path, paint); 42264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 42364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 424e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark 425e8c5666e0387e70bd921e01558e627af3f1411dbcaryclarkstatic void test_tiny_path_convexity(skiatest::Reporter* reporter, const char* pathBug, 426e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark SkScalar tx, SkScalar ty, SkScalar scale) { 427e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark SkPath smallPath; 428e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark SkAssertResult(SkParsePath::FromSVGString(pathBug, &smallPath)); 429e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark bool smallConvex = smallPath.isConvex(); 430e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark SkPath largePath; 431e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark SkAssertResult(SkParsePath::FromSVGString(pathBug, &largePath)); 432e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark SkMatrix matrix; 433e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark matrix.reset(); 434e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark matrix.preTranslate(100, 100); 435e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark matrix.preScale(scale, scale); 436e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark largePath.transform(matrix); 437e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark bool largeConvex = largePath.isConvex(); 438e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark REPORTER_ASSERT(reporter, smallConvex == largeConvex); 439e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark} 440e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark 441e8c5666e0387e70bd921e01558e627af3f1411dbcaryclarkstatic void test_crbug_493450(skiatest::Reporter* reporter) { 442e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark const char reducedCase[] = 443e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "M0,0" 444e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L0.0002, 0" 445e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L0.0002, 0.0002" 446e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L0.0001, 0.0001" 447e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L0,0.0002" 448e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "Z"; 449e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark test_tiny_path_convexity(reporter, reducedCase, 100, 100, 100000); 450e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark const char originalFiddleData[] = 451e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "M-0.3383152268862998,-0.11217565719203619L-0.33846085183212765,-0.11212264406895281" 452e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.338509393480737,-0.11210607966681395L-0.33857792286700894,-0.1121889121487573" 453e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3383866116636664,-0.11228834570924921L-0.33842087635680235,-0.11246078673250548" 454e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.33809536177201055,-0.11245415228342878L-0.33797257995493996,-0.11216571641452182" 455e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.33802112160354925,-0.11201996164188659L-0.33819815585141844,-0.11218559834671019Z"; 456e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark test_tiny_path_convexity(reporter, originalFiddleData, 280081.4116670522f, 93268.04618493588f, 457e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark 826357.3384828606f); 458e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark} 459e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark 460e8c5666e0387e70bd921e01558e627af3f1411dbcaryclarkstatic void test_crbug_495894(skiatest::Reporter* reporter) { 461e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark const char originalFiddleData[] = 462e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "M-0.34004273849857214,-0.11332803232216355L-0.34008271397389744,-0.11324483772714951" 463e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3401940742265893,-0.11324483772714951L-0.34017694188002134,-0.11329807920275889" 464e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3402026403998733,-0.11333468903941245L-0.34029972369709194,-0.11334134592705701" 465e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3403054344792813,-0.11344121970007795L-0.3403140006525653,-0.11351115418399343" 466e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.34024261587519866,-0.11353446986281181L-0.3402197727464413,-0.11360442946144192" 467e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.34013696640469604,-0.11359110237029302L-0.34009128014718143,-0.1135877707043939" 468e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3400598708451401,-0.11360776134112742L-0.34004273849857214,-0.11355112520064405" 469e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3400113291965308,-0.11355112520064405L-0.3399970522410575,-0.11359110237029302" 470e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.33997135372120546,-0.11355112520064405L-0.3399627875479215,-0.11353780084493197" 471e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3399485105924481,-0.11350782354357004L-0.3400027630232468,-0.11346452910331437" 472e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.3399485105924481,-0.11340126558629839L-0.33993994441916414,-0.11340126558629839" 473e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.33988283659727087,-0.11331804756574679L-0.33989140277055485,-0.11324483772714951" 474e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.33997991989448945,-0.11324483772714951L-0.3399856306766788,-0.11324483772714951" 475e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.34002560615200417,-0.11334467443478255ZM-0.3400684370184241,-0.11338461985124307" 476e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.340154098751264,-0.11341791238732665L-0.340162664924548,-0.1134378899559977" 477e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.34017979727111597,-0.11340126558629839L-0.3401655203156427,-0.11338129083212668" 478e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.34012268944922275,-0.11332137577529414L-0.34007414780061346,-0.11334467443478255Z" 479e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "M-0.3400027630232468,-0.11290567901106024L-0.3400113291965308,-0.11298876531245433" 480e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.33997991989448945,-0.11301535852306784L-0.33990282433493346,-0.11296217481488612" 481e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark "L-0.33993994441916414,-0.11288906492739594Z"; 482e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark test_tiny_path_convexity(reporter, originalFiddleData, 22682.240000000005f,7819.72220766405f, 483e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark 65536); 484e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark} 485e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark 486a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_addrect(skiatest::Reporter* reporter) { 487a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath path; 488a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(0, 0); 489a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 49096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, path.isRect(nullptr)); 491a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 492a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 493a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(FLT_EPSILON, FLT_EPSILON); 494a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 49596fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isRect(nullptr)); 496a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 497a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 498a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.quadTo(0, 0, 0, 0); 499a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 50096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isRect(nullptr)); 501a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 502a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 503a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conicTo(0, 0, 0, 0, 0.5f); 504a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 50596fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isRect(nullptr)); 506a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 507a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 508a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.cubicTo(0, 0, 0, 0, 0, 0); 509a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 51096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isRect(nullptr)); 511a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 512a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 513a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com// Make sure we stay non-finite once we get there (unless we reset or rewind). 514a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.comstatic void test_addrect_isfinite(skiatest::Reporter* reporter) { 515a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com SkPath path; 5168b0e2340e11e973d27aea39ec65e6bc9738224a5skia.committer@gmail.com 517a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 518a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 519a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 520a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.moveTo(0, 0); 521a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.lineTo(SK_ScalarInfinity, 42); 522a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 523a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 524a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 525a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 526a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 527a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.reset(); 528a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 5298b0e2340e11e973d27aea39ec65e6bc9738224a5skia.committer@gmail.com 530a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 531a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 532a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com} 533a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 534848148ec109172f9eef9a26fa23a520cf9072b5creed@google.comstatic void build_big_path(SkPath* path, bool reducedCase) { 535848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com if (reducedCase) { 536848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(577330, 1971.72f); 537848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f); 538848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } else { 539848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(60.1631f, 7.70567f); 540848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(60.1631f, 7.70567f, 0.99474f, 0.901199f); 541848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->lineTo(577379, 1977.77f); 542848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577364, 1979.57f, 577325, 1980.26f); 543848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577286, 1980.95f, 577245, 1980.13f); 544848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577205, 1979.3f, 577187, 1977.45f); 545848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577168, 1975.6f, 577183, 1973.8f); 546848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577198, 1972, 577238, 1971.31f); 547848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577277, 1970.62f, 577317, 1971.45f); 548848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577330, 1971.72f, 577341, 1972.11f); 549848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f); 550848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(306.718f, -32.912f); 551848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(30.531f, 10.0005f, 1502.47f, 13.2804f, 84.3088f, 9.99601f); 552848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 553848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com} 554848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 55554f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_clipped_cubic() { 5563054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(640, 480)); 557848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 558848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // This path used to assert, because our cubic-chopping code incorrectly 559848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // moved control points after the chop. This test should be run in SK_DEBUG 560848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // mode to ensure that we no long assert. 561848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com SkPath path; 562848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com for (int doReducedCase = 0; doReducedCase <= 1; ++doReducedCase) { 563848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com build_big_path(&path, SkToBool(doReducedCase)); 564ff21c2e0ae23da0f4742b47d4d37969a2a18bd99skia.committer@gmail.com 565848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com SkPaint paint; 566848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com for (int doAA = 0; doAA <= 1; ++doAA) { 567848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com paint.setAntiAlias(SkToBool(doAA)); 568848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com surface->getCanvas()->drawPath(path, paint); 569848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 570848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 571848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com} 572848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 5733b2fb981ab8d011077eb6de7eec5fe1f590906b3reedstatic void dump_if_ne(skiatest::Reporter* reporter, const SkRect& expected, const SkRect& bounds) { 5743b2fb981ab8d011077eb6de7eec5fe1f590906b3reed if (expected != bounds) { 5753b2fb981ab8d011077eb6de7eec5fe1f590906b3reed ERRORF(reporter, "path.getBounds() returned [%g %g %g %g], but expected [%g %g %g %g]", 5763b2fb981ab8d011077eb6de7eec5fe1f590906b3reed bounds.left(), bounds.top(), bounds.right(), bounds.bottom(), 5773b2fb981ab8d011077eb6de7eec5fe1f590906b3reed expected.left(), expected.top(), expected.right(), expected.bottom()); 5783b2fb981ab8d011077eb6de7eec5fe1f590906b3reed } 5793b2fb981ab8d011077eb6de7eec5fe1f590906b3reed} 5803b2fb981ab8d011077eb6de7eec5fe1f590906b3reed 58191f283bb4e6ea71bbd4e6efc27befc29118ee543reedstatic void test_bounds_crbug_513799(skiatest::Reporter* reporter) { 58291f283bb4e6ea71bbd4e6efc27befc29118ee543reed SkPath path; 5833b2fb981ab8d011077eb6de7eec5fe1f590906b3reed#if 0 5843b2fb981ab8d011077eb6de7eec5fe1f590906b3reed // As written these tests were failing on LLVM 4.2 MacMini Release mysteriously, so we've 5853b2fb981ab8d011077eb6de7eec5fe1f590906b3reed // rewritten them to avoid this (compiler-bug?). 58691f283bb4e6ea71bbd4e6efc27befc29118ee543reed REPORTER_ASSERT(reporter, SkRect::MakeLTRB(0, 0, 0, 0) == path.getBounds()); 58791f283bb4e6ea71bbd4e6efc27befc29118ee543reed 58891f283bb4e6ea71bbd4e6efc27befc29118ee543reed path.moveTo(-5, -8); 58991f283bb4e6ea71bbd4e6efc27befc29118ee543reed REPORTER_ASSERT(reporter, SkRect::MakeLTRB(-5, -8, -5, -8) == path.getBounds()); 59091f283bb4e6ea71bbd4e6efc27befc29118ee543reed 59191f283bb4e6ea71bbd4e6efc27befc29118ee543reed path.addRect(SkRect::MakeLTRB(1, 2, 3, 4)); 59291f283bb4e6ea71bbd4e6efc27befc29118ee543reed REPORTER_ASSERT(reporter, SkRect::MakeLTRB(-5, -8, 3, 4) == path.getBounds()); 59391f283bb4e6ea71bbd4e6efc27befc29118ee543reed 59491f283bb4e6ea71bbd4e6efc27befc29118ee543reed path.moveTo(1, 2); 59591f283bb4e6ea71bbd4e6efc27befc29118ee543reed REPORTER_ASSERT(reporter, SkRect::MakeLTRB(-5, -8, 3, 4) == path.getBounds()); 5963b2fb981ab8d011077eb6de7eec5fe1f590906b3reed#else 5973b2fb981ab8d011077eb6de7eec5fe1f590906b3reed dump_if_ne(reporter, SkRect::MakeLTRB(0, 0, 0, 0), path.getBounds()); 5983b2fb981ab8d011077eb6de7eec5fe1f590906b3reed 5993b2fb981ab8d011077eb6de7eec5fe1f590906b3reed path.moveTo(-5, -8); // should set the bounds 6003b2fb981ab8d011077eb6de7eec5fe1f590906b3reed dump_if_ne(reporter, SkRect::MakeLTRB(-5, -8, -5, -8), path.getBounds()); 6013b2fb981ab8d011077eb6de7eec5fe1f590906b3reed 6023b2fb981ab8d011077eb6de7eec5fe1f590906b3reed path.addRect(SkRect::MakeLTRB(1, 2, 3, 4)); // should extend the bounds 6033b2fb981ab8d011077eb6de7eec5fe1f590906b3reed dump_if_ne(reporter, SkRect::MakeLTRB(-5, -8, 3, 4), path.getBounds()); 6043b2fb981ab8d011077eb6de7eec5fe1f590906b3reed 6053b2fb981ab8d011077eb6de7eec5fe1f590906b3reed path.moveTo(1, 2); // don't expect this to have changed the bounds 6063b2fb981ab8d011077eb6de7eec5fe1f590906b3reed dump_if_ne(reporter, SkRect::MakeLTRB(-5, -8, 3, 4), path.getBounds()); 6073b2fb981ab8d011077eb6de7eec5fe1f590906b3reed#endif 60891f283bb4e6ea71bbd4e6efc27befc29118ee543reed} 60991f283bb4e6ea71bbd4e6efc27befc29118ee543reed 6108cae8358f78b81539f1006afe592a37f1604e67creed@google.com// Inspired by http://ie.microsoft.com/testdrive/Performance/Chalkboard/ 6118cae8358f78b81539f1006afe592a37f1604e67creed@google.com// which triggered an assert, from a tricky cubic. This test replicates that 6128cae8358f78b81539f1006afe592a37f1604e67creed@google.com// example, so we can ensure that we handle it (in SkEdge.cpp), and don't 6138cae8358f78b81539f1006afe592a37f1604e67creed@google.com// assert in the SK_DEBUG build. 61454f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_tricky_cubic() { 6158cae8358f78b81539f1006afe592a37f1604e67creed@google.com const SkPoint pts[] = { 616055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8943768), SkDoubleToScalar(129.121277) }, 617055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8937435), SkDoubleToScalar(129.121689) }, 618055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8950119), SkDoubleToScalar(129.120422) }, 619055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.5030727), SkDoubleToScalar(129.13121) }, 6208cae8358f78b81539f1006afe592a37f1604e67creed@google.com }; 6218cae8358f78b81539f1006afe592a37f1604e67creed@google.com 6228cae8358f78b81539f1006afe592a37f1604e67creed@google.com SkPath path; 6238cae8358f78b81539f1006afe592a37f1604e67creed@google.com path.moveTo(pts[0]); 6248cae8358f78b81539f1006afe592a37f1604e67creed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 6258cae8358f78b81539f1006afe592a37f1604e67creed@google.com 6268cae8358f78b81539f1006afe592a37f1604e67creed@google.com SkPaint paint; 6278cae8358f78b81539f1006afe592a37f1604e67creed@google.com paint.setAntiAlias(true); 6288cae8358f78b81539f1006afe592a37f1604e67creed@google.com 6293054be16dfdb0d06233770cbfc338958edef44eareed SkSurface* surface = SkSurface::NewRasterN32Premul(19, 130); 6308cae8358f78b81539f1006afe592a37f1604e67creed@google.com surface->getCanvas()->drawPath(path, paint); 6318cae8358f78b81539f1006afe592a37f1604e67creed@google.com surface->unref(); 6328cae8358f78b81539f1006afe592a37f1604e67creed@google.com} 6333abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 634ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com// Inspired by http://code.google.com/p/chromium/issues/detail?id=141651 635ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com// 636ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.comstatic void test_isfinite_after_transform(skiatest::Reporter* reporter) { 637ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com SkPath path; 638ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.quadTo(157, 366, 286, 208); 639ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.arcTo(37, 442, 315, 163, 957494590897113.0f); 640d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 641ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com SkMatrix matrix; 642ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com matrix.setScale(1000*1000, 1000*1000); 643ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 644ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // Be sure that path::transform correctly updates isFinite and the bounds 645ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // if the transformation overflows. The previous bug was that isFinite was 646ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // set to true in this case, but the bounds were not set to empty (which 647ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // they should be). 648ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com while (path.isFinite()) { 649ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isFinite()); 650ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, !path.getBounds().isEmpty()); 651ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.transform(matrix); 652ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com } 653ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isEmpty()); 654ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 655ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com matrix.setTranslate(SK_Scalar1, SK_Scalar1); 656ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.transform(matrix); 657ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // we need to still be non-finite 658ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 659ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isEmpty()); 660ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com} 661ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 6626a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.comstatic void add_corner_arc(SkPath* path, const SkRect& rect, 6636a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.com SkScalar xIn, SkScalar yIn, 664b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com int startAngle) 665b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com{ 666b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 667b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar rx = SkMinScalar(rect.width(), xIn); 668b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar ry = SkMinScalar(rect.height(), yIn); 669b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 670b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkRect arcRect; 671b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.set(-rx, -ry, rx, ry); 672b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com switch (startAngle) { 673b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 0: 674b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom); 675b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 676b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 90: 677b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom); 678b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 679b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 180: 680b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop); 681b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 682b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 270: 683b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop); 684b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 685b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com default: 686b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 687b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 688b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 689b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false); 690b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 691b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 6926a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.comstatic void make_arb_round_rect(SkPath* path, const SkRect& r, 693b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar xCorner, SkScalar yCorner) { 694b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com // we are lazy here and use the same x & y for each corner 695b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 270); 696b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 0); 697b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 90); 698b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 180); 699158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com path->close(); 700b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 701b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 702b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different. 703b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Performance will suffer if they are not convex. 704b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Note: PathBench::ArbRoundRectBench performs almost exactly 705b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with drawing) 706b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.comstatic void test_arb_round_rect_is_convex(skiatest::Reporter* reporter) { 707e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 708b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkRect r; 709b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 710b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com for (int i = 0; i < 5000; ++i) { 711b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 712158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 713158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 714b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com continue; 715b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 716b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 717b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 718158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 719158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 720b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 721b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkPath temp; 722b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 723b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15); 724b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 725b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com REPORTER_ASSERT(reporter, temp.isConvex()); 726b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 727b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 728b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 729158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome will sometimes create a 0 radius round rect. The degenerate 730158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// quads prevent the path from being converted to a rect 731158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Note: PathBench::ArbRoundRectBench performs almost exactly 732158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// the same test (but with drawing) 733158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.comstatic void test_arb_zero_rad_round_rect_is_rect(skiatest::Reporter* reporter) { 734e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 735158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkRect r; 736158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 737158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com for (int i = 0; i < 5000; ++i) { 738158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 739158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 740158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 741158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com continue; 742158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 743158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 744158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 745158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 746158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 747158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 748158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkPath temp; 749158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 750158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, 0, 0); 751158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 752158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkRect result; 753158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com REPORTER_ASSERT(reporter, temp.isRect(&result)); 754158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com REPORTER_ASSERT(reporter, r == result); 755158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 756158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com} 757158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 7580bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_rect_isfinite(skiatest::Reporter* reporter) { 7590bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar inf = SK_ScalarInfinity; 7607abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com const SkScalar negInf = SK_ScalarNegativeInfinity; 7610bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar nan = SK_ScalarNaN; 762d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7630bb18bb264b26afca45452910437c09445e23a3creed@google.com SkRect r; 7640bb18bb264b26afca45452910437c09445e23a3creed@google.com r.setEmpty(); 7650bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isFinite()); 7667abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com r.set(0, 0, inf, negInf); 7670bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isFinite()); 7680bb18bb264b26afca45452910437c09445e23a3creed@google.com r.set(0, 0, nan, 0); 7690bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isFinite()); 770d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7710bb18bb264b26afca45452910437c09445e23a3creed@google.com SkPoint pts[] = { 7720bb18bb264b26afca45452910437c09445e23a3creed@google.com { 0, 0 }, 7730bb18bb264b26afca45452910437c09445e23a3creed@google.com { SK_Scalar1, 0 }, 7740bb18bb264b26afca45452910437c09445e23a3creed@google.com { 0, SK_Scalar1 }, 7750bb18bb264b26afca45452910437c09445e23a3creed@google.com }; 776d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7770bb18bb264b26afca45452910437c09445e23a3creed@google.com bool isFine = r.setBoundsCheck(pts, 3); 7780bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, isFine); 7790bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isEmpty()); 780d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7810bb18bb264b26afca45452910437c09445e23a3creed@google.com pts[1].set(inf, 0); 7820bb18bb264b26afca45452910437c09445e23a3creed@google.com isFine = r.setBoundsCheck(pts, 3); 7830bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !isFine); 7840bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isEmpty()); 785d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7860bb18bb264b26afca45452910437c09445e23a3creed@google.com pts[1].set(nan, 0); 7870bb18bb264b26afca45452910437c09445e23a3creed@google.com isFine = r.setBoundsCheck(pts, 3); 7880bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !isFine); 7890bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isEmpty()); 7900bb18bb264b26afca45452910437c09445e23a3creed@google.com} 7910bb18bb264b26afca45452910437c09445e23a3creed@google.com 7920bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_path_isfinite(skiatest::Reporter* reporter) { 7930bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar inf = SK_ScalarInfinity; 79450c79d886bf435d3a9cad056885370e2c3f526adbsalomon@google.com const SkScalar negInf = SK_ScalarNegativeInfinity; 7950bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar nan = SK_ScalarNaN; 796d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7970bb18bb264b26afca45452910437c09445e23a3creed@google.com SkPath path; 7980bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 7990bb18bb264b26afca45452910437c09445e23a3creed@google.com 8000bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 8010bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 8020bb18bb264b26afca45452910437c09445e23a3creed@google.com 8030bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 8040bb18bb264b26afca45452910437c09445e23a3creed@google.com path.moveTo(SK_Scalar1, 0); 8050bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 8060bb18bb264b26afca45452910437c09445e23a3creed@google.com 8070bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 80850c79d886bf435d3a9cad056885370e2c3f526adbsalomon@google.com path.moveTo(inf, negInf); 8090bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 8100bb18bb264b26afca45452910437c09445e23a3creed@google.com 8110bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 8120bb18bb264b26afca45452910437c09445e23a3creed@google.com path.moveTo(nan, 0); 8130bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 8140bb18bb264b26afca45452910437c09445e23a3creed@google.com} 8150bb18bb264b26afca45452910437c09445e23a3creed@google.com 8160bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_isfinite(skiatest::Reporter* reporter) { 8170bb18bb264b26afca45452910437c09445e23a3creed@google.com test_rect_isfinite(reporter); 8180bb18bb264b26afca45452910437c09445e23a3creed@google.com test_path_isfinite(reporter); 8190bb18bb264b26afca45452910437c09445e23a3creed@google.com} 8200bb18bb264b26afca45452910437c09445e23a3creed@google.com 821b1475b0d41efc580207183a4e25d14e920b57360fsstatic void test_islastcontourclosed(skiatest::Reporter* reporter) { 822b1475b0d41efc580207183a4e25d14e920b57360fs SkPath path; 823b1475b0d41efc580207183a4e25d14e920b57360fs REPORTER_ASSERT(reporter, !path.isLastContourClosed()); 824b1475b0d41efc580207183a4e25d14e920b57360fs path.moveTo(0, 0); 825b1475b0d41efc580207183a4e25d14e920b57360fs REPORTER_ASSERT(reporter, !path.isLastContourClosed()); 826b1475b0d41efc580207183a4e25d14e920b57360fs path.close(); 827b1475b0d41efc580207183a4e25d14e920b57360fs REPORTER_ASSERT(reporter, path.isLastContourClosed()); 828b1475b0d41efc580207183a4e25d14e920b57360fs path.lineTo(100, 100); 829b1475b0d41efc580207183a4e25d14e920b57360fs REPORTER_ASSERT(reporter, !path.isLastContourClosed()); 830b1475b0d41efc580207183a4e25d14e920b57360fs path.moveTo(200, 200); 831b1475b0d41efc580207183a4e25d14e920b57360fs REPORTER_ASSERT(reporter, !path.isLastContourClosed()); 832b1475b0d41efc580207183a4e25d14e920b57360fs path.close(); 833b1475b0d41efc580207183a4e25d14e920b57360fs REPORTER_ASSERT(reporter, path.isLastContourClosed()); 834b1475b0d41efc580207183a4e25d14e920b57360fs path.moveTo(0, 0); 835b1475b0d41efc580207183a4e25d14e920b57360fs REPORTER_ASSERT(reporter, !path.isLastContourClosed()); 836b1475b0d41efc580207183a4e25d14e920b57360fs} 837b1475b0d41efc580207183a4e25d14e920b57360fs 838744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// assert that we always 839744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// start with a moveTo 840744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have 1 moveTo 841744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have Lines after that 842744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// end with a single close 843744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have (at most) 1 close 844744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// 845744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comstatic void test_poly(skiatest::Reporter* reporter, const SkPath& path, 84654f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com const SkPoint srcPts[], bool expectClose) { 847744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPath::RawIter iter(path); 848744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPoint pts[4]; 849744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 850744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com bool firstTime = true; 851744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com bool foundClose = false; 852744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (;;) { 853744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com switch (iter.next(pts)) { 854744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kMove_Verb: 855744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, firstTime); 856744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, pts[0] == srcPts[0]); 857744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com srcPts++; 858744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com firstTime = false; 859744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 860744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kLine_Verb: 861744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !firstTime); 862744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, pts[1] == srcPts[0]); 863744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com srcPts++; 864744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 865744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kQuad_Verb: 866330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected quad verb"); 867744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 868277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 869330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected conic verb"); 870277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 871744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kCubic_Verb: 872330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected cubic verb"); 873744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 874744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kClose_Verb: 875744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !firstTime); 876744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !foundClose); 877744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, expectClose); 878744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com foundClose = true; 879744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 880744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kDone_Verb: 881744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com goto DONE; 882744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 883744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 884744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comDONE: 885744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, foundClose == expectClose); 886744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com} 887744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 888744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comstatic void test_addPoly(skiatest::Reporter* reporter) { 889744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPoint pts[32]; 890e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 891d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 892744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 893744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com pts[i].fX = rand.nextSScalar1(); 894744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com pts[i].fY = rand.nextSScalar1(); 895744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 896744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 897744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (int doClose = 0; doClose <= 1; ++doClose) { 898744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (size_t count = 1; count <= SK_ARRAY_COUNT(pts); ++count) { 899744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPath path; 9009880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon path.addPoly(pts, SkToInt(count), SkToBool(doClose)); 90154f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_poly(reporter, path, pts, SkToBool(doClose)); 902744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 903744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 904744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com} 905744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 9068b06f1a7ff6d5a59387a90433064550de20787eereed@google.comstatic void test_strokerec(skiatest::Reporter* reporter) { 9078b06f1a7ff6d5a59387a90433064550de20787eereed@google.com SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); 9088b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, rec.isFillStyle()); 909d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 9108b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setHairlineStyle(); 9118b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, rec.isHairlineStyle()); 912d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 9138b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(SK_Scalar1, false); 9148b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kStroke_Style == rec.getStyle()); 915d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 9168b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(SK_Scalar1, true); 9178b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kStrokeAndFill_Style == rec.getStyle()); 918d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 9198b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(0, false); 9208b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kHairline_Style == rec.getStyle()); 921d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 9228b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(0, true); 9238b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kFill_Style == rec.getStyle()); 9248b06f1a7ff6d5a59387a90433064550de20787eereed@google.com} 9258b06f1a7ff6d5a59387a90433064550de20787eereed@google.com 92630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com// Set this for paths that don't have a consistent direction such as a bowtie. 92730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com// (cheapComputeDirection is not expected to catch these.) 928026beb52a29a620290fcfb24f1e7e9e75547b80freedconst SkPathPriv::FirstDirection kDontCheckDir = static_cast<SkPathPriv::FirstDirection>(-1); 92930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 93030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void check_direction(skiatest::Reporter* reporter, const SkPath& path, 931026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection expected) { 93230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (expected == kDontCheckDir) { 93330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com return; 93430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 93530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath copy(path); // we make a copy so that we don't cache the result on the passed in path. 93630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 937026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir; 938026beb52a29a620290fcfb24f1e7e9e75547b80freed if (SkPathPriv::CheapComputeFirstDirection(copy, &dir)) { 93930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, dir == expected); 94030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 941026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::kUnknown_FirstDirection == expected); 942f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com } 943f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com} 944f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 9453e71a887628ff25c806675366b081c70bb10b74dreed@google.comstatic void test_direction(skiatest::Reporter* reporter) { 9463e71a887628ff25c806675366b081c70bb10b74dreed@google.com size_t i; 9473e71a887628ff25c806675366b081c70bb10b74dreed@google.com SkPath path; 94896fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !SkPathPriv::CheapComputeFirstDirection(path, nullptr)); 949026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, !SkPathPriv::CheapIsFirstDirection(path, SkPathPriv::kCW_FirstDirection)); 950026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, !SkPathPriv::CheapIsFirstDirection(path, SkPathPriv::kCCW_FirstDirection)); 951026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(path, SkPathPriv::kUnknown_FirstDirection)); 9523e71a887628ff25c806675366b081c70bb10b74dreed@google.com 9533e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gDegen[] = { 9543e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10", 9553e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 M 20 20", 9563e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 L 20 20", 9573e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 L 10 10 L 10 10", 9583e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 Q 10 10 10 10", 9593e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 10 10 10 10 10 10", 9603e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 9613e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gDegen); ++i) { 9623e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 9633e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gDegen[i], &path); 9643e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 96596fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !SkPathPriv::CheapComputeFirstDirection(path, nullptr)); 9663e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 967d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 9683e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gCW[] = { 969cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com "M 10 10 L 10 10 Q 20 10 20 20", 9703e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 20 10 20 20 20 20", 971d414666d18fa9dca1cb310bc66c574aac3d79b72reed@google.com "M 20 10 Q 20 20 30 20 L 10 20", // test double-back at y-max 9724eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // rect with top two corners replaced by cubics with identical middle 9734eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // control points 97420fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 10 10 C 10 0 10 0 20 0 L 40 0 C 50 0 50 0 50 10", 97520fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 20 10 L 0 10 Q 10 10 20 0", // left, degenerate serif 9763e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 9773e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gCW); ++i) { 9783e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 9793e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gCW[i], &path); 9803e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 981026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, path, SkPathPriv::kCW_FirstDirection); 9823e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 983d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 9843e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gCCW[] = { 985cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com "M 10 10 L 10 10 Q 20 10 20 -20", 9863e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 20 10 20 -20 20 -20", 987d414666d18fa9dca1cb310bc66c574aac3d79b72reed@google.com "M 20 10 Q 20 20 10 20 L 30 20", // test double-back at y-max 9884eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // rect with top two corners replaced by cubics with identical middle 9894eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // control points 99020fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 50 10 C 50 0 50 0 40 0 L 20 0 C 10 0 10 0 10 10", 99120fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 10 10 L 30 10 Q 20 10 10 0", // right, degenerate serif 9923e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 9933e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gCCW); ++i) { 9943e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 9953e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gCCW[i], &path); 9963e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 997026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, path, SkPathPriv::kCCW_FirstDirection); 9983e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 999ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com 1000ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com // Test two donuts, each wound a different direction. Only the outer contour 1001ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com // determines the cheap direction 1002ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.reset(); 1003ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(2), SkPath::kCW_Direction); 1004ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(1), SkPath::kCCW_Direction); 1005026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, path, SkPathPriv::kCW_FirstDirection); 1006f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 1007ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.reset(); 1008ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(1), SkPath::kCW_Direction); 1009ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(2), SkPath::kCCW_Direction); 1010026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, path, SkPathPriv::kCCW_FirstDirection); 1011f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 1012f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com // triangle with one point really far from the origin. 1013f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com path.reset(); 1014f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com // the first point is roughly 1.05e10, 1.05e10 10154b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org path.moveTo(SkBits2Float(0x501c7652), SkBits2Float(0x501c7652)); 101653aab7813ca20360426524361941cf43567fc7aebsalomon@google.com path.lineTo(110 * SK_Scalar1, -10 * SK_Scalar1); 101753aab7813ca20360426524361941cf43567fc7aebsalomon@google.com path.lineTo(-10 * SK_Scalar1, 60 * SK_Scalar1); 1018026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, path, SkPathPriv::kCCW_FirstDirection); 1019a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1020a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1021a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conicTo(20, 0, 20, 20, 0.5f); 1022a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 1023026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, path, SkPathPriv::kCW_FirstDirection); 1024a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1025a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1026a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(1, 1e7f); 1027a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(1e7f, 2e7f); 1028a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 1029a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kConvex_Convexity == path.getConvexity()); 1030026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, path, SkPathPriv::kCCW_FirstDirection); 10313e71a887628ff25c806675366b081c70bb10b74dreed@google.com} 10323e71a887628ff25c806675366b081c70bb10b74dreed@google.com 1033ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.comstatic void add_rect(SkPath* path, const SkRect& r) { 1034ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->moveTo(r.fLeft, r.fTop); 1035ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fRight, r.fTop); 1036ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fRight, r.fBottom); 1037ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fLeft, r.fBottom); 1038ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->close(); 1039ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com} 1040ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 1041ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.comstatic void test_bounds(skiatest::Reporter* reporter) { 1042ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com static const SkRect rects[] = { 10433563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(160), SkIntToScalar(610), SkIntToScalar(160) }, 10443563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(610), SkIntToScalar(160), SkIntToScalar(610), SkIntToScalar(199) }, 10453563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(198), SkIntToScalar(610), SkIntToScalar(199) }, 10463563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(160), SkIntToScalar(10), SkIntToScalar(199) }, 1047ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com }; 1048ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 1049ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com SkPath path0, path1; 1050ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(rects); ++i) { 1051ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path0.addRect(rects[i]); 1052ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com add_rect(&path1, rects[i]); 1053ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com } 1054ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 1055ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com REPORTER_ASSERT(reporter, path0.getBounds() == path1.getBounds()); 1056ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com} 1057ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 105855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.comstatic void stroke_cubic(const SkPoint pts[4]) { 105955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPath path; 106055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com path.moveTo(pts[0]); 106155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 1062d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 106355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPaint paint; 106455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.setStyle(SkPaint::kStroke_Style); 106555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.setStrokeWidth(SK_Scalar1 * 2); 1066d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 106755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPath fill; 106855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.getFillPath(path, &fill); 106955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com} 107055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 107155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// just ensure this can run w/o any SkASSERTS firing in the debug build 107255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// we used to assert due to differences in how we determine a degenerate vector 107355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// but that was fixed with the introduction of SkPoint::CanNormalize 107455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.comstatic void stroke_tiny_cubic() { 107555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPoint p0[] = { 107655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 107755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 107855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 107955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 108055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com }; 1081d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 108255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_cubic(p0); 1083d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 108455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPoint p1[] = { 108555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 108655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0007f, 92.000755f }, 108755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 371.99927f, 92.003922f }, 108855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 371.99826f, 92.003899f }, 108955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com }; 1090d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 109155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_cubic(p1); 109255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com} 109355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 1094b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.comstatic void check_close(skiatest::Reporter* reporter, const SkPath& path) { 1095b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com for (int i = 0; i < 2; ++i) { 109609042b80d22837c760bb530124aaa67469b19b8frobertphillips@google.com SkPath::Iter iter(path, SkToBool(i)); 1097b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPoint mv; 1098b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPoint pts[4]; 1099b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath::Verb v; 1100b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com int nMT = 0; 1101b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com int nCL = 0; 1102221db3c3364eb110bc03db78cb09aae51d117b27tomhudson@google.com mv.set(0, 0); 1103b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com while (SkPath::kDone_Verb != (v = iter.next(pts))) { 1104b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com switch (v) { 1105b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com case SkPath::kMove_Verb: 1106b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com mv = pts[0]; 1107b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com ++nMT; 1108b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 1109b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com case SkPath::kClose_Verb: 1110b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com REPORTER_ASSERT(reporter, mv == pts[0]); 1111b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com ++nCL; 1112b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 1113b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com default: 1114b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 1115b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 1116b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 1117b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com // if we force a close on the interator we should have a close 1118b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com // for every moveTo 1119b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com REPORTER_ASSERT(reporter, !i || nMT == nCL); 1120b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 1121b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com} 1122b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1123b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.comstatic void test_close(skiatest::Reporter* reporter) { 1124b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath closePt; 1125b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com closePt.moveTo(0, 0); 1126b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com closePt.close(); 1127b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, closePt); 1128b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1129b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath openPt; 1130b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com openPt.moveTo(0, 0); 1131b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, openPt); 1132b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1133b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath empty; 1134b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, empty); 1135b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com empty.close(); 1136b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, empty); 1137b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1138b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath rect; 1139b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1140b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect); 1141b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect.close(); 1142b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect); 1143b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1144b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath quad; 1145b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com quad.quadTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1146b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, quad); 1147b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com quad.close(); 1148b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, quad); 1149b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1150b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath cubic; 1151d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com quad.cubicTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 1152b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 10*SK_Scalar1, 20 * SK_Scalar1, 20*SK_Scalar1); 1153b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, cubic); 1154b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com cubic.close(); 1155b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, cubic); 1156b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1157b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath line; 1158b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.moveTo(SK_Scalar1, SK_Scalar1); 1159b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.lineTo(10 * SK_Scalar1, 10*SK_Scalar1); 1160b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, line); 1161b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.close(); 1162b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, line); 1163b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1164b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath rect2; 1165b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1166b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.close(); 1167b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1168b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect2); 1169b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.close(); 1170b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect2); 1171b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1172b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath oval3; 1173b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.addOval(SkRect::MakeWH(SK_Scalar1*100,SK_Scalar1*100)); 1174b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.close(); 1175b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.addOval(SkRect::MakeWH(SK_Scalar1*200,SK_Scalar1*200)); 1176b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, oval3); 1177b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.close(); 1178b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, oval3); 1179b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1180b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath moves; 1181b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(SK_Scalar1, SK_Scalar1); 1182b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(5 * SK_Scalar1, SK_Scalar1); 1183b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(SK_Scalar1, 10 * SK_Scalar1); 1184b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(10 *SK_Scalar1, SK_Scalar1); 1185b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, moves); 118655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 118755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_tiny_cubic(); 1188b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com} 1189b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 11907c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.comstatic void check_convexity(skiatest::Reporter* reporter, const SkPath& path, 11917c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath::Convexity expected) { 119230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath copy(path); // we make a copy so that we don't cache the result on the passed in path. 119330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Convexity c = copy.getConvexity(); 11947c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com REPORTER_ASSERT(reporter, c == expected); 11957c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com} 11967c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com 1197b421650e13faa2b77d29b018e78ab07ff693ca32caryclarkstatic void test_path_crbug389050(skiatest::Reporter* reporter) { 1198b421650e13faa2b77d29b018e78ab07ff693ca32caryclark SkPath tinyConvexPolygon; 1199b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.moveTo(600.131559f, 800.112512f); 1200b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.lineTo(600.161735f, 800.118627f); 1201b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.lineTo(600.148962f, 800.142338f); 1202b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.lineTo(600.134891f, 800.137724f); 1203b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.close(); 1204b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.getConvexity(); 1205b421650e13faa2b77d29b018e78ab07ff693ca32caryclark check_convexity(reporter, tinyConvexPolygon, SkPath::kConvex_Convexity); 1206026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, tinyConvexPolygon, SkPathPriv::kCW_FirstDirection); 1207b421650e13faa2b77d29b018e78ab07ff693ca32caryclark 1208b421650e13faa2b77d29b018e78ab07ff693ca32caryclark SkPath platTriangle; 1209b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.moveTo(0, 0); 1210b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(200, 0); 1211b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(100, 0.04f); 1212b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.close(); 1213b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.getConvexity(); 1214026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, platTriangle, SkPathPriv::kCW_FirstDirection); 1215b421650e13faa2b77d29b018e78ab07ff693ca32caryclark 1216b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.reset(); 1217b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.moveTo(0, 0); 1218b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(200, 0); 1219b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(100, 0.03f); 1220b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.close(); 1221b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.getConvexity(); 1222026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, platTriangle, SkPathPriv::kCW_FirstDirection); 1223b421650e13faa2b77d29b018e78ab07ff693ca32caryclark} 1224b421650e13faa2b77d29b018e78ab07ff693ca32caryclark 12257c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.comstatic void test_convexity2(skiatest::Reporter* reporter) { 12267c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath pt; 12277c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com pt.moveTo(0, 0); 12287c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com pt.close(); 1229b54455e440e66e0b1c30954d226226f49aac26d6reed@google.com check_convexity(reporter, pt, SkPath::kConvex_Convexity); 1230026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, pt, SkPathPriv::kUnknown_FirstDirection); 1231d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12327c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath line; 12336c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org line.moveTo(12*SK_Scalar1, 20*SK_Scalar1); 12346c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org line.lineTo(-12*SK_Scalar1, -20*SK_Scalar1); 12357c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com line.close(); 123630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, line, SkPath::kConvex_Convexity); 1237026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, line, SkPathPriv::kUnknown_FirstDirection); 1238d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12397c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath triLeft; 12407c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triLeft.moveTo(0, 0); 12416c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triLeft.lineTo(SK_Scalar1, 0); 12426c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triLeft.lineTo(SK_Scalar1, SK_Scalar1); 12437c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triLeft.close(); 12447c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, triLeft, SkPath::kConvex_Convexity); 1245026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, triLeft, SkPathPriv::kCW_FirstDirection); 1246d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12477c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath triRight; 12487c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triRight.moveTo(0, 0); 12496c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triRight.lineTo(-SK_Scalar1, 0); 12506c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triRight.lineTo(SK_Scalar1, SK_Scalar1); 12517c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triRight.close(); 12527c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, triRight, SkPath::kConvex_Convexity); 1253026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, triRight, SkPathPriv::kCCW_FirstDirection); 1254d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12557c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath square; 12567c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com square.moveTo(0, 0); 12576c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(SK_Scalar1, 0); 12586c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(SK_Scalar1, SK_Scalar1); 12596c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(0, SK_Scalar1); 12607c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com square.close(); 12617c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, square, SkPath::kConvex_Convexity); 1262026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, square, SkPathPriv::kCW_FirstDirection); 1263d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12647c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath redundantSquare; 12657c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.moveTo(0, 0); 12667c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.lineTo(0, 0); 12677c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.lineTo(0, 0); 12686c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 12696c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 12706c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 12716c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 12726c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 12736c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 12746c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 12756c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 12766c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 12777c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.close(); 12787c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, redundantSquare, SkPath::kConvex_Convexity); 1279026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, redundantSquare, SkPathPriv::kCW_FirstDirection); 1280d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12817c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath bowTie; 12827c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.moveTo(0, 0); 12837c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.lineTo(0, 0); 12847c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.lineTo(0, 0); 12856c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 12866c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 12876c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 12886c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 12896c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 12906c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 12916c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 12926c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 12936c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 12947c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.close(); 12957c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, bowTie, SkPath::kConcave_Convexity); 129630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, bowTie, kDontCheckDir); 1297d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12987c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath spiral; 12997c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com spiral.moveTo(0, 0); 13006c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(100*SK_Scalar1, 0); 13016c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(100*SK_Scalar1, 100*SK_Scalar1); 13026c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(0, 100*SK_Scalar1); 13036c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(0, 50*SK_Scalar1); 13046c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(50*SK_Scalar1, 50*SK_Scalar1); 13056c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(50*SK_Scalar1, 75*SK_Scalar1); 13067c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com spiral.close(); 130785b6e399d56d2421980daa432f30910beda41922reed@google.com check_convexity(reporter, spiral, SkPath::kConcave_Convexity); 130830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, spiral, kDontCheckDir); 1309d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 13107c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath dent; 13116c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.moveTo(0, 0); 13126c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(100*SK_Scalar1, 100*SK_Scalar1); 13136c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(0, 100*SK_Scalar1); 13146c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(-50*SK_Scalar1, 200*SK_Scalar1); 13156c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(-200*SK_Scalar1, 100*SK_Scalar1); 13167c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com dent.close(); 13177c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, dent, SkPath::kConcave_Convexity); 1318026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, dent, SkPathPriv::kCW_FirstDirection); 13198be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org 13206950de6c4166fabb35e6c756fc009e0cf1c47819halcanary // https://bug.skia.org/2235 13218be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkPath strokedSin; 13228be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org for (int i = 0; i < 2000; i++) { 13238be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkScalar x = SkIntToScalar(i) / 2; 13248be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkScalar y = 500 - (x + SkScalarSin(x / 100) * 40) / 3; 13258be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org if (0 == i) { 13268be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org strokedSin.moveTo(x, y); 13278be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } else { 13288be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org strokedSin.lineTo(x, y); 13298be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } 13308be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } 13318be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 13328be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org stroke.setStrokeStyle(2 * SK_Scalar1); 13338be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org stroke.applyToPath(&strokedSin, strokedSin); 13348be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org check_convexity(reporter, strokedSin, SkPath::kConcave_Convexity); 13358be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org check_direction(reporter, strokedSin, kDontCheckDir); 1336c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips 1337c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips // http://crbug.com/412640 1338c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips SkPath degenerateConcave; 1339c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.moveTo(148.67912f, 191.875f); 1340c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(470.37695f, 7.5f); 1341c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(148.67912f, 191.875f); 1342c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(41.446522f, 376.25f); 1343c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(-55.971577f, 460.0f); 1344c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(41.446522f, 376.25f); 1345c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips check_convexity(reporter, degenerateConcave, SkPath::kConcave_Convexity); 1346026beb52a29a620290fcfb24f1e7e9e75547b80freed check_direction(reporter, degenerateConcave, SkPathPriv::kUnknown_FirstDirection); 1347f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips 1348f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips // http://crbug.com/433683 1349f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips SkPath badFirstVector; 1350f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.moveTo(501.087708f, 319.610352f); 1351f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(501.087708f, 319.610352f); 1352f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(501.087677f, 319.610321f, 449.271606f, 258.078674f, 395.084564f, 198.711182f); 1353f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(358.967072f, 159.140717f, 321.910553f, 120.650436f, 298.442322f, 101.955399f); 1354f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(301.557678f, 98.044601f); 1355f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(325.283844f, 116.945084f, 362.615204f, 155.720825f, 398.777557f, 195.340454f); 1356f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(453.031860f, 254.781662f, 504.912262f, 316.389618f, 504.912292f, 316.389648f); 1357f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(504.912292f, 316.389648f); 1358f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(501.087708f, 319.610352f); 1359f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.close(); 1360f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips check_convexity(reporter, badFirstVector, SkPath::kConcave_Convexity); 13617c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com} 13627c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com 13636b82d1adc6a4726e36674e468ff1157e0b75373freed@android.comstatic void check_convex_bounds(skiatest::Reporter* reporter, const SkPath& p, 13646b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com const SkRect& bounds) { 13656b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p.isConvex()); 13666b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p.getBounds() == bounds); 136762047cf1980861234e7367a225928b84ce492c68reed@google.com 13686b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com SkPath p2(p); 13696b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p2.isConvex()); 13706b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p2.getBounds() == bounds); 13716b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 13726b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com SkPath other; 13736b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com other.swap(p2); 13746b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, other.isConvex()); 13756b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, other.getBounds() == bounds); 13766b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com} 13776b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 137804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.comstatic void setFromString(SkPath* path, const char str[]) { 137904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com bool first = true; 138004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com while (str) { 138104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkScalar x, y; 138204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com str = SkParse::FindScalar(str, &x); 138396fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == str) { 138404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com break; 138504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 138604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com str = SkParse::FindScalar(str, &y); 138704863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkASSERT(str); 138804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com if (first) { 138904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path->moveTo(x, y); 139004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com first = false; 139104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } else { 139204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path->lineTo(x, y); 139304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 139404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 139504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com} 139604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 139704863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.comstatic void test_convexity(skiatest::Reporter* reporter) { 139804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath path; 139904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 140030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1401e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addCircle(0, 0, SkIntToScalar(10)); 140230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1403e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addCircle(0, 0, SkIntToScalar(10)); // 2nd circle 140430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConcave_Convexity); 140530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 140604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path.reset(); 1407e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addRect(0, 0, SkIntToScalar(10), SkIntToScalar(10), SkPath::kCCW_Direction); 140830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1409026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(path, SkPathPriv::kCCW_FirstDirection)); 141030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 141104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path.reset(); 1412e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addRect(0, 0, SkIntToScalar(10), SkIntToScalar(10), SkPath::kCW_Direction); 141330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1414026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(path, SkPathPriv::kCW_FirstDirection)); 1415d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 141604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com static const struct { 1417026beb52a29a620290fcfb24f1e7e9e75547b80freed const char* fPathStr; 1418026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPath::Convexity fExpectedConvexity; 1419026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection fExpectedDirection; 142004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } gRec[] = { 1421026beb52a29a620290fcfb24f1e7e9e75547b80freed { "", SkPath::kConvex_Convexity, SkPathPriv::kUnknown_FirstDirection }, 1422026beb52a29a620290fcfb24f1e7e9e75547b80freed { "0 0", SkPath::kConvex_Convexity, SkPathPriv::kUnknown_FirstDirection }, 1423026beb52a29a620290fcfb24f1e7e9e75547b80freed { "0 0 10 10", SkPath::kConvex_Convexity, SkPathPriv::kUnknown_FirstDirection }, 1424026beb52a29a620290fcfb24f1e7e9e75547b80freed { "0 0 10 10 20 20 0 0 10 10", SkPath::kConcave_Convexity, SkPathPriv::kUnknown_FirstDirection }, 1425026beb52a29a620290fcfb24f1e7e9e75547b80freed { "0 0 10 10 10 20", SkPath::kConvex_Convexity, SkPathPriv::kCW_FirstDirection }, 1426026beb52a29a620290fcfb24f1e7e9e75547b80freed { "0 0 10 10 10 0", SkPath::kConvex_Convexity, SkPathPriv::kCCW_FirstDirection }, 142730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 10 0 0 10", SkPath::kConcave_Convexity, kDontCheckDir }, 1428026beb52a29a620290fcfb24f1e7e9e75547b80freed { "0 0 10 0 0 10 -10 -10", SkPath::kConcave_Convexity, SkPathPriv::kCW_FirstDirection }, 142904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com }; 143004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 143104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 143204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath path; 143304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com setFromString(&path, gRec[i].fPathStr); 143430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, gRec[i].fExpectedConvexity); 143530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, gRec[i].fExpectedDirection); 1436a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // check after setting the initial convex and direction 1437a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org if (kDontCheckDir != gRec[i].fExpectedDirection) { 1438a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath copy(path); 1439026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir; 1440026beb52a29a620290fcfb24f1e7e9e75547b80freed bool foundDir = SkPathPriv::CheapComputeFirstDirection(copy, &dir); 1441026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, (gRec[i].fExpectedDirection == SkPathPriv::kUnknown_FirstDirection) 1442a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org ^ foundDir); 1443a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !foundDir || gRec[i].fExpectedDirection == dir); 1444a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_convexity(reporter, copy, gRec[i].fExpectedConvexity); 1445a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 1446a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, gRec[i].fExpectedConvexity == path.getConvexity()); 1447a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_direction(reporter, path, gRec[i].fExpectedDirection); 144804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 1449d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1450d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark static const SkPoint nonFinitePts[] = { 1451d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarInfinity, 0 }, 1452d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarInfinity }, 1453d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarInfinity, SK_ScalarInfinity }, 1454d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNegativeInfinity, 0}, 1455d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarNegativeInfinity }, 1456d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNegativeInfinity, SK_ScalarNegativeInfinity }, 1457d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNegativeInfinity, SK_ScalarInfinity }, 1458d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarInfinity, SK_ScalarNegativeInfinity }, 1459d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNaN, 0 }, 1460d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarNaN }, 1461d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNaN, SK_ScalarNaN }, 1462d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark }; 1463d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1464d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark const size_t nonFinitePtsCount = sizeof(nonFinitePts) / sizeof(nonFinitePts[0]); 1465d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1466d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark static const SkPoint finitePts[] = { 1467d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMax, 0 }, 1468d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarMax }, 1469d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMax, SK_ScalarMax }, 1470d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMin, 0 }, 1471d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarMin }, 1472d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMin, SK_ScalarMin }, 1473d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark }; 1474d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1475d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark const size_t finitePtsCount = sizeof(finitePts) / sizeof(finitePts[0]); 1476d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1477d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark for (int index = 0; index < (int) (13 * nonFinitePtsCount * finitePtsCount); ++index) { 1478d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int i = (int) (index % nonFinitePtsCount); 1479d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int f = (int) (index % finitePtsCount); 1480d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int g = (int) ((f + 1) % finitePtsCount); 1481d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path.reset(); 1482d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark switch (index % 13) { 1483d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 0: path.lineTo(nonFinitePts[i]); break; 1484d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 1: path.quadTo(nonFinitePts[i], nonFinitePts[i]); break; 1485d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 2: path.quadTo(nonFinitePts[i], finitePts[f]); break; 1486d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 3: path.quadTo(finitePts[f], nonFinitePts[i]); break; 1487d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 4: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[f]); break; 1488d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 5: path.cubicTo(finitePts[f], nonFinitePts[i], finitePts[f]); break; 1489d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 6: path.cubicTo(finitePts[f], finitePts[f], nonFinitePts[i]); break; 1490d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 7: path.cubicTo(nonFinitePts[i], nonFinitePts[i], finitePts[f]); break; 1491d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 8: path.cubicTo(nonFinitePts[i], finitePts[f], nonFinitePts[i]); break; 1492d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 9: path.cubicTo(finitePts[f], nonFinitePts[i], nonFinitePts[i]); break; 1493d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 10: path.cubicTo(nonFinitePts[i], nonFinitePts[i], nonFinitePts[i]); break; 1494d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 11: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[g]); break; 1495d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 12: path.moveTo(nonFinitePts[i]); break; 1496d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1497d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark check_convexity(reporter, path, SkPath::kUnknown_Convexity); 1498d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1499d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1500d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark for (int index = 0; index < (int) (11 * finitePtsCount); ++index) { 1501d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int f = (int) (index % finitePtsCount); 1502d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int g = (int) ((f + 1) % finitePtsCount); 1503d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path.reset(); 1504d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int curveSelect = index % 11; 1505d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark switch (curveSelect) { 1506d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 0: path.moveTo(finitePts[f]); break; 1507d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 1: path.lineTo(finitePts[f]); break; 1508d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 2: path.quadTo(finitePts[f], finitePts[f]); break; 1509d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 3: path.quadTo(finitePts[f], finitePts[g]); break; 1510d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 4: path.quadTo(finitePts[g], finitePts[f]); break; 1511d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 5: path.cubicTo(finitePts[f], finitePts[f], finitePts[f]); break; 1512d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 6: path.cubicTo(finitePts[f], finitePts[f], finitePts[g]); break; 1513d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 7: path.cubicTo(finitePts[f], finitePts[g], finitePts[f]); break; 1514d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 8: path.cubicTo(finitePts[f], finitePts[g], finitePts[g]); break; 1515d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 9: path.cubicTo(finitePts[g], finitePts[f], finitePts[f]); break; 1516d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 10: path.cubicTo(finitePts[g], finitePts[f], finitePts[g]); break; 1517d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1518d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark check_convexity(reporter, path, curveSelect == 0 ? SkPath::kConvex_Convexity 1519d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark : SkPath::kUnknown_Convexity); 1520d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1521d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 152204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com} 152304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 15247e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.comstatic void test_isLine(skiatest::Reporter* reporter) { 15257e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com SkPath path; 15267e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com SkPoint pts[2]; 15277e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar value = SkIntToScalar(5); 15287e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 152996fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isLine(nullptr)); 1530d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 15317e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // set some non-zero values 15327e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com pts[0].set(value, value); 15337e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com pts[1].set(value, value); 15347e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 15357e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // check that pts was untouched 15367e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(value, value)); 15377e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(value, value)); 15387e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 15397e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar moveX = SkIntToScalar(1); 15407e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar moveY = SkIntToScalar(2); 1541a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, value != moveX && value != moveY); 15427e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 15437e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.moveTo(moveX, moveY); 154496fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isLine(nullptr)); 15457e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 15467e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // check that pts was untouched 15477e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(value, value)); 15487e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(value, value)); 15497e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 15507e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar lineX = SkIntToScalar(2); 15517e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar lineY = SkIntToScalar(2); 1552a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, value != lineX && value != lineY); 15537e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 15547e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.lineTo(lineX, lineY); 155596fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, path.isLine(nullptr)); 15567e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 15577e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !pts[0].equals(moveX, moveY)); 15587e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !pts[1].equals(lineX, lineY)); 15597e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, path.isLine(pts)); 15607e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(moveX, moveY)); 15617e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(lineX, lineY)); 15627e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 15637e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.lineTo(0, 0); // too many points/verbs 156496fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isLine(nullptr)); 15657e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 15667e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(moveX, moveY)); 15677e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(lineX, lineY)); 1568a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1569a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1570a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.quadTo(1, 1, 2, 2); 157196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path.isLine(nullptr)); 15727e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com} 15737e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 15749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comstatic void test_conservativelyContains(skiatest::Reporter* reporter) { 15759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath path; 15769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // kBaseRect is used to construct most our test paths: a rect, a circle, and a round-rect. 15789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBaseRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 15799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // A circle that bounds kBaseRect (with a significant amount of slop) 15819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkScalar circleR = SkMaxScalar(kBaseRect.width(), kBaseRect.height()); 1582a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org circleR = SkScalarMul(circleR, 1.75f) / 2; 15839bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkPoint kCircleC = {kBaseRect.centerX(), kBaseRect.centerY()}; 15849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // round-rect radii 15869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkScalar kRRRadii[] = {SkIntToScalar(5), SkIntToScalar(3)}; 1587cec8de68217186d0f5676a696de44343aaa61de7skia.committer@gmail.com 158856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com static const struct SUPPRESS_VISIBILITY_WARNING { 15899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect fQueryRect; 15909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInRect; 15919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInCircle; 15929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInRR; 1593a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool fInCubicRR; 15949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } kQueries[] = { 1595a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {kBaseRect, true, true, false, false}, 15969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // rect well inside of kBaseRect 15984b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org {SkRect::MakeLTRB(kBaseRect.fLeft + 0.25f*kBaseRect.width(), 15994b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fTop + 0.25f*kBaseRect.height(), 16004b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fRight - 0.25f*kBaseRect.width(), 16014b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fBottom - 0.25f*kBaseRect.height()), 1602a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 16039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16049bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // rects with edges off by one from kBaseRect's edges 16059bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 16069bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height() + 1), 1607a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16089bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 16099bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, kBaseRect.height()), 1610a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 16129bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, kBaseRect.height() + 1), 1613a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 1, kBaseRect.fTop, 16159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height()), 1616a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop - 1, 16189bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height()), 1619a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 1, kBaseRect.fTop, 16219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 2, kBaseRect.height()), 1622a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop - 1, 16249bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 2, kBaseRect.height()), 1625a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16269bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16279bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // zero-w/h rects at each corner of kBaseRect 1628a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 0, 0), true, true, false, false}, 1629a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fRight, kBaseRect.fTop, 0, 0), true, true, false, true}, 1630a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fBottom, 0, 0), true, true, false, true}, 1631a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fRight, kBaseRect.fBottom, 0, 0), true, true, false, true}, 16329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // far away rect 16349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(10 * kBaseRect.fRight, 10 * kBaseRect.fBottom, 16359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), SkIntToScalar(10)), 1636a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, false, false, false}, 16379bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16389bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // very large rect containing kBaseRect 16399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 5 * kBaseRect.width(), 16409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.fTop - 5 * kBaseRect.height(), 16419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 11 * kBaseRect.width(), 11 * kBaseRect.height()), 1642a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, false, false, false}, 16439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // skinny rect that spans same y-range as kBaseRect 16459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.centerX(), kBaseRect.fTop, 16469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(1), kBaseRect.height()), 1647a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 16489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // short rect that spans same x-range as kBaseRect 16509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.centerY(), kBaseRect.width(), SkScalar(1)), 1651a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 16529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16539bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // skinny rect that spans slightly larger y-range than kBaseRect 16549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.centerX(), kBaseRect.fTop, 16559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(1), kBaseRect.height() + 1), 1656a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16579bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16589bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // short rect that spans slightly larger x-range than kBaseRect 16599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.centerY(), 16609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, SkScalar(1)), 1661a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 16629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 16639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int inv = 0; inv < 4; ++inv) { 166556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (size_t q = 0; q < SK_ARRAY_COUNT(kQueries); ++q) { 16669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect qRect = kQueries[q].fQueryRect; 16679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com if (inv & 0x1) { 16689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTSwap(qRect.fLeft, qRect.fRight); 16699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 16709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com if (inv & 0x2) { 16719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTSwap(qRect.fTop, qRect.fBottom); 16729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 16739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int d = 0; d < 2; ++d) { 16749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath::Direction dir = d ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 16759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 16769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addRect(kBaseRect, dir); 16779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInRect == 16789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 16799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 16819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addCircle(kCircleC.fX, kCircleC.fY, circleR, dir); 16829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInCircle == 16839bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 16849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 16869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1], dir); 16879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInRR == 16889bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 1689a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1690a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1691a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.moveTo(kBaseRect.fLeft + kRRRadii[0], kBaseRect.fTop); 1692a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.cubicTo(kBaseRect.fLeft + kRRRadii[0] / 2, kBaseRect.fTop, 1693a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org kBaseRect.fLeft, kBaseRect.fTop + kRRRadii[1] / 2, 1694a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org kBaseRect.fLeft, kBaseRect.fTop + kRRRadii[1]); 1695a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fLeft, kBaseRect.fBottom); 1696a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fRight, kBaseRect.fBottom); 1697a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fRight, kBaseRect.fTop); 1698a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 1699a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, kQueries[q].fInCubicRR == 1700a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conservativelyContainsRect(qRect)); 1701a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 17029bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 17039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // Slightly non-convex shape, shouldn't contain any rects. 17049bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 17059bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.moveTo(0, 0); 17064b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org path.lineTo(SkIntToScalar(50), 0.05f); 17079bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), 0); 17089bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), SkIntToScalar(100)); 17099bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(0, SkIntToScalar(100)); 17109bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.close(); 17119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(qRect)); 17129bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 17139bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 17149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 17159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // make sure a minimal convex shape works, a right tri with edges along pos x and y axes. 17169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 17179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.moveTo(0, 0); 17189bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), 0); 17199bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(0, SkIntToScalar(100)); 17209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 17219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // inside, on along top edge 17229bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 17239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), 17249bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10)))); 17259bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // above 17269bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect( 17279bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect::MakeXYWH(SkIntToScalar(50), 17289bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(-10), 17299bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), 17309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10)))); 17319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // to the left 17329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(-10), 17339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5), 17349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5), 17359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5)))); 17369bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 17379bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // outside the diagonal edge 17389bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(10), 17399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(200), 17409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(20), 17419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5)))); 174262df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 1743b17c1291085e50819c0c46aae783067c30a67516bsalomon 1744b17c1291085e50819c0c46aae783067c30a67516bsalomon // Test that multiple move commands do not cause asserts. 1745b17c1291085e50819c0c46aae783067c30a67516bsalomon 1746b17c1291085e50819c0c46aae783067c30a67516bsalomon // At the time of writing, this would not modify cached convexity. This caused an assert while 17476950de6c4166fabb35e6c756fc009e0cf1c47819halcanary // checking conservative containment again. https://bug.skia.org/1460 1748b17c1291085e50819c0c46aae783067c30a67516bsalomon path.moveTo(SkIntToScalar(100), SkIntToScalar(100)); 1749b17c1291085e50819c0c46aae783067c30a67516bsalomon#if 0 1750b17c1291085e50819c0c46aae783067c30a67516bsalomon REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 1751b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10), 1752b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10)))); 1753b17c1291085e50819c0c46aae783067c30a67516bsalomon#endif 1754b17c1291085e50819c0c46aae783067c30a67516bsalomon 1755b17c1291085e50819c0c46aae783067c30a67516bsalomon // Same as above path and first test but with an extra moveTo. 175662df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.reset(); 175762df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.moveTo(100, 100); 175862df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.moveTo(0, 0); 175962df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.lineTo(SkIntToScalar(100), 0); 176062df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.lineTo(0, SkIntToScalar(100)); 176162df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 176262df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 176362df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org SkIntToScalar(10), 176462df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org SkIntToScalar(10)))); 176562df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 1766b17c1291085e50819c0c46aae783067c30a67516bsalomon // Test that multiple move commands do not cause asserts and that the function 1767b17c1291085e50819c0c46aae783067c30a67516bsalomon // is not confused by the multiple moves. 1768b17c1291085e50819c0c46aae783067c30a67516bsalomon path.reset(); 1769b17c1291085e50819c0c46aae783067c30a67516bsalomon path.moveTo(0, 0); 1770b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(SkIntToScalar(100), 0); 1771b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(0, SkIntToScalar(100)); 1772b17c1291085e50819c0c46aae783067c30a67516bsalomon path.moveTo(0, SkIntToScalar(200)); 1773b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(SkIntToScalar(100), SkIntToScalar(200)); 1774b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(0, SkIntToScalar(300)); 1775b17c1291085e50819c0c46aae783067c30a67516bsalomon 1776b17c1291085e50819c0c46aae783067c30a67516bsalomon REPORTER_ASSERT(reporter, !path.conservativelyContainsRect( 1777b17c1291085e50819c0c46aae783067c30a67516bsalomon SkRect::MakeXYWH(SkIntToScalar(50), 0, 1778b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10), 1779b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10)))); 1780b17c1291085e50819c0c46aae783067c30a67516bsalomon 1781a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1782a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(100, 100); 1783a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(0, 0, 1, 1))); 17849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com} 17859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 1786f32322b9cefd950013ead6f914678580eff20b5breed@google.comstatic void test_isRect_open_close(skiatest::Reporter* reporter) { 1787f32322b9cefd950013ead6f914678580eff20b5breed@google.com SkPath path; 1788f32322b9cefd950013ead6f914678580eff20b5breed@google.com bool isClosed; 1789f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1790f32322b9cefd950013ead6f914678580eff20b5breed@google.com path.moveTo(0, 0); path.lineTo(1, 0); path.lineTo(1, 1); path.lineTo(0, 1); 1791f32322b9cefd950013ead6f914678580eff20b5breed@google.com path.close(); 179205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 179396fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, path.isRect(nullptr, &isClosed, nullptr)); 1794f32322b9cefd950013ead6f914678580eff20b5breed@google.com REPORTER_ASSERT(reporter, isClosed); 1795f32322b9cefd950013ead6f914678580eff20b5breed@google.com} 1796f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1797f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com// Simple isRect test is inline TestPath, below. 1798f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com// test_isRect provides more extensive testing. 1799f131694617ce0410eafcb01124459382576bb1d9caryclark@google.comstatic void test_isRect(skiatest::Reporter* reporter) { 1800f32322b9cefd950013ead6f914678580eff20b5breed@google.com test_isRect_open_close(reporter); 1801f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1802f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // passing tests (all moveTo / lineTo... 1803f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; 1804f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r2[] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}}; 1805f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r3[] = {{1, 1}, {0, 1}, {0, 0}, {1, 0}}; 1806f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r4[] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}}; 1807f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r5[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; 1808f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r6[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1809f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r7[] = {{1, 1}, {1, 0}, {0, 0}, {0, 1}}; 1810f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r8[] = {{1, 0}, {0, 0}, {0, 1}, {1, 1}}; 1811f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r9[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1812b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint ra[] = {{0, 0}, {0, .5f}, {0, 1}, {.5f, 1}, {1, 1}, {1, .5f}, {1, 0}, {.5f, 0}}; 1813b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint rb[] = {{0, 0}, {.5f, 0}, {1, 0}, {1, .5f}, {1, 1}, {.5f, 1}, {0, 1}, {0, .5f}}; 1814f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint rc[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}; 1815f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint rd[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1816f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint re[] = {{0, 0}, {1, 0}, {1, 0}, {1, 1}, {0, 1}}; 1817bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint rf[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 0}}; 1818d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1819f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // failing tests 1820f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f1[] = {{0, 0}, {1, 0}, {1, 1}}; // too few points 1821f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f2[] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; // diagonal 1822f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f3[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}; // wraps 1823f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f4[] = {{0, 0}, {1, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 1}}; // backs up 1824f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f5[] = {{0, 0}, {1, 0}, {1, 1}, {2, 0}}; // end overshoots 1825f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f6[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 2}}; // end overshoots 1826f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f7[] = {{0, 0}, {1, 0}, {1, 1}, {0, 2}}; // end overshoots 1827f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f8[] = {{0, 0}, {1, 0}, {1, 1}, {1, 0}}; // 'L' 1828bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint f9[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 0}, {2, 0}}; // overlaps 1829bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint fa[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, -1}, {1, -1}}; // non colinear gap 1830bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint fb[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 1}}; // falls short 1831d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 183205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // no close, but we should detect them as fillably the same as a rect 183305ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; 183405ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}}; 183505ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c3[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}, {0, 0}}; // hit the start 183605ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 183705ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // like c2, but we double-back on ourselves 183805ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d1[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}, {0, 2}}; 183905ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // like c2, but we overshoot the start point 184005ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, -1}}; 184105ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d3[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, -1}, {0, 0}}; 1842f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 1843b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com struct IsRectTest { 1844b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint *fPoints; 18459880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int fPointCount; 1846b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fClose; 1847b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fIsRect; 1848b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com } tests[] = { 1849b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r1, SK_ARRAY_COUNT(r1), true, true }, 1850b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r2, SK_ARRAY_COUNT(r2), true, true }, 1851b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r3, SK_ARRAY_COUNT(r3), true, true }, 1852b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r4, SK_ARRAY_COUNT(r4), true, true }, 1853b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r5, SK_ARRAY_COUNT(r5), true, true }, 1854b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r6, SK_ARRAY_COUNT(r6), true, true }, 1855b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r7, SK_ARRAY_COUNT(r7), true, true }, 1856b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r8, SK_ARRAY_COUNT(r8), true, true }, 1857b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r9, SK_ARRAY_COUNT(r9), true, true }, 1858b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { ra, SK_ARRAY_COUNT(ra), true, true }, 1859b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rb, SK_ARRAY_COUNT(rb), true, true }, 1860b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rc, SK_ARRAY_COUNT(rc), true, true }, 1861b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rd, SK_ARRAY_COUNT(rd), true, true }, 1862b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { re, SK_ARRAY_COUNT(re), true, true }, 1863b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rf, SK_ARRAY_COUNT(rf), true, true }, 1864b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1865b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f1, SK_ARRAY_COUNT(f1), true, false }, 1866b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f2, SK_ARRAY_COUNT(f2), true, false }, 1867b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f3, SK_ARRAY_COUNT(f3), true, false }, 1868b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f4, SK_ARRAY_COUNT(f4), true, false }, 1869b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f5, SK_ARRAY_COUNT(f5), true, false }, 1870b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f6, SK_ARRAY_COUNT(f6), true, false }, 1871b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f7, SK_ARRAY_COUNT(f7), true, false }, 1872b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f8, SK_ARRAY_COUNT(f8), true, false }, 1873b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f9, SK_ARRAY_COUNT(f9), true, false }, 1874b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { fa, SK_ARRAY_COUNT(fa), true, false }, 1875b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { fb, SK_ARRAY_COUNT(fb), true, false }, 1876b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 187705ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c1, SK_ARRAY_COUNT(c1), false, true }, 187805ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c2, SK_ARRAY_COUNT(c2), false, true }, 187905ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c3, SK_ARRAY_COUNT(c3), false, true }, 188005ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 188105ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d1, SK_ARRAY_COUNT(d1), false, false }, 188205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d2, SK_ARRAY_COUNT(d2), false, false }, 188305ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d3, SK_ARRAY_COUNT(d3), false, false }, 1884f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com }; 1885b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1886b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com const size_t testCount = SK_ARRAY_COUNT(tests); 18879880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int index; 1888f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com for (size_t testIndex = 0; testIndex < testCount; ++testIndex) { 1889f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPath path; 1890b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.moveTo(tests[testIndex].fPoints[0].fX, tests[testIndex].fPoints[0].fY); 1891b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < tests[testIndex].fPointCount; ++index) { 1892b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.lineTo(tests[testIndex].fPoints[index].fX, tests[testIndex].fPoints[index].fY); 1893f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1894b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fClose) { 1895f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path.close(); 1896f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 189796fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, tests[testIndex].fIsRect == path.isRect(nullptr)); 1898f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com 1899b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fIsRect) { 190056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect computed, expected; 1901f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com bool isClosed; 1902026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPath::Direction direction; 1903026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection cheapDirection; 190491b0a3587342c48a1a6e1c4687686688737359darobertphillips expected.set(tests[testIndex].fPoints, tests[testIndex].fPointCount); 1905026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapComputeFirstDirection(path, &cheapDirection)); 190691b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, path.isRect(&computed, &isClosed, &direction)); 190791b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, expected == computed); 1908b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, isClosed == tests[testIndex].fClose); 1909026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::AsFirstDirection(direction) == cheapDirection); 1910f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com } else { 1911f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com SkRect computed; 1912f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com computed.set(123, 456, 789, 1011); 191391b0a3587342c48a1a6e1c4687686688737359darobertphillips bool isClosed = (bool)-1; 191491b0a3587342c48a1a6e1c4687686688737359darobertphillips SkPath::Direction direction = (SkPath::Direction) - 1; 191591b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, !path.isRect(&computed, &isClosed, &direction)); 1916f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, computed.fLeft == 123 && computed.fTop == 456); 1917f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, computed.fRight == 789 && computed.fBottom == 1011); 1918f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, isClosed == (bool) -1); 1919f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, direction == (SkPath::Direction) -1); 192056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1921f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1922d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1923f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, close then line 1924f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPath path1; 1925f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 19269880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1927f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1928f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1929f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1930f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(1, 0); 193196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isRect(nullptr)); 1932d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1933f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, move in the middle 1934f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1935f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 19369880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1937f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1938f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(1, .5f); 1939f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1940f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1941f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1942f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 194396fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isRect(nullptr)); 1944f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 1945f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, move on the edge 1946f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 19479880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1948f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[index - 1].fX, r1[index - 1].fY); 1949f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1950f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1951f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 195296fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isRect(nullptr)); 1953d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1954f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, quad 1955f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1956f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 19579880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1958f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1959f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.quadTo(1, .5f, 1, .5f); 1960f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1961f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1962f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1963f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 196496fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isRect(nullptr)); 1965d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1966f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, cubic 1967f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1968f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 19699880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1970f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1971f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.cubicTo(1, .5f, 1, .5f, 1, .5f); 1972f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1973f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1974f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1975f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 197696fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isRect(nullptr)); 1977f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com} 1978f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 197995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclarkstatic void test_isNestedFillRects(skiatest::Reporter* reporter) { 198056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // passing tests (all moveTo / lineTo... 198183d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // CW 198256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r2[] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}}; 198356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r3[] = {{1, 1}, {0, 1}, {0, 0}, {1, 0}}; 198456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r4[] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}}; 198583d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint r5[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; // CCW 198656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r6[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 198756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r7[] = {{1, 1}, {1, 0}, {0, 0}, {0, 1}}; 198856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r8[] = {{1, 0}, {0, 0}, {0, 1}, {1, 1}}; 198956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r9[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1990b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint ra[] = {{0, 0}, {0, .5f}, {0, 1}, {.5f, 1}, {1, 1}, {1, .5f}, {1, 0}, {.5f, 0}}; // CCW 1991b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint rb[] = {{0, 0}, {.5f, 0}, {1, 0}, {1, .5f}, {1, 1}, {.5f, 1}, {0, 1}, {0, .5f}}; // CW 199283d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint rc[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}; // CW 199383d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint rd[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}; // CCW 199483d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint re[] = {{0, 0}, {1, 0}, {1, 0}, {1, 1}, {0, 1}}; // CW 199556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 199656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // failing tests 199756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f1[] = {{0, 0}, {1, 0}, {1, 1}}; // too few points 199856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f2[] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; // diagonal 199956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f3[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}; // wraps 200056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f4[] = {{0, 0}, {1, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 1}}; // backs up 200156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f5[] = {{0, 0}, {1, 0}, {1, 1}, {2, 0}}; // end overshoots 200256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f6[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 2}}; // end overshoots 200356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f7[] = {{0, 0}, {1, 0}, {1, 1}, {0, 2}}; // end overshoots 200456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f8[] = {{0, 0}, {1, 0}, {1, 1}, {1, 0}}; // 'L' 200556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 200695bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark // success, no close is OK 200756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint c1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // close doesn't match 200856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint c2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}}; // ditto 200956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 2010b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com struct IsNestedRectTest { 2011b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint *fPoints; 20129880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int fPointCount; 2013026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection fDirection; 2014b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fClose; 2015b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fIsNestedRect; // nests with path.addRect(-1, -1, 2, 2); 2016b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com } tests[] = { 2017026beb52a29a620290fcfb24f1e7e9e75547b80freed { r1, SK_ARRAY_COUNT(r1), SkPathPriv::kCW_FirstDirection , true, true }, 2018026beb52a29a620290fcfb24f1e7e9e75547b80freed { r2, SK_ARRAY_COUNT(r2), SkPathPriv::kCW_FirstDirection , true, true }, 2019026beb52a29a620290fcfb24f1e7e9e75547b80freed { r3, SK_ARRAY_COUNT(r3), SkPathPriv::kCW_FirstDirection , true, true }, 2020026beb52a29a620290fcfb24f1e7e9e75547b80freed { r4, SK_ARRAY_COUNT(r4), SkPathPriv::kCW_FirstDirection , true, true }, 2021026beb52a29a620290fcfb24f1e7e9e75547b80freed { r5, SK_ARRAY_COUNT(r5), SkPathPriv::kCCW_FirstDirection, true, true }, 2022026beb52a29a620290fcfb24f1e7e9e75547b80freed { r6, SK_ARRAY_COUNT(r6), SkPathPriv::kCCW_FirstDirection, true, true }, 2023026beb52a29a620290fcfb24f1e7e9e75547b80freed { r7, SK_ARRAY_COUNT(r7), SkPathPriv::kCCW_FirstDirection, true, true }, 2024026beb52a29a620290fcfb24f1e7e9e75547b80freed { r8, SK_ARRAY_COUNT(r8), SkPathPriv::kCCW_FirstDirection, true, true }, 2025026beb52a29a620290fcfb24f1e7e9e75547b80freed { r9, SK_ARRAY_COUNT(r9), SkPathPriv::kCCW_FirstDirection, true, true }, 2026026beb52a29a620290fcfb24f1e7e9e75547b80freed { ra, SK_ARRAY_COUNT(ra), SkPathPriv::kCCW_FirstDirection, true, true }, 2027026beb52a29a620290fcfb24f1e7e9e75547b80freed { rb, SK_ARRAY_COUNT(rb), SkPathPriv::kCW_FirstDirection, true, true }, 2028026beb52a29a620290fcfb24f1e7e9e75547b80freed { rc, SK_ARRAY_COUNT(rc), SkPathPriv::kCW_FirstDirection, true, true }, 2029026beb52a29a620290fcfb24f1e7e9e75547b80freed { rd, SK_ARRAY_COUNT(rd), SkPathPriv::kCCW_FirstDirection, true, true }, 2030026beb52a29a620290fcfb24f1e7e9e75547b80freed { re, SK_ARRAY_COUNT(re), SkPathPriv::kCW_FirstDirection, true, true }, 2031026beb52a29a620290fcfb24f1e7e9e75547b80freed 2032026beb52a29a620290fcfb24f1e7e9e75547b80freed { f1, SK_ARRAY_COUNT(f1), SkPathPriv::kUnknown_FirstDirection, true, false }, 2033026beb52a29a620290fcfb24f1e7e9e75547b80freed { f2, SK_ARRAY_COUNT(f2), SkPathPriv::kUnknown_FirstDirection, true, false }, 2034026beb52a29a620290fcfb24f1e7e9e75547b80freed { f3, SK_ARRAY_COUNT(f3), SkPathPriv::kUnknown_FirstDirection, true, false }, 2035026beb52a29a620290fcfb24f1e7e9e75547b80freed { f4, SK_ARRAY_COUNT(f4), SkPathPriv::kUnknown_FirstDirection, true, false }, 2036026beb52a29a620290fcfb24f1e7e9e75547b80freed { f5, SK_ARRAY_COUNT(f5), SkPathPriv::kUnknown_FirstDirection, true, false }, 2037026beb52a29a620290fcfb24f1e7e9e75547b80freed { f6, SK_ARRAY_COUNT(f6), SkPathPriv::kUnknown_FirstDirection, true, false }, 2038026beb52a29a620290fcfb24f1e7e9e75547b80freed { f7, SK_ARRAY_COUNT(f7), SkPathPriv::kUnknown_FirstDirection, true, false }, 2039026beb52a29a620290fcfb24f1e7e9e75547b80freed { f8, SK_ARRAY_COUNT(f8), SkPathPriv::kUnknown_FirstDirection, true, false }, 2040026beb52a29a620290fcfb24f1e7e9e75547b80freed 2041026beb52a29a620290fcfb24f1e7e9e75547b80freed { c1, SK_ARRAY_COUNT(c1), SkPathPriv::kCW_FirstDirection, false, true }, 2042026beb52a29a620290fcfb24f1e7e9e75547b80freed { c2, SK_ARRAY_COUNT(c2), SkPathPriv::kCW_FirstDirection, false, true }, 204356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com }; 204483d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com 2045b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com const size_t testCount = SK_ARRAY_COUNT(tests); 20469880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int index; 204756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (int rectFirst = 0; rectFirst <= 1; ++rectFirst) { 204856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (size_t testIndex = 0; testIndex < testCount; ++testIndex) { 204956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPath path; 205056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 205156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 205256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 2053b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.moveTo(tests[testIndex].fPoints[0].fX, tests[testIndex].fPoints[0].fY); 2054b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < tests[testIndex].fPointCount; ++index) { 2055b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.lineTo(tests[testIndex].fPoints[index].fX, tests[testIndex].fPoints[index].fY); 205656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 2057b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fClose) { 205856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.close(); 205956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 206056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 206156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 206256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 206395bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, 206496fcdcc219d2a0d3579719b84b28bede76efba64halcanary tests[testIndex].fIsNestedRect == path.isNestedFillRects(nullptr)); 2065b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fIsNestedRect) { 206656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect expected[2], computed[2]; 2067026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection expectedDirs[2]; 2068026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPath::Direction computedDirs[2]; 206956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect testBounds; 2070b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com testBounds.set(tests[testIndex].fPoints, tests[testIndex].fPointCount); 207156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com expected[0] = SkRect::MakeLTRB(-1, -1, 2, 2); 207256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com expected[1] = testBounds; 207383d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com if (rectFirst) { 2074026beb52a29a620290fcfb24f1e7e9e75547b80freed expectedDirs[0] = SkPathPriv::kCW_FirstDirection; 207583d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com } else { 2076026beb52a29a620290fcfb24f1e7e9e75547b80freed expectedDirs[0] = SkPathPriv::kCCW_FirstDirection; 207783d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com } 2078b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com expectedDirs[1] = tests[testIndex].fDirection; 207995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, path.isNestedFillRects(computed, computedDirs)); 208056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, expected[0] == computed[0]); 208156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, expected[1] == computed[1]); 2082026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, expectedDirs[0] == SkPathPriv::AsFirstDirection(computedDirs[0])); 2083026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, expectedDirs[1] == SkPathPriv::AsFirstDirection(computedDirs[1])); 208456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 208556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 208656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 208756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, close then line 208856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPath path1; 208956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 209056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 209156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 209256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 20939880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 209456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 209556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 209656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 209756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(1, 0); 209856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 209956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 210056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 210196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isNestedFillRects(nullptr)); 210256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 210356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, move in the middle 210456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 210556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 210656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 210756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 210856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 21099880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 211056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 211156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(1, .5f); 211256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 211356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 211456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 211556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 211656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 211756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 211856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 211996fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isNestedFillRects(nullptr)); 212056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 212156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, move on the edge 212256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 212356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 212456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 212556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 21269880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 212756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[index - 1].fX, r1[index - 1].fY); 212856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 212956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 213056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 213156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 213256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 213356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 213496fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isNestedFillRects(nullptr)); 213556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 213656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, quad 213756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 213856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 213956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 214056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 214156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 21429880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 214356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 214456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.quadTo(1, .5f, 1, .5f); 214556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 214656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 214756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 214856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 214956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 215056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 215156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 215296fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isNestedFillRects(nullptr)); 215356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 215456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, cubic 215556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 215656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 215756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 215856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 215956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 21609880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 216156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 216256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.cubicTo(1, .5f, 1, .5f, 1, .5f); 216356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 216456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 216556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 216656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 216756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 216856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 216956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 217096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isNestedFillRects(nullptr)); 21713458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 217256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, not nested 217356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 217456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(1, 1, 3, 3, SkPath::kCW_Direction); 217556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(2, 2, 4, 4, SkPath::kCW_Direction); 217696fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !path1.isNestedFillRects(nullptr)); 217756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 2178bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com 217995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark // pass, constructed explicitly from manually closed rects specified as moves/lines. 218095bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark SkPath path; 218195bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.moveTo(0, 0); 218295bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(10, 0); 218395bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(10, 10); 218495bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(0, 10); 218595bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(0, 0); 218695bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.moveTo(1, 1); 218795bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(9, 1); 218895bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(9, 9); 218995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(1, 9); 219095bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(1, 1); 219196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, path.isNestedFillRects(nullptr)); 219295bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark 2193bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com // pass, stroke rect 2194bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPath src, dst; 2195bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com src.addRect(1, 1, 7, 7, SkPath::kCW_Direction); 2196bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPaint strokePaint; 2197bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.setStyle(SkPaint::kStroke_Style); 2198bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.setStrokeWidth(2); 2199bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.getFillPath(src, &dst); 220096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, dst.isNestedFillRects(nullptr)); 220156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com} 220256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 22032972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.comstatic void write_and_read_back(skiatest::Reporter* reporter, 22042972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkPath& p) { 220519382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org SkWriter32 writer; 22062972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com writer.writePath(p); 22074469938e92d779dff05e745559e67907bbf21e78reed@google.com size_t size = writer.bytesWritten(); 22082972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkAutoMalloc storage(size); 22092972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com writer.flatten(storage.get()); 22102972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkReader32 reader(storage.get(), size); 22112972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 22122972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkPath readBack; 22132972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack != p); 22142972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com reader.readPath(&readBack); 22152972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack == p); 22162972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 2217d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT(reporter, readBack.getConvexityOrUnknown() == 22182972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com p.getConvexityOrUnknown()); 22192972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 222096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, readBack.isOval(nullptr) == p.isOval(nullptr)); 22212972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 22222972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkRect& origBounds = p.getBounds(); 22232972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkRect& readBackBounds = readBack.getBounds(); 22242972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 22252972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, origBounds == readBackBounds); 22262972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com} 22272972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 222853effc5e327749ea47bc0c678cb45246644600b0reed@google.comstatic void test_flattening(skiatest::Reporter* reporter) { 222953effc5e327749ea47bc0c678cb45246644600b0reed@google.com SkPath p; 223053effc5e327749ea47bc0c678cb45246644600b0reed@google.com 223153effc5e327749ea47bc0c678cb45246644600b0reed@google.com static const SkPoint pts[] = { 223253effc5e327749ea47bc0c678cb45246644600b0reed@google.com { 0, 0 }, 223353effc5e327749ea47bc0c678cb45246644600b0reed@google.com { SkIntToScalar(10), SkIntToScalar(10) }, 223453effc5e327749ea47bc0c678cb45246644600b0reed@google.com { SkIntToScalar(20), SkIntToScalar(10) }, { SkIntToScalar(20), 0 }, 223553effc5e327749ea47bc0c678cb45246644600b0reed@google.com { 0, 0 }, { 0, SkIntToScalar(10) }, { SkIntToScalar(1), SkIntToScalar(10) } 223653effc5e327749ea47bc0c678cb45246644600b0reed@google.com }; 223753effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.moveTo(pts[0]); 223853effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.lineTo(pts[1]); 223953effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.quadTo(pts[2], pts[3]); 224053effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.cubicTo(pts[4], pts[5], pts[6]); 224153effc5e327749ea47bc0c678cb45246644600b0reed@google.com 22422972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com write_and_read_back(reporter, p); 224394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 224494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com // create a buffer that should be much larger than the path so we don't 224594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com // kill our stack if writer goes too far. 224694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com char buffer[1024]; 224796fcdcc219d2a0d3579719b84b28bede76efba64halcanary size_t size1 = p.writeToMemory(nullptr); 22484faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size2 = p.writeToMemory(buffer); 224994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size2); 225094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 225194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com SkPath p2; 22524faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size3 = p2.readFromMemory(buffer, 1024); 225394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size3); 225494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, p == p2); 225594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 2256a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org size3 = p2.readFromMemory(buffer, 0); 2257a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !size3); 2258a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2259a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath tooShort; 2260a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org size3 = tooShort.readFromMemory(buffer, size1 - 1); 2261a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, tooShort.isEmpty()); 2262a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 226394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com char buffer2[1024]; 226494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size3 = p2.writeToMemory(buffer2); 226594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size3); 226694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); 22672972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 22682972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com // test persistence of the oval flag & convexity 22692972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com { 22702972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkPath oval; 22712972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkRect rect = SkRect::MakeWH(10, 10); 22722972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com oval.addOval(rect); 22732972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 22742972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com write_and_read_back(reporter, oval); 22752972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com } 227653effc5e327749ea47bc0c678cb45246644600b0reed@google.com} 227753effc5e327749ea47bc0c678cb45246644600b0reed@google.com 227853effc5e327749ea47bc0c678cb45246644600b0reed@google.comstatic void test_transform(skiatest::Reporter* reporter) { 2279b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p; 2280d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2281a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#define CONIC_PERSPECTIVE_BUG_FIXED 0 228253effc5e327749ea47bc0c678cb45246644600b0reed@google.com static const SkPoint pts[] = { 2283a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, // move 2284a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { SkIntToScalar(10), SkIntToScalar(10) }, // line 2285a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { SkIntToScalar(20), SkIntToScalar(10) }, { SkIntToScalar(20), 0 }, // quad 2286a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, { 0, SkIntToScalar(10) }, { SkIntToScalar(1), SkIntToScalar(10) }, // cubic 2287a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_PERSPECTIVE_BUG_FIXED 2288a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, { SkIntToScalar(20), SkIntToScalar(10) }, // conic 2289a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 229053effc5e327749ea47bc0c678cb45246644600b0reed@google.com }; 2291a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org const int kPtCount = SK_ARRAY_COUNT(pts); 2292b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 229353effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.moveTo(pts[0]); 229453effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.lineTo(pts[1]); 229553effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.quadTo(pts[2], pts[3]); 229653effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.cubicTo(pts[4], pts[5], pts[6]); 2297a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_PERSPECTIVE_BUG_FIXED 2298a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(pts[4], pts[5], 0.5f); 2299a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 2300a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 2301b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2302b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2303b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2304b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2305b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2306b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2307b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p == p1); 2308b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2309b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2310b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2311b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2312b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2313b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setScale(SK_Scalar1 * 2, SK_Scalar1 * 3); 2314b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2315b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; // Leave p1 non-unique (i.e., the empty path) 2316b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 23176e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com p.transform(matrix, &p1); 2318b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPoint pts1[kPtCount]; 23196e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com int count = p1.getPoints(pts1, kPtCount); 2320b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, kPtCount == count); 2321b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com for (int i = 0; i < count; ++i) { 2322b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPoint newPt = SkPoint::Make(pts[i].fX * 2, pts[i].fY * 3); 2323b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, newPt == pts1[i]); 2324b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2325b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2326b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2327b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2328b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2329b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 23303f43f8ab9cd3ba0ea83f5ae0659c21f101dfca7areed matrix.setPerspX(4); 2331b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2332b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2333b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); 2334b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2335b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2336b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, matrix.invert(&matrix)); 233796fcdcc219d2a0d3579719b84b28bede76efba64halcanary p1.transform(matrix, nullptr); 2338b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkRect pBounds = p.getBounds(); 2339b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkRect p1Bounds = p1.getBounds(); 2340b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fLeft, p1Bounds.fLeft)); 2341b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fTop, p1Bounds.fTop)); 2342b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fRight, p1Bounds.fRight)); 2343b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fBottom, p1Bounds.fBottom)); 234453effc5e327749ea47bc0c678cb45246644600b0reed@google.com } 2345b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2346a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2347a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addCircle(0, 0, 1, SkPath::kCW_Direction); 2348b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2349b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2350b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2351b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2352b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2353b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); 2354b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2355b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2356026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(p1, SkPathPriv::kCW_FirstDirection)); 2357b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2358b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2359b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2360b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2361b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2362b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2363b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setScaleX(-1); 2364b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2365b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); // Make p1 unique (i.e., not empty path) 2366b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2367b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2368026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(p1, SkPathPriv::kCCW_FirstDirection)); 2369b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2370b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2371b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2372b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2373b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setAll(1, 1, 0, 1, 1, 0, 0, 0, 1); 2374b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2375b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); // Make p1 unique (i.e., not empty path) 2376b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2377b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2378026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(p1, SkPathPriv::kUnknown_FirstDirection)); 2379b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 238053effc5e327749ea47bc0c678cb45246644600b0reed@google.com} 238153effc5e327749ea47bc0c678cb45246644600b0reed@google.com 23824da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstatic void test_zero_length_paths(skiatest::Reporter* reporter) { 23836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath p; 23847e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org uint8_t verbs[32]; 23857e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 238656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com struct SUPPRESS_VISIBILITY_WARNING zeroPathTestData { 23877e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const char* testPath; 23887e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultPts; 23897e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkRect resultBound; 23907e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPath::Verb* resultVerbs; 23917e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultVerbs; 23927e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 23934da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 23947e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs1[] = { SkPath::kMove_Verb }; 23957e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs2[] = { SkPath::kMove_Verb, SkPath::kMove_Verb }; 23967e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs3[] = { SkPath::kMove_Verb, SkPath::kClose_Verb }; 23977e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs4[] = { SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb }; 23987e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs5[] = { SkPath::kMove_Verb, SkPath::kLine_Verb }; 23997e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs6[] = { SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kMove_Verb, SkPath::kLine_Verb }; 24007e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs7[] = { SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb }; 24017e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs8[] = { 24027e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb 24037e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24047e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs9[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb }; 24057e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs10[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kMove_Verb, SkPath::kQuad_Verb }; 24067e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs11[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb }; 24077e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs12[] = { 24087e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb 24097e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24107e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs13[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb }; 24117e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs14[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kMove_Verb, SkPath::kCubic_Verb }; 24127e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs15[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb }; 24137e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs16[] = { 24147e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb 24157e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24167e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const struct zeroPathTestData gZeroLengthTests[] = { 241791f283bb4e6ea71bbd4e6efc27befc29118ee543reed { "M 1 1", 1, {1, 1, 1, 1}, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2418aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 M 2 1", 2, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs2, SK_ARRAY_COUNT(resultVerbs2) }, 241991f283bb4e6ea71bbd4e6efc27befc29118ee543reed { "M 1 1 z", 1, {1, 1, 1, 1}, resultVerbs3, SK_ARRAY_COUNT(resultVerbs3) }, 2420aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2421aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1", 2, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs5, SK_ARRAY_COUNT(resultVerbs5) }, 2422aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2423aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1 z", 2, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs7, SK_ARRAY_COUNT(resultVerbs7) }, 2424aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2425aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 Q 1 1 1 1", 3, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs9, SK_ARRAY_COUNT(resultVerbs9) }, 2426aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2427aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2428aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2429aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2430aaf1688959ba5dc74007e711599552928d255dfaschenney@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, 24317e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SK_ARRAY_COUNT(resultVerbs14) 24327e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }, 2433aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2434aaf1688959ba5dc74007e711599552928d255dfaschenney@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, 24357e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SK_ARRAY_COUNT(resultVerbs16) 24367e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 24377e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24384da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 24397e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gZeroLengthTests); ++i) { 24407e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org p.reset(); 24417e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org bool valid = SkParsePath::FromSVGString(gZeroLengthTests[i].testPath, &p); 24427e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, valid); 24437e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 24447e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].numResultPts == (size_t)p.countPoints()); 24457e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].resultBound == p.getBounds()); 24467e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].numResultVerbs == (size_t)p.getVerbs(verbs, SK_ARRAY_COUNT(verbs))); 24477e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t j = 0; j < gZeroLengthTests[i].numResultVerbs; ++j) { 24487e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].resultVerbs[j] == verbs[j]); 24497e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 2450df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com } 24514da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org} 24524da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 24534da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstruct SegmentInfo { 24544da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkPath fPath; 24554da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org int fPointCount; 24564da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org}; 24574da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 245810296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com#define kCurveSegmentMask (SkPath::kQuad_SegmentMask | SkPath::kCubic_SegmentMask) 245910296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com 24606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_segment_masks(skiatest::Reporter* reporter) { 2461eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com SkPath p, p2; 2462eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com 24636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(0, 0); 24646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.quadTo(100, 100, 200, 200); 24656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, SkPath::kQuad_SegmentMask == p.getSegmentMasks()); 24666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 2467eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2468eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 24696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(100, 100, 200, 200, 300, 300); 24706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, kCurveSegmentMask == p.getSegmentMasks()); 24716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 2472eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2473eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 2474eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com 24756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 24766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(0, 0); 24776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(100, 100, 200, 200, 300, 300); 24786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_SegmentMask == p.getSegmentMasks()); 2479eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2480eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 2481d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 24826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 24836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 24846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_iter(skiatest::Reporter* reporter) { 24867e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath p; 24876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint pts[4]; 24886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with no path 24906630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Iter noPathIter; 24916630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 24927e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 24936630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that setting an empty path works 24946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p, false); 24956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 24967e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 24976630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that close path makes no difference for an empty path 24986630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p, true); 24996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 25007e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 25016630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with an initial empty path 25026630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Iter iter(p, false); 25036630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 25046630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25056630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that close path makes no difference 25067e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org iter.setPath(p, true); 25076630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 25086630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 2509d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 25107e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org struct iterTestData { 25117e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const char* testPath; 25127e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const bool forceClose; 25137e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const bool consumeDegenerates; 25147e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t* numResultPtsPerVerb; 25157e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPoint* resultPts; 25167e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPath::Verb* resultVerbs; 25177e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultVerbs; 25187e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25207e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs1[] = { SkPath::kDone_Verb }; 25217e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs2[] = { 25227e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kDone_Verb 25237e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25247e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs3[] = { 25257e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 25267e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25277e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs4[] = { 25287e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 25297e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25307e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs5[] = { 25317e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 25327e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25337e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const size_t resultPtsSizes1[] = { 0 }; 2534fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes2[] = { 1, 2, 2, 0 }; 2535fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes3[] = { 1, 2, 2, 2, 1, 0 }; 2536fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes4[] = { 1, 2, 1, 1, 0 }; 2537fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes5[] = { 1, 2, 1, 1, 1, 0 }; 2538aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org static const SkPoint* resultPts1 = 0; 25397e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts2[] = { 25407e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, SK_Scalar1 }, { SK_Scalar1, SK_Scalar1 }, { 0, SK_Scalar1 } 25417e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25427e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts3[] = { 25437e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, SK_Scalar1 }, { SK_Scalar1, SK_Scalar1 }, { 0, SK_Scalar1 }, 25447e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { 0, SK_Scalar1 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 } 25457e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25467e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts4[] = { 25477e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { 0, 0 }, { 0, 0 } 25487e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25497e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts5[] = { 25507e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { 0, 0 }, { 0, 0 } 25517e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25527e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const struct iterTestData gIterTests[] = { 25537e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "M 1 0", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2554aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2555aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 25567e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 25577e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 25587e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@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) }, 25597e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@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) }, 2560aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 1 L 0 1 M 0 0 z", false, true, resultPtsSizes2, resultPts2, resultVerbs2, SK_ARRAY_COUNT(resultVerbs2) }, 2561aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 1 L 0 1 M 0 0 z", true, true, resultPtsSizes3, resultPts3, resultVerbs3, SK_ARRAY_COUNT(resultVerbs3) }, 2562aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2563aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2564aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", false, false, resultPtsSizes4, resultPts4, resultVerbs4, SK_ARRAY_COUNT(resultVerbs4) }, 2565aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", true, false, resultPtsSizes5, resultPts5, resultVerbs5, SK_ARRAY_COUNT(resultVerbs5) } 25667e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 25676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25687e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gIterTests); ++i) { 25697e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org p.reset(); 25707e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org bool valid = SkParsePath::FromSVGString(gIterTests[i].testPath, &p); 25717e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, valid); 25727e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org iter.setPath(p, gIterTests[i].forceClose); 25737e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org int j = 0, l = 0; 25747e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org do { 25757e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts, gIterTests[i].consumeDegenerates) == gIterTests[i].resultVerbs[j]); 25767e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (int k = 0; k < (int)gIterTests[i].numResultPtsPerVerb[j]; ++k) { 25777e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, pts[k] == gIterTests[i].resultPts[l++]); 25787e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 25797e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } while (gIterTests[i].resultVerbs[j++] != SkPath::kDone_Verb); 25807e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, j == (int)gIterTests[i].numResultVerbs); 25817e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 25826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 2583a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2584a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2585a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2586a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 1); 2587a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 2588a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2589a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, iter.isClosedContour()); 2590a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2591a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2592a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2593a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 1); 2594a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2595a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, iter.isClosedContour()); 2596a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(0, 0); 2597a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(2, 2); 2598a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2599a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2600a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2601a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this checks to see if the NaN logic is executed in SkPath::autoClose(), but does not 2602a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // check to see if the result is correct. 2603a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (int setNaN = 0; setNaN < 4; ++setNaN) { 2604a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2605a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(setNaN == 0 ? SK_ScalarNaN : 0, setNaN == 1 ? SK_ScalarNaN : 0); 2606a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(setNaN == 2 ? SK_ScalarNaN : 1, setNaN == 3 ? SK_ScalarNaN : 1); 2607a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2608a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2609a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2610a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kClose_Verb == iter.next(pts, false)); 2611a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 2612a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2613a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2614a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(0, 0, 0, 0); 2615a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2616a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2617a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kQuad_Verb == iter.next(pts, false)); 2618a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2619a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2620a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2621a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2622a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2623a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(0, 0, 0, 0, 0.5f); 2624a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2625a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2626a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kConic_Verb == iter.next(pts, false)); 2627a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2628a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2629a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2630a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2631a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2632a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.cubicTo(0, 0, 0, 0, 0, 0); 2633a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2634a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2635a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == iter.next(pts, false)); 2636a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2637a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2638a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2639a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2640a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(1, 1); // add a trailing moveto 2641a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2642a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2643a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == iter.next(pts, false)); 2644a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2645a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2646a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2647a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 26486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // The GM degeneratesegments.cpp test is more extensive 2649b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips 2650b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips // Test out mixed degenerate and non-degenerate geometry with Conics 2651b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips const SkVector radii[4] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 100, 100 } }; 2652b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips SkRect r = SkRect::MakeWH(100, 100); 2653b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips SkRRect rr; 2654b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips rr.setRectRadii(r, radii); 2655b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips p.reset(); 2656b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips p.addRRect(rr); 2657b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips iter.setPath(p, false); 2658b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kMove_Verb == iter.next(pts)); 2659b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kLine_Verb == iter.next(pts)); 2660b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kLine_Verb == iter.next(pts)); 2661b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kConic_Verb == iter.next(pts)); 2662b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SK_ScalarRoot2Over2 == iter.conicWeight()); 26636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 26646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 26656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_raw_iter(skiatest::Reporter* reporter) { 26666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath p; 26676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint pts[4]; 26686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 26696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with no path 26706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::RawIter noPathIter; 26716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 26726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that setting an empty path works 26736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p); 26746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 2675d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 26766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with an initial empty path 26776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::RawIter iter(p); 26786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 26796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 26806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that a move-only path returns the move. 26816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1, 0); 26826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 26836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 26856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 26866630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 26876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 26886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // No matter how many moves we add, we should get them all back 26896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*2, SK_Scalar1); 26906630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*3, SK_Scalar1*2); 26916630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 26926630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26936630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 26946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 26956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26966630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 26976630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 26986630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*3); 27006630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*2); 27016630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 27026630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 27036630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Initial close is never ever stored 27046630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 27056630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 27066630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 27076630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 27086630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 27096630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Move/close sequences 27106630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 27116630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); // Not stored, no purpose 27126630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1, 0); 27136630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 27146630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); // Not stored, no purpose 27156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*2, SK_Scalar1); 27166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 27176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*3, SK_Scalar1*2); 27186630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*4, SK_Scalar1*3); 27196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 27206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 27216630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 27226630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 27236630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 27246630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 27256630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 27266630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 27276630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 27286630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 27296630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 27306630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*3); 27316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*2); 27326630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 27336630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*4); 27346630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*3); 27356630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 27366630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 27376630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 27386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Generate random paths and verify 27396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint randomPts[25]; 27406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int i = 0; i < 5; ++i) { 27416630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int j = 0; j < 5; ++j) { 27426630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org randomPts[i*5+j].set(SK_Scalar1*i, SK_Scalar1*j); 27436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 27466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Max of 10 segments, max 3 points per segment 2747e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand(9876543); 27486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint expectedPts[31]; // May have leading moveTo 2749d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com SkPath::Verb expectedVerbs[22]; // May have leading moveTo 27506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Verb nextVerb; 2751d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com 27526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int i = 0; i < 500; ++i) { 27536630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 27546630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org bool lastWasClose = true; 27556630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org bool haveMoveTo = false; 2756d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com SkPoint lastMoveToPt = { 0, 0 }; 27576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numPoints = 0; 27586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numVerbs = (rand.nextU() >> 16) % 10; 27596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numIterVerbs = 0; 27606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int j = 0; j < numVerbs; ++j) { 27616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org do { 27626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org nextVerb = static_cast<SkPath::Verb>((rand.nextU() >> 16) % SkPath::kDone_Verb); 27636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } while (lastWasClose && nextVerb == SkPath::kClose_Verb); 27646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org switch (nextVerb) { 27656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kMove_Verb: 27666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 27676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(expectedPts[numPoints]); 2768d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com lastMoveToPt = expectedPts[numPoints]; 27696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 1; 27706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 27716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 27726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 27736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kLine_Verb: 27746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2775d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 27766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 27776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 27786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 27806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.lineTo(expectedPts[numPoints]); 27816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 1; 27826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 27836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 27846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kQuad_Verb: 27856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2786d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 27876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 27886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 27896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27906630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 27916630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 27926630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.quadTo(expectedPts[numPoints], expectedPts[numPoints + 1]); 27936630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 2; 27946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 27956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2796277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 2797277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com if (!haveMoveTo) { 2798277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints++] = lastMoveToPt; 2799277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 2800277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com haveMoveTo = true; 2801277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com } 2802277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 2803277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 2804277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com p.conicTo(expectedPts[numPoints], expectedPts[numPoints + 1], 2805277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com rand.nextUScalar1() * 4); 2806277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com numPoints += 2; 2807277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com lastWasClose = false; 2808277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 28096630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kCubic_Verb: 28106630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2811d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 28126630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 28136630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 28146630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 28156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 28166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 28176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 2] = randomPts[(rand.nextU() >> 16) % 25]; 28186630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(expectedPts[numPoints], expectedPts[numPoints + 1], 28196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 2]); 28206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 3; 28216630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 28226630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 28236630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kClose_Verb: 28246630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 2825d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com haveMoveTo = false; 28266630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = true; 28276630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2828277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com default: 2829330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com SkDEBUGFAIL("unexpected verb"); 28306630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 28316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = nextVerb; 28326630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 2833d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 28346630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 28356630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numVerbs = numIterVerbs; 28366630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterVerbs = 0; 28376630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numIterPts = 0; 28386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint lastMoveTo; 28396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint lastPt; 28406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastMoveTo.set(0, 0); 28416630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt.set(0, 0); 28426630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org while ((nextVerb = iter.next(pts)) != SkPath::kDone_Verb) { 28436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, nextVerb == expectedVerbs[numIterVerbs]); 28446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterVerbs++; 28456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org switch (nextVerb) { 28466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kMove_Verb: 28476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints); 28486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == expectedPts[numIterPts]); 28496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = lastMoveTo = pts[0]; 28506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 1; 28516630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 28526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kLine_Verb: 28536630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 1); 28546630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 28556630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 28566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[1]; 28576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 1; 28586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 28596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kQuad_Verb: 2860277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 28616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 2); 28626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 28636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 28646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[2] == expectedPts[numIterPts + 1]); 28656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[2]; 28666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 2; 28676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 28686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kCubic_Verb: 28696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 3); 28706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 28716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 28726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[2] == expectedPts[numIterPts + 1]); 28736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[3] == expectedPts[numIterPts + 2]); 28746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[3]; 28756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 3; 28766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 28776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kClose_Verb: 28786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = lastMoveTo; 28796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2880277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com default: 2881330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com SkDEBUGFAIL("unexpected verb"); 28826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 28836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 28846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts == numPoints); 28856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterVerbs == numVerbs); 28866630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 28876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 28886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 28896aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void check_for_circle(skiatest::Reporter* reporter, 289030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 289130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com bool expectedCircle, 2892026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection expectedDir) { 2893466310dbd3073add2ec934e336c30deaaf702eaerobertphillips@google.com SkRect rect = SkRect::MakeEmpty(); 289430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(&rect) == expectedCircle); 2895026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(path, expectedDir)); 2896fbb0ed959de64f16d236d2f0d81ddf5cb318e1feskia.committer@gmail.com 289730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (expectedCircle) { 28986aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, rect.height() == rect.width()); 28996aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 29006aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 29016aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29026aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_skew(skiatest::Reporter* reporter, 290330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 2904026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir) { 29056aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 29066aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29076aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 29086aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setSkew(SkIntToScalar(3), SkIntToScalar(5)); 29096aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 291030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com // this matrix reverses the direction. 2911026beb52a29a620290fcfb24f1e7e9e75547b80freed if (SkPathPriv::kCCW_FirstDirection == dir) { 2912026beb52a29a620290fcfb24f1e7e9e75547b80freed dir = SkPathPriv::kCW_FirstDirection; 291330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2914026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::kCW_FirstDirection == dir); 2915026beb52a29a620290fcfb24f1e7e9e75547b80freed dir = SkPathPriv::kCCW_FirstDirection; 291630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 291730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, false, dir); 29186aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 29196aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29206aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_translate(skiatest::Reporter* reporter, 292130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 2922026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir) { 29236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 29246aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // translate at small offset 29266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 29276aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setTranslate(SkIntToScalar(15), SkIntToScalar(15)); 29286aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 292930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 29306aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29316aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 29326aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 29336aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29346aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // translate at a relatively big offset 29356aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setTranslate(SkIntToScalar(1000), SkIntToScalar(1000)); 29366aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 293730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 29386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 29396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_rotate(skiatest::Reporter* reporter, 294130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 2942026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir) { 29436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com for (int angle = 0; angle < 360; ++angle) { 29446aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 29456aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 29466aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(angle)); 29476aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 29486aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 294930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com // TODO: a rotated circle whose rotated angle is not a multiple of 90 29506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // degrees is not an oval anymore, this can be improved. we made this 29516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // for the simplicity of our implementation. 29526aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com if (angle % 90 == 0) { 295330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 29546aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } else { 295530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, false, dir); 29566aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 29576aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 29586aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 29596aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 296030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_x(skiatest::Reporter* reporter, 296130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 2962026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir) { 296330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 296430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 296530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 296630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleX(-SK_Scalar1); 296730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 296830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 2969026beb52a29a620290fcfb24f1e7e9e75547b80freed if (SkPathPriv::kCW_FirstDirection == dir) { 2970026beb52a29a620290fcfb24f1e7e9e75547b80freed dir = SkPathPriv::kCCW_FirstDirection; 297130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2972026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::kCCW_FirstDirection == dir); 2973026beb52a29a620290fcfb24f1e7e9e75547b80freed dir = SkPathPriv::kCW_FirstDirection; 297430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 297530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 297630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 297730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 297830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 297930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_y(skiatest::Reporter* reporter, 298030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 2981026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir) { 298230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 298330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 298430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 298530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleY(-SK_Scalar1); 298630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 298730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 2988026beb52a29a620290fcfb24f1e7e9e75547b80freed if (SkPathPriv::kCW_FirstDirection == dir) { 2989026beb52a29a620290fcfb24f1e7e9e75547b80freed dir = SkPathPriv::kCCW_FirstDirection; 299030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2991026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::kCCW_FirstDirection == dir); 2992026beb52a29a620290fcfb24f1e7e9e75547b80freed dir = SkPathPriv::kCW_FirstDirection; 299330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 299430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 299530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 299630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 299730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 299830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_xy(skiatest::Reporter* reporter, 299930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 3000026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPathPriv::FirstDirection dir) { 300130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 300230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 300330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 300430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleX(-SK_Scalar1); 300530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleY(-SK_Scalar1); 300630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 300730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 300830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 300930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 301030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 30116aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_with_direction(skiatest::Reporter* reporter, 3012026beb52a29a620290fcfb24f1e7e9e75547b80freed SkPath::Direction inDir) { 3013026beb52a29a620290fcfb24f1e7e9e75547b80freed const SkPathPriv::FirstDirection dir = SkPathPriv::AsFirstDirection(inDir); 30146aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 30156aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30166aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle at origin 3017026beb52a29a620290fcfb24f1e7e9e75547b80freed path.addCircle(0, 0, SkIntToScalar(20), inDir); 3018026beb52a29a620290fcfb24f1e7e9e75547b80freed 301930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, true, dir); 302030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_rotate(reporter, path, dir); 302130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_translate(reporter, path, dir); 302230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_skew(reporter, path, dir); 30236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30246aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle at an offset at (10, 10) 30256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 30266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(SkIntToScalar(10), SkIntToScalar(10), 3027026beb52a29a620290fcfb24f1e7e9e75547b80freed SkIntToScalar(20), inDir); 3028026beb52a29a620290fcfb24f1e7e9e75547b80freed 302930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, true, dir); 303030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_rotate(reporter, path, dir); 303130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_translate(reporter, path, dir); 303230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_skew(reporter, path, dir); 303330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_x(reporter, path, dir); 303430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_y(reporter, path, dir); 303530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_xy(reporter, path, dir); 30366aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 30376aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_with_add_paths(skiatest::Reporter* reporter) { 30396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 30406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath circle; 30416aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath rect; 30426aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath empty; 30436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 3044026beb52a29a620290fcfb24f1e7e9e75547b80freed const SkPath::Direction kCircleDir = SkPath::kCW_Direction; 3045026beb52a29a620290fcfb24f1e7e9e75547b80freed const SkPath::Direction kCircleDirOpposite = SkPath::kCCW_Direction; 304630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 304730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com circle.addCircle(0, 0, SkIntToScalar(10), kCircleDir); 30486aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com rect.addRect(SkIntToScalar(5), SkIntToScalar(5), 30496aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkIntToScalar(20), SkIntToScalar(20), SkPath::kCW_Direction); 30506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix translate; 30526aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com translate.setTranslate(SkIntToScalar(12), SkIntToScalar(12)); 30536aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30540efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com // Although all the path concatenation related operations leave 30550efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com // the path a circle, most mark it as a non-circle for simplicity 30566aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30576aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // empty + circle (translate) 30586aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = empty; 30596aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addPath(circle, translate); 3060026beb52a29a620290fcfb24f1e7e9e75547b80freed check_for_circle(reporter, path, false, SkPathPriv::AsFirstDirection(kCircleDir)); 30616aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30626aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle + empty (translate) 30636aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = circle; 30646aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addPath(empty, translate); 3065026beb52a29a620290fcfb24f1e7e9e75547b80freed check_for_circle(reporter, path, true, SkPathPriv::AsFirstDirection(kCircleDir)); 30666aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30676aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // test reverseAddPath 30686aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = circle; 30696aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reverseAddPath(rect); 3070026beb52a29a620290fcfb24f1e7e9e75547b80freed check_for_circle(reporter, path, false, SkPathPriv::AsFirstDirection(kCircleDirOpposite)); 30716aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 30726aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30736aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle(skiatest::Reporter* reporter) { 30746aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_direction(reporter, SkPath::kCW_Direction); 30756aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_direction(reporter, SkPath::kCCW_Direction); 30766aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30776aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // multiple addCircle() 30786aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 30796aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 30806aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(20), SkPath::kCW_Direction); 3081026beb52a29a620290fcfb24f1e7e9e75547b80freed check_for_circle(reporter, path, false, SkPathPriv::kCW_FirstDirection); 30826aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30836aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // some extra lineTo() would make isOval() fail 30846aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 30856aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 30866aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.lineTo(0, 0); 3087026beb52a29a620290fcfb24f1e7e9e75547b80freed check_for_circle(reporter, path, false, SkPathPriv::kCW_FirstDirection); 30886aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30896aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // not back to the original point 30906aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 30916aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 30926aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.setLastPt(SkIntToScalar(5), SkIntToScalar(5)); 3093026beb52a29a620290fcfb24f1e7e9e75547b80freed check_for_circle(reporter, path, false, SkPathPriv::kCW_FirstDirection); 30946aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30956aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_add_paths(reporter); 3096a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3097a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test negative radius 3098a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 3099a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addCircle(0, 0, -1, SkPath::kCW_Direction); 3100a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, path.isEmpty()); 31016aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 31026aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31036aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_oval(skiatest::Reporter* reporter) { 31046aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkRect rect; 31056aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 31066aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 31076aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31086aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com rect = SkRect::MakeWH(SkIntToScalar(30), SkIntToScalar(50)); 31096aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addOval(rect); 31106aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 311196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, path.isOval(nullptr)); 31126aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31136aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(90)); 31146aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 31156aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 31166aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // an oval rotated 90 degrees is still an oval. 311796fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, tmp.isOval(nullptr)); 31186aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31196aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 31206aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(30)); 31216aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 31226aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 31236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // an oval rotated 30 degrees is not an oval anymore. 312496fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !tmp.isOval(nullptr)); 31256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // since empty path being transformed. 31276aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 31286aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 31296aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 31306aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 313196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !tmp.isOval(nullptr)); 31326aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31336aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // empty path is not an oval 31346aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 313596fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !tmp.isOval(nullptr)); 31366aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31376aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // only has moveTo()s 31386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 31396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.moveTo(0, 0); 31406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.moveTo(SkIntToScalar(10), SkIntToScalar(10)); 314196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !tmp.isOval(nullptr)); 31426aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // mimic WebKit's calling convention, 31446aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // call moveTo() first and then call addOval() 31456aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 31466aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.moveTo(0, 0); 31476aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addOval(rect); 314896fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, path.isOval(nullptr)); 31496aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 31506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // copy path 31516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 31526aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 31536aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.addOval(rect); 31546aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = tmp; 315596fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, path.isOval(nullptr)); 31566aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 31576aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 3158a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.comstatic void test_empty(skiatest::Reporter* reporter, const SkPath& p) { 3159a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkPath empty; 316080e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 31613abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isEmpty()); 31624da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, 0 == p.countPoints()); 3163df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, 0 == p.countVerbs()); 316410296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com REPORTER_ASSERT(reporter, 0 == p.getSegmentMasks()); 3165b54455e440e66e0b1c30954d226226f49aac26d6reed@google.com REPORTER_ASSERT(reporter, p.isConvex()); 31663abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.getFillType() == SkPath::kWinding_FillType); 31673abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, !p.isInverseFillType()); 3168a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, p == empty); 3169a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, !(p != empty)); 3170a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com} 3171a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 3172a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_rrect_is_convex(skiatest::Reporter* reporter, SkPath* path, 3173a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir) { 317442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org REPORTER_ASSERT(reporter, path->isConvex()); 3175026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(*path, SkPathPriv::AsFirstDirection(dir))); 317642feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org path->setConvexity(SkPath::kUnknown_Convexity); 317742feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org REPORTER_ASSERT(reporter, path->isConvex()); 317842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org path->reset(); 317942feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org} 318042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org 3181d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclarkstatic void test_rrect_convexity_is_unknown(skiatest::Reporter* reporter, SkPath* path, 3182d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark SkPath::Direction dir) { 3183d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark REPORTER_ASSERT(reporter, path->isConvex()); 3184026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(*path, SkPathPriv::AsFirstDirection(dir))); 3185d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path->setConvexity(SkPath::kUnknown_Convexity); 3186d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark REPORTER_ASSERT(reporter, path->getConvexity() == SkPath::kUnknown_Convexity); 3187d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path->reset(); 3188d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark} 3189d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 319042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.orgstatic void test_rrect(skiatest::Reporter* reporter) { 319142feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkPath p; 319242feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkRRect rr; 319342feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkVector radii[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; 319442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkRect r = {10, 20, 30, 40}; 319542feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org rr.setRectRadii(r, radii); 319642feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRRect(rr); 3197a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 319842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 3199a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 320042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, &radii[0].fX); 3201a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 320242feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, &radii[0].fX, SkPath::kCCW_Direction); 3203a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 320442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, radii[1].fX, radii[1].fY); 3205a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 320642feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, radii[1].fX, radii[1].fY, SkPath::kCCW_Direction); 3207a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 3208a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(radii); ++i) { 3209a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkVector save = radii[i]; 3210a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org radii[i].set(0, 0); 3211a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(r, radii); 3212a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3213a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3214a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org radii[i] = save; 3215a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3216a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRoundRect(r, 0, 0); 3217a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect returnedRect; 3218a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isRect(&returnedRect)); 3219a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, returnedRect == r); 3220a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3221a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkVector zeroRadii[] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; 3222a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(r, zeroRadii); 3223a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3224a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool closed; 3225a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir; 322696fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, p.isRect(nullptr, &closed, &dir)); 3227a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, closed); 3228a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCW_Direction == dir); 3229a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3230a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCW_Direction); 3231a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCW_Direction); 3232a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.isConvex()); 3233a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3234a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 3235a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 3236a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.isConvex()); 3237a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3238a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect emptyR = {10, 20, 10, 30}; 3239a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(emptyR, radii); 3240a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3241a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3242a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect largeR = {0, 0, SK_ScalarMax, SK_ScalarMax}; 3243a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(largeR, radii); 3244a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3245d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark test_rrect_convexity_is_unknown(reporter, &p, SkPath::kCW_Direction); 3246454fa71cc31bf45c14e4c0b25502d5332d76c51creed 3247454fa71cc31bf45c14e4c0b25502d5332d76c51creed // we check for non-finites 3248a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect infR = {0, 0, SK_ScalarMax, SK_ScalarInfinity}; 3249a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(infR, radii); 3250454fa71cc31bf45c14e4c0b25502d5332d76c51creed REPORTER_ASSERT(reporter, rr.isEmpty()); 3251454fa71cc31bf45c14e4c0b25502d5332d76c51creed 3252a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect tinyR = {0, 0, 1e-9f, 1e-9f}; 3253a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRoundRect(tinyR, 5e-11f, 5e-11f); 3254a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3255a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3256a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3257a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_arc(skiatest::Reporter* reporter) { 3258a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3259a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect emptyOval = {10, 20, 30, 20}; 3260a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, emptyOval.isEmpty()); 3261a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(emptyOval, 1, 2); 3262a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3263a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3264a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect oval = {10, 20, 30, 40}; 3265a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 0); 3266a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3267a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3268a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath cwOval; 3269a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org cwOval.addOval(oval); 3270a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 360); 3271a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p == cwOval); 3272a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3273a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath ccwOval; 3274a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org ccwOval.addOval(oval, SkPath::kCCW_Direction); 3275a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, -360); 3276a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p == ccwOval); 3277a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3278a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 180); 3279a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isConvex()); 3280026beb52a29a620290fcfb24f1e7e9e75547b80freed REPORTER_ASSERT(reporter, SkPathPriv::CheapIsFirstDirection(p, SkPathPriv::kCW_FirstDirection)); 3281a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setConvexity(SkPath::kUnknown_Convexity); 3282a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isConvex()); 3283a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3284a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3285a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_move(skiatest::Reporter* reporter, SkPath::RawIter* iter, 3286a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x0, SkScalar y0) { 3287a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3288a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3289a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kMove_Verb); 3290a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == x0); 3291a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == y0); 3292a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3293a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3294a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_line(skiatest::Reporter* reporter, SkPath::RawIter* iter, 3295a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3296a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3297a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3298a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kLine_Verb); 3299a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fX == x1); 3300a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fY == y1); 3301a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3302a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3303a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_quad(skiatest::Reporter* reporter, SkPath::RawIter* iter, 3304a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3305a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3306a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3307a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kQuad_Verb); 3308a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fX == x1); 3309a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fY == y1); 3310a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[2].fX == x2); 3311a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[2].fY == y2); 3312a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3313a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3314a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_done(skiatest::Reporter* reporter, SkPath* p, SkPath::RawIter* iter) { 3315a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3316a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3317a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kDone_Verb); 3318a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3319a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3320a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_done_and_reset(skiatest::Reporter* reporter, SkPath* p, SkPath::RawIter* iter) { 3321a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done(reporter, p, iter); 3322a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p->reset(); 3323a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3324a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3325a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_move_and_reset(skiatest::Reporter* reporter, SkPath* p, 3326a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x0, SkScalar y0) { 3327a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3328a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, x0, y0); 3329a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3330a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3331a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3332a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line_and_reset(skiatest::Reporter* reporter, SkPath* p, 3333a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3334a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3335a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3336a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3337a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3338a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3339a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3340a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line(skiatest::Reporter* reporter, SkPath* p, 3341a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3342a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3343a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3344a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3345a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done(reporter, p, &iter); 3346a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3347a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3348a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line_pair_and_reset(skiatest::Reporter* reporter, SkPath* p, 3349a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3350a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3351a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3352a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3353a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x2, y2); 3354a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3355a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3356a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3357a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_quad_and_reset(skiatest::Reporter* reporter, SkPath* p, 3358a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3359a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3360a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3361a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_quad(reporter, &iter, x1, y1, x2, y2); 3362a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 336342feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org} 336442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org 3365d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reedstatic bool nearly_equal(const SkRect& a, const SkRect& b) { 3366d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed return SkScalarNearlyEqual(a.fLeft, b.fLeft) && 3367d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed SkScalarNearlyEqual(a.fTop, b.fTop) && 3368d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed SkScalarNearlyEqual(a.fRight, b.fRight) && 3369d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed SkScalarNearlyEqual(a.fBottom, b.fBottom); 3370d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed} 3371d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed 3372a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_arcTo(skiatest::Reporter* reporter) { 3373a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3374a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(0, 0, 1, 2, 1); 3375a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 0, 0); 3376a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 1, 2, 1); 3377a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3378a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 3, 4, 0); 3379a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3380a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 0, 0, 1); 3381a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3382a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 0, 1, 1, 1); 3383a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pt; 3384a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt.fX == 1 && pt.fY == 1); 3385a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3386a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 0, 1, -1, 1); 3387a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt.fX == 1 && pt.fY == -1); 3388a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3389a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect oval = {1, 2, 3, 4}; 3390a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 0, 0, true); 3391a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3392a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 0, 0, false); 3393a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3394a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 360, 0, true); 3395a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3396a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 360, 0, false); 3397a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3398d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed 3399a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (float sweep = 359, delta = 0.5f; sweep != (float) (sweep + delta); ) { 34004b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org p.arcTo(oval, 0, sweep, false); 3401d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed REPORTER_ASSERT(reporter, nearly_equal(p.getBounds(), oval)); 3402a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org sweep += delta; 3403a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org delta /= 2; 3404a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3405a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (float sweep = 361, delta = 0.5f; sweep != (float) (sweep - delta);) { 34064b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org p.arcTo(oval, 0, sweep, false); 3407d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed REPORTER_ASSERT(reporter, nearly_equal(p.getBounds(), oval)); 3408a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org sweep -= delta; 3409a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org delta /= 2; 3410a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3411a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect noOvalWidth = {1, 2, 0, 3}; 3412a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3413a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(noOvalWidth, 0, 360, false); 3414a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3415a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3416a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect noOvalHeight = {1, 2, 3, 1}; 3417a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3418a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(noOvalHeight, 0, 360, false); 3419a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3420a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3421a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3422a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_addPath(skiatest::Reporter* reporter) { 3423a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p, q; 3424a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 2); 3425a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.moveTo(4, 4); 3426a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.lineTo(7, 8); 3427a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.conicTo(8, 7, 6, 5, 0.5f); 3428a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.quadTo(6, 7, 8, 6); 3429a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.cubicTo(5, 6, 7, 8, 7, 5); 3430a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.close(); 3431a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addPath(q, -4, -4); 3432a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect expected = {0, 0, 4, 4}; 3433a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == expected); 3434a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3435a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reverseAddPath(q); 3436a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect reverseExpected = {4, 4, 8, 8}; 3437a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == reverseExpected); 3438a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3439a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 344014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_addPathMode(skiatest::Reporter* reporter, bool explicitMoveTo, bool extend) { 344114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q; 344214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org if (explicitMoveTo) { 344314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(1, 1); 344414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org } 344514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(1, 2); 344614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org if (explicitMoveTo) { 344714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.moveTo(2, 1); 344814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org } 344914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.lineTo(2, 2); 345014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(q, extend ? SkPath::kExtend_AddPathMode : SkPath::kAppend_AddPathMode); 345114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org uint8_t verbs[4]; 345214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org int verbcount = p.getVerbs(verbs, 4); 345314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbcount == 4); 345414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[0] == SkPath::kMove_Verb); 345514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[1] == SkPath::kLine_Verb); 345614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[2] == (extend ? SkPath::kLine_Verb : SkPath::kMove_Verb)); 345714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[3] == SkPath::kLine_Verb); 345814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org} 345914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 346014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_extendClosedPath(skiatest::Reporter* reporter) { 346114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q; 346214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(1, 1); 346314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(1, 2); 346414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(2, 2); 346514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.close(); 346614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.moveTo(2, 1); 346714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.lineTo(2, 3); 346814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(q, SkPath::kExtend_AddPathMode); 346914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org uint8_t verbs[7]; 347014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org int verbcount = p.getVerbs(verbs, 7); 347114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbcount == 7); 347214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[0] == SkPath::kMove_Verb); 347314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[1] == SkPath::kLine_Verb); 347414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[2] == SkPath::kLine_Verb); 347514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[3] == SkPath::kClose_Verb); 347614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[4] == SkPath::kMove_Verb); 347714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[5] == SkPath::kLine_Verb); 347814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[6] == SkPath::kLine_Verb); 347914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 348014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPoint pt; 348114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt)); 348214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(2, 3)); 348314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, p.getPoint(3) == SkPoint::Make(1, 1)); 348414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org} 348514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 348614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_addEmptyPath(skiatest::Reporter* reporter, SkPath::AddPathMode mode) { 348714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q, r; 348814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 1: dst is empty 348914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(2, 1); 349014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(2, 3); 349114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.addPath(p, mode); 349214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q == p); 349314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 2: src is empty 349414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(r, mode); 349514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q == p); 349614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 3: src and dst are empty 349714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.reset(); 349814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.addPath(r, mode); 349914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q.isEmpty()); 3500877c44956dceff038c0e315c8d311b0d581f2680skia.committer@gmail.com} 350114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 3502a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_conicTo_special_case(skiatest::Reporter* reporter) { 3503a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3504a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, -1); 3505a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 3, 4); 3506a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, SK_ScalarInfinity); 3507a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_pair_and_reset(reporter, &p, 1, 2, 3, 4); 3508a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, 1); 3509a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_quad_and_reset(reporter, &p, 1, 2, 3, 4); 3510a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3511a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3512a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_get_point(skiatest::Reporter* reporter) { 3513a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3514a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pt = p.getPoint(0); 3515a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(0, 0)); 351696fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !p.getLastPt(nullptr)); 3517a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.getLastPt(&pt) && pt == SkPoint::Make(0, 0)); 3518a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setLastPt(10, 10); 3519a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org pt = p.getPoint(0); 3520a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(10, 10)); 352196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, p.getLastPt(nullptr)); 3522a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.rMoveTo(10, 10); 3523a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt == SkPoint::Make(20, 20)); 3524a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3525a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3526a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_contains(skiatest::Reporter* reporter) { 3527a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3528dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark p.moveTo(SkBits2Float(0xe085e7b1), SkBits2Float(0x5f512c00)); // -7.7191e+19f, 1.50724e+19f 3529dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark p.conicTo(SkBits2Float(0xdfdaa221), SkBits2Float(0x5eaac338), SkBits2Float(0x60342f13), SkBits2Float(0xdf0cbb58), SkBits2Float(0x3f3504f3)); // -3.15084e+19f, 6.15237e+18f, 5.19345e+19f, -1.01408e+19f, 0.707107f 3530dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark p.conicTo(SkBits2Float(0x60ead799), SkBits2Float(0xdfb76c24), SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8), SkBits2Float(0x3f3504f4)); // 1.35377e+20f, -2.6434e+19f, 8.96947e+19f, -1.75139e+19f, 0.707107f 3531dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark p.lineTo(SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8)); // 8.96947e+19f, -1.75139e+19f 3532dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark p.conicTo(SkBits2Float(0x6018b296), SkBits2Float(0xdeee870d), SkBits2Float(0xe008cd8e), SkBits2Float(0x5ed5b2db), SkBits2Float(0x3f3504f3)); // 4.40121e+19f, -8.59386e+18f, -3.94308e+19f, 7.69931e+18f, 0.707107f 3533dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark p.conicTo(SkBits2Float(0xe0d526d9), SkBits2Float(0x5fa67b31), SkBits2Float(0xe085e7b2), SkBits2Float(0x5f512c01), SkBits2Float(0x3f3504f3)); // -1.22874e+20f, 2.39925e+19f, -7.7191e+19f, 1.50724e+19f, 0.707107f 3534ba25ddb7f2032f778a956f646e5aa993045c280ecaryclark // this may return true or false, depending on the platform's numerics, but it should not crash 3535ba25ddb7f2032f778a956f646e5aa993045c280ecaryclark (void) p.contains(-77.2027664f, 15.3066053f); 3536dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark 3537dbaec7323f20c3a7e8a234dac9dfb8a9446a2717caryclark p.reset(); 3538a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kInverseWinding_FillType); 3539a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(0, 0)); 3540a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kWinding_FillType); 3541a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(0, 0)); 3542a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3543a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(6, 8); 3544a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(8, 4); 35459aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test on edge 35469aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(6, 4)); 35479aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(5, 6)); 35489aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(7, 6)); 3549a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test quick reject 3550a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4, 0)); 3551a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(0, 4)); 3552a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4, 10)); 3553a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(10, 4)); 3554a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test various crossings in x 3555a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(5, 7)); 3556a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(6, 7)); 3557a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 7)); 3558a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3559a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3560a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(8, 6); 3561a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(4, 8); 35629aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test on edge 35639aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(4, 6)); 35649aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(6, 5)); 35659aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(6, 7)); 3566a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test various crossings in y 3567a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 5)); 3568a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(7, 6)); 3569a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 7)); 35709aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.reset(); 35719aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.moveTo(4, 4); 3572c91065d028472688ce15e635a29abe5256ff89effs p.lineTo(8, 4); 3573c91065d028472688ce15e635a29abe5256ff89effs p.lineTo(8, 8); 3574c91065d028472688ce15e635a29abe5256ff89effs p.lineTo(4, 8); 3575c91065d028472688ce15e635a29abe5256ff89effs // test on vertices 3576c91065d028472688ce15e635a29abe5256ff89effs REPORTER_ASSERT(reporter, p.contains(4, 4)); 3577c91065d028472688ce15e635a29abe5256ff89effs REPORTER_ASSERT(reporter, p.contains(8, 4)); 3578c91065d028472688ce15e635a29abe5256ff89effs REPORTER_ASSERT(reporter, p.contains(8, 8)); 3579c91065d028472688ce15e635a29abe5256ff89effs REPORTER_ASSERT(reporter, p.contains(4, 8)); 3580c91065d028472688ce15e635a29abe5256ff89effs p.reset(); 3581c91065d028472688ce15e635a29abe5256ff89effs p.moveTo(4, 4); 35829aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(6, 8); 35839aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(2, 8); 35849aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test on edge 35859aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(5, 6)); 35869aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(4, 8)); 35879aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(3, 6)); 35889aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.reset(); 35899aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.moveTo(4, 4); 35909aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(0, 6); 35919aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(4, 8); 35929aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test on edge 35939aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(2, 5)); 35949aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(2, 7)); 35959aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(4, 6)); 35969aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test canceling coincident edge (a smaller triangle is coincident with a larger one) 35979aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.reset(); 35989aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.moveTo(4, 0); 35999aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(6, 4); 36009aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(2, 4); 36019aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.moveTo(4, 0); 36029aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(0, 8); 36039aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.lineTo(8, 8); 36049aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, !p.contains(1, 2)); 36059aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, !p.contains(3, 2)); 36069aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, !p.contains(4, 0)); 36079aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(4, 4)); 36089aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark 3609a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test quads 3610a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3611a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3612a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(6, 6, 8, 8); 3613a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(6, 8, 4, 8); 3614a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(4, 6, 4, 4); 3615a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3616a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 36179aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test quad edge 36189aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(5, 5)); 36199aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(5, 8)); 36209aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(4, 5)); 36219cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark // test quad endpoints 36229cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(4, 4)); 36239cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(8, 8)); 36249cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(4, 8)); 3625a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3626a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 36279aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark const SkPoint qPts[] = {{6, 6}, {8, 8}, {6, 8}, {4, 8}, {4, 6}, {4, 4}, {6, 6}}; 36289aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.moveTo(qPts[0]); 36299aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark for (int index = 1; index < (int) SK_ARRAY_COUNT(qPts); index += 2) { 36309aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.quadTo(qPts[index], qPts[index + 1]); 36319aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark } 3632a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3633a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 36349aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test quad edge 36359aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark SkPoint halfway; 36369aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark for (int index = 0; index < (int) SK_ARRAY_COUNT(qPts) - 2; index += 2) { 36379aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark SkEvalQuadAt(&qPts[index], 0.5f, &halfway, nullptr); 36389aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); 36399aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark } 3640a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 36419aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test conics 3642a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 36439aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark const SkPoint kPts[] = {{4, 4}, {6, 6}, {8, 8}, {6, 8}, {4, 8}, {4, 6}, {4, 4}}; 36449aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.moveTo(kPts[0]); 36459aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark for (int index = 1; index < (int) SK_ARRAY_COUNT(kPts); index += 2) { 36469aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark p.conicTo(kPts[index], kPts[index + 1], 0.5f); 36479aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark } 3648a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3649a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 36509aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test conic edge 36519aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark for (int index = 0; index < (int) SK_ARRAY_COUNT(kPts) - 2; index += 2) { 36529aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark SkConic conic(&kPts[index], 0.5f); 36539aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark halfway = conic.evalAt(0.5f); 36549aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); 36559aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark } 36569cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark // test conic end points 36579cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(4, 4)); 36589cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(8, 8)); 36599cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(4, 8)); 3660a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3661a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test cubics 3662a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-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}}; 3663a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (int i = 0; i < 3; ++i) { 3664a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3665a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kEvenOdd_FillType); 3666a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(pts[i].fX, pts[i].fY); 3667a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-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); 3668a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-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); 3669a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 3670a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5.5f, 5.5f)); 3671a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4.5f, 5.5f)); 36729aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark // test cubic edge 36739aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark SkEvalCubicAt(&pts[i], 0.5f, &halfway, nullptr, nullptr); 36749aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); 36759aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark SkEvalCubicAt(&pts[i + 3], 0.5f, &halfway, nullptr, nullptr); 36769aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); 36779cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark // test cubic end points 36789cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(pts[i].fX, pts[i].fY)); 36799cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(pts[i + 3].fX, pts[i + 3].fY)); 36809cb5d755e7ea8647bcf8bb1ee151ca4c86051107caryclark REPORTER_ASSERT(reporter, p.contains(pts[i + 6].fX, pts[i + 6].fY)); 3681a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3682a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3683a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 36840efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.comclass PathRefTest_Private { 36850efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.compublic: 36860efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com static void TestPathRef(skiatest::Reporter* reporter) { 36870efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com static const int kRepeatCnt = 10; 36886b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 3689385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary SkAutoTUnref<SkPathRef> pathRef(new SkPathRef); 36906b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 36910efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com SkPathRef::Editor ed(&pathRef); 36926b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 36930efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 36940efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kMove_Verb, kRepeatCnt); 36950efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 36960efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countPoints()); 36970efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 0 == pathRef->getSegmentMasks()); 36980efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 36990efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kMove_Verb == pathRef->atVerb(i)); 37000efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 37010efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 37026b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 37036b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 37040efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 37050efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kLine_Verb, kRepeatCnt); 37060efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 37070efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countPoints()); 37080efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kLine_SegmentMask == pathRef->getSegmentMasks()); 37090efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 37100efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == pathRef->atVerb(i)); 37110efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 37120efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 37136b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 37146b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 37150efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 37160efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kQuad_Verb, kRepeatCnt); 37170efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 37180efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 2*kRepeatCnt == pathRef->countPoints()); 37190efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kQuad_SegmentMask == pathRef->getSegmentMasks()); 37200efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 37210efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kQuad_Verb == pathRef->atVerb(i)); 37220efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 37230efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 37246b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 37256b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 37260efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 372796fcdcc219d2a0d3579719b84b28bede76efba64halcanary SkScalar* weights = nullptr; 37280efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kConic_Verb, kRepeatCnt, &weights); 37290efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 37300efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 2*kRepeatCnt == pathRef->countPoints()); 37310efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countWeights()); 37320efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kConic_SegmentMask == pathRef->getSegmentMasks()); 373349f085dddff10473b6ebf832a974288300224e60bsalomon REPORTER_ASSERT(reporter, weights); 37340efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 37350efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kConic_Verb == pathRef->atVerb(i)); 37360efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 37370efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 37386b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 37396b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 37400efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 37410efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kCubic_Verb, kRepeatCnt); 37420efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 37430efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 3*kRepeatCnt == pathRef->countPoints()); 37440efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kCubic_SegmentMask == pathRef->getSegmentMasks()); 37450efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 37460efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == pathRef->atVerb(i)); 37470efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 37480efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 37496b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 37506b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 37510efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com}; 37526b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 3753a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_operatorEqual(skiatest::Reporter* reporter) { 3754a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath a; 3755a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath b; 3756a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == a); 3757a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3758a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.setFillType(SkPath::kInverseWinding_FillType); 3759a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3760a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3761a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3762a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 1); 3763a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3764a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3765a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3766a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 1); 3767a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org b.lineTo(1, 2); 3768a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3769a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3770a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 2); 3771a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3772a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3773a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 377466a5d8bf13fe98baae268db0211e9c25e5ece7facaryclarkstatic void compare_dump(skiatest::Reporter* reporter, const SkPath& path, bool force, 3775e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark bool dumpAsHex, const char* str) { 377666a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark SkDynamicMemoryWStream wStream; 3777e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark path.dump(&wStream, force, dumpAsHex); 377866a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark SkAutoDataUnref data(wStream.copyToData()); 377966a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark REPORTER_ASSERT(reporter, data->size() == strlen(str)); 3780d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein if (strlen(str) > 0) { 3781d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein REPORTER_ASSERT(reporter, !memcmp(data->data(), str, strlen(str))); 3782d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein } else { 378396fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, data->data() == nullptr || !memcmp(data->data(), str, strlen(str))); 3784d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein } 378566a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark} 378666a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark 378766a5d8bf13fe98baae268db0211e9c25e5ece7facaryclarkstatic void test_dump(skiatest::Reporter* reporter) { 378866a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark SkPath p; 3789e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, ""); 3790e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, true, false, ""); 379166a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 379266a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.lineTo(3, 4); 3793e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3794e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(3, 4);\n"); 3795e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, true, false, "path.moveTo(1, 2);\n" 3796e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(3, 4);\n" 3797e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(1, 2);\n" 3798e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.close();\n"); 379966a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.reset(); 380066a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 380166a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.quadTo(3, 4, 5, 6); 3802e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3803e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.quadTo(3, 4, 5, 6);\n"); 380466a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.reset(); 380566a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 380666a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.conicTo(3, 4, 5, 6, 0.5f); 3807e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3808e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.conicTo(3, 4, 5, 6, 0.5f);\n"); 380966a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.reset(); 381066a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 381166a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.cubicTo(3, 4, 5, 6, 7, 8); 3812e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3813e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.cubicTo(3, 4, 5, 6, 7, 8);\n"); 3814e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.reset(); 3815e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.moveTo(1, 2); 3816e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.lineTo(3, 4); 381708fa28cd31c96b4ebd9cb532539c3a8c88803d90caryclark compare_dump(reporter, p, false, true, 381808fa28cd31c96b4ebd9cb532539c3a8c88803d90caryclark "path.moveTo(SkBits2Float(0x3f800000), SkBits2Float(0x40000000)); // 1, 2\n" 381908fa28cd31c96b4ebd9cb532539c3a8c88803d90caryclark "path.lineTo(SkBits2Float(0x40400000), SkBits2Float(0x40800000)); // 3, 4\n"); 3820e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.reset(); 3821e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.moveTo(SkBits2Float(0x3f800000), SkBits2Float(0x40000000)); 3822e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.lineTo(SkBits2Float(0x40400000), SkBits2Float(0x40800000)); 3823e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3824e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(3, 4);\n"); 382566a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark} 382666a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark 382784cd621670a357484e1674e06d3d8d6f929a4ab2senorblanconamespace { 382884cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 382984cd621670a357484e1674e06d3d8d6f929a4ab2senorblancoclass ChangeListener : public SkPathRef::GenIDChangeListener { 383084cd621670a357484e1674e06d3d8d6f929a4ab2senorblancopublic: 383184cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco ChangeListener(bool *changed) : fChanged(changed) { *fChanged = false; } 383284cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco virtual ~ChangeListener() {} 383384cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco void onChange() override { 383484cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco *fChanged = true; 383584cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco } 383684cd621670a357484e1674e06d3d8d6f929a4ab2senorblancoprivate: 383784cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco bool* fChanged; 383884cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco}; 383984cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 384084cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco} 384184cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 3842a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgclass PathTest_Private { 3843a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgpublic: 3844a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org static void TestPathTo(skiatest::Reporter* reporter) { 3845a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p, q; 3846a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(4, 4); 3847a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3848a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line(reporter, &p, 4, 4); 3849a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.moveTo(-4, -4); 3850a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3851a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line(reporter, &p, 4, 4); 3852a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.lineTo(7, 8); 3853a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.conicTo(8, 7, 6, 5, 0.5f); 3854a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.quadTo(6, 7, 8, 6); 3855a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.cubicTo(5, 6, 7, 8, 7, 5); 3856a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.close(); 3857a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3858a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect reverseExpected = {-4, -4, 8, 8}; 3859a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == reverseExpected); 3860a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 386184cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 386284cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco static void TestPathrefListeners(skiatest::Reporter* reporter) { 386384cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco SkPath p; 386484cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 386584cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco bool changed = false; 386684cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco p.moveTo(0, 0); 386784cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 386884cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco // Check that listener is notified on moveTo(). 386984cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 3870385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary SkPathPriv::AddGenIDChangeListener(p, new ChangeListener(&changed)); 387184cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, !changed); 387284cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco p.moveTo(10, 0); 387384cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, changed); 387484cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 387584cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco // Check that listener is notified on lineTo(). 3876385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary SkPathPriv::AddGenIDChangeListener(p, new ChangeListener(&changed)); 387784cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, !changed); 387884cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco p.lineTo(20, 0); 387984cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, changed); 388084cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 388184cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco // Check that listener is notified on reset(). 3882385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary SkPathPriv::AddGenIDChangeListener(p, new ChangeListener(&changed)); 388384cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, !changed); 388484cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco p.reset(); 388584cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, changed); 388684cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 388784cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco p.moveTo(0, 0); 388884cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 388984cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco // Check that listener is notified on rewind(). 3890385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary SkPathPriv::AddGenIDChangeListener(p, new ChangeListener(&changed)); 389184cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, !changed); 389284cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco p.rewind(); 389384cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, changed); 389484cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco 389584cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco // Check that listener is notified when pathref is deleted. 389684cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco { 389784cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco SkPath q; 389884cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco q.moveTo(10, 10); 3899385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary SkPathPriv::AddGenIDChangeListener(q, new ChangeListener(&changed)); 390084cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, !changed); 390184cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco } 390284cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco // q went out of scope. 390384cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco REPORTER_ASSERT(reporter, changed); 390484cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco } 3905a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org}; 3906a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 39078e7b19d0f04f286ec283747ec128e9696c842858caryclarkstatic void test_interp(skiatest::Reporter* reporter) { 39088e7b19d0f04f286ec283747ec128e9696c842858caryclark SkPath p1, p2, out; 39098e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.isInterpolatable(p2)); 39108e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.interpolate(p2, 0, &out)); 39118e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1 == out); 39128e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.interpolate(p2, 1, &out)); 39138e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1 == out); 39148e7b19d0f04f286ec283747ec128e9696c842858caryclark p1.moveTo(0, 2); 39158e7b19d0f04f286ec283747ec128e9696c842858caryclark p1.lineTo(0, 4); 39168e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, !p1.isInterpolatable(p2)); 39178e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, !p1.interpolate(p2, 1, &out)); 39188e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.moveTo(6, 0); 39198e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.lineTo(8, 0); 39208e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.isInterpolatable(p2)); 39218e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.interpolate(p2, 0, &out)); 39228e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p2 == out); 39238e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.interpolate(p2, 1, &out)); 39248e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1 == out); 39258e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.interpolate(p2, 0.5f, &out)); 39268e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, out.getBounds() == SkRect::MakeLTRB(3, 1, 4, 2)); 39278e7b19d0f04f286ec283747ec128e9696c842858caryclark p1.reset(); 39288e7b19d0f04f286ec283747ec128e9696c842858caryclark p1.moveTo(4, 4); 39298e7b19d0f04f286ec283747ec128e9696c842858caryclark p1.conicTo(5, 4, 5, 5, 1 / SkScalarSqrt(2)); 39308e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.reset(); 39318e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.moveTo(4, 2); 39328e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.conicTo(7, 2, 7, 5, 1 / SkScalarSqrt(2)); 39338e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.isInterpolatable(p2)); 39348e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, p1.interpolate(p2, 0.5f, &out)); 39358e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, out.getBounds() == SkRect::MakeLTRB(4, 3, 6, 5)); 39368e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.reset(); 39378e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.moveTo(4, 2); 39388e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.conicTo(6, 3, 6, 5, 1); 39398e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, !p1.isInterpolatable(p2)); 39408e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.reset(); 39418e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.moveTo(4, 4); 39428e7b19d0f04f286ec283747ec128e9696c842858caryclark p2.conicTo(5, 4, 5, 5, 0.5f); 39438e7b19d0f04f286ec283747ec128e9696c842858caryclark REPORTER_ASSERT(reporter, !p1.isInterpolatable(p2)); 39448e7b19d0f04f286ec283747ec128e9696c842858caryclark} 39458e7b19d0f04f286ec283747ec128e9696c842858caryclark 39468e7b19d0f04f286ec283747ec128e9696c842858caryclarkDEF_TEST(PathInterp, reporter) { 39478e7b19d0f04f286ec283747ec128e9696c842858caryclark test_interp(reporter); 39488e7b19d0f04f286ec283747ec128e9696c842858caryclark} 39498e7b19d0f04f286ec283747ec128e9696c842858caryclark 39509aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclarkDEF_TEST(PathContains, reporter) { 39519aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark test_contains(reporter); 39529aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark} 39539aacd9029c7076d5c0f0e62338b82ce91de68ef9caryclark 395405ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.orgDEF_TEST(Paths, reporter) { 39554e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org test_path_crbug364224(); 39564e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 3957a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkTSize<SkScalar>::Make(3,4); 3958a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 3959a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkPath p, empty; 3960a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkRect bounds, bounds2; 3961a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 39623abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3963d252db03d9650013b545ef9781fe993c07f8f314reed@android.com REPORTER_ASSERT(reporter, p.getBounds().isEmpty()); 396480e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 3965a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this triggers a code path in SkPath::operator= which is otherwise unexercised 3966a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath& self = p; 3967a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p = self; 3968a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3969a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this triggers a code path in SkPath::swap which is otherwise unexercised 3970a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.swap(self); 3971a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 39723abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.set(0, 0, SK_Scalar1, SK_Scalar1); 39736b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 39746b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.addRoundRect(bounds, SK_Scalar1, SK_Scalar1); 39756b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 397610296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com // we have quads or cubics 3977220f926d9d4b38a9018c922c095847bbd261f583reed REPORTER_ASSERT(reporter, 3978220f926d9d4b38a9018c922c095847bbd261f583reed p.getSegmentMasks() & (kCurveSegmentMask | SkPath::kConic_SegmentMask)); 39794da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 398062047cf1980861234e7367a225928b84ce492c68reed@google.com 39816b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.reset(); 3982a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 398310296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com 39846b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.addOval(bounds); 39856b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 39864da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 398762047cf1980861234e7367a225928b84ce492c68reed@google.com 3988a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com p.rewind(); 3989a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 3990a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 39913abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.addRect(bounds); 39926b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 399310296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com // we have only lines 399410296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com REPORTER_ASSERT(reporter, SkPath::kLine_SegmentMask == p.getSegmentMasks()); 39954da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 39963abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3997a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, p != empty); 3998a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, !(p == empty)); 39993abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 4000df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com // do getPoints and getVerbs return the right result 400196fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, p.getPoints(nullptr, 0) == 4); 400296fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, p.getVerbs(nullptr, 0) == 5); 40033abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com SkPoint pts[4]; 40043abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com int count = p.getPoints(pts, 4); 40053abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, count == 4); 4006df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com uint8_t verbs[6]; 4007df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com verbs[5] = 0xff; 4008df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com p.getVerbs(verbs, 5); 4009df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kMove_Verb == verbs[0]); 4010df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[1]); 4011df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[2]); 4012df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[3]); 4013df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kClose_Verb == verbs[4]); 4014df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, 0xff == verbs[5]); 40153abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds2.set(pts, 4); 40163abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, bounds == bounds2); 401780e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 40183abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.offset(SK_Scalar1*3, SK_Scalar1*4); 40193abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.offset(SK_Scalar1*3, SK_Scalar1*4); 4020d252db03d9650013b545ef9781fe993c07f8f314reed@android.com REPORTER_ASSERT(reporter, bounds == p.getBounds()); 40213abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 402296fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, p.isRect(nullptr)); 4023f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com bounds2.setEmpty(); 40243abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isRect(&bounds2)); 40253abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, bounds == bounds2); 402680e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 40273abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com // now force p to not be a rect 40283abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.set(0, 0, SK_Scalar1/2, SK_Scalar1/2); 40293abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.addRect(bounds); 403096fcdcc219d2a0d3579719b84b28bede76efba64halcanary REPORTER_ASSERT(reporter, !p.isRect(nullptr)); 40313abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 4032fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips // Test an edge case w.r.t. the bound returned by isRect (i.e., the 4033fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips // path has a trailing moveTo. Please see crbug.com\445368) 4034fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips { 4035fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips SkRect r; 4036fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips p.reset(); 4037fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips p.addRect(bounds); 4038fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, p.isRect(&r)); 4039fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, r == bounds); 4040fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips // add a moveTo outside of our bounds 4041fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips p.moveTo(bounds.fLeft + 10, bounds.fBottom + 10); 4042fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, p.isRect(&r)); 4043fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, r == bounds); 4044fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips } 4045fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips 4046a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_operatorEqual(reporter); 40477e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com test_isLine(reporter); 40487e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com test_isRect(reporter); 404995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark test_isNestedFillRects(reporter); 40504da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org test_zero_length_paths(reporter); 4051cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com test_direction(reporter); 405204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com test_convexity(reporter); 40537c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com test_convexity2(reporter); 40549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com test_conservativelyContains(reporter); 4055b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com test_close(reporter); 40566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_segment_masks(reporter); 405753effc5e327749ea47bc0c678cb45246644600b0reed@google.com test_flattening(reporter); 405853effc5e327749ea47bc0c678cb45246644600b0reed@google.com test_transform(reporter); 40593563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com test_bounds(reporter); 40606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_iter(reporter); 40616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_raw_iter(reporter); 40626aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle(reporter); 40636aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_oval(reporter); 40648b06f1a7ff6d5a59387a90433064550de20787eereed@google.com test_strokerec(reporter); 4065744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com test_addPoly(reporter); 40660bb18bb264b26afca45452910437c09445e23a3creed@google.com test_isfinite(reporter); 4067ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com test_isfinite_after_transform(reporter); 4068b1475b0d41efc580207183a4e25d14e920b57360fs test_islastcontourclosed(reporter); 4069b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com test_arb_round_rect_is_convex(reporter); 4070158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com test_arb_zero_rad_round_rect_is_rect(reporter); 4071a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_addrect(reporter); 4072a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com test_addrect_isfinite(reporter); 407354f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_tricky_cubic(); 407454f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_clipped_cubic(); 407554f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_crbug_170666(); 4076e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark test_crbug_493450(reporter); 4077e8c5666e0387e70bd921e01558e627af3f1411dbcaryclark test_crbug_495894(reporter); 40787a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com test_bad_cubic_crbug229478(); 40793eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com test_bad_cubic_crbug234190(); 40801ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org test_gen_id(reporter); 40819d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org test_path_close_issue1474(reporter); 4082b58ba8912ab1a372eb60ab111f477b915eb3da4dreed@google.com test_path_to_region(reporter); 408342feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org test_rrect(reporter); 4084a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_arc(reporter); 4085a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_arcTo(reporter); 4086a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_addPath(reporter); 408714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, false, false); 408814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, true, false); 408914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, false, true); 409014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, true, true); 409114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_extendClosedPath(reporter); 409214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addEmptyPath(reporter, SkPath::kExtend_AddPathMode); 409314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addEmptyPath(reporter, SkPath::kAppend_AddPathMode); 4094a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_conicTo_special_case(reporter); 4095a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_get_point(reporter); 4096a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_contains(reporter); 4097a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org PathTest_Private::TestPathTo(reporter); 40980efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com PathRefTest_Private::TestPathRef(reporter); 409984cd621670a357484e1674e06d3d8d6f929a4ab2senorblanco PathTest_Private::TestPathrefListeners(reporter); 410066a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark test_dump(reporter); 4101b421650e13faa2b77d29b018e78ab07ff693ca32caryclark test_path_crbug389050(reporter); 4102fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr test_path_crbugskia2820(reporter); 41035ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark test_skbug_3469(reporter); 41045bcbe91304ec2515208b5218517579f48874e928reed test_skbug_3239(reporter); 410591f283bb4e6ea71bbd4e6efc27befc29118ee543reed test_bounds_crbug_513799(reporter); 41063abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com} 4107