1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 88cae8358f78b81539f1006afe592a37f1604e67creed@google.com#include "SkCanvas.h" 955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com#include "SkPaint.h" 1004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com#include "SkParse.h" 113e71a887628ff25c806675366b081c70bb10b74dreed@google.com#include "SkParsePath.h" 128f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkPath.h" 138b06f1a7ff6d5a59387a90433064550de20787eereed@google.com#include "SkPathEffect.h" 148f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkRRect.h" 156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org#include "SkRandom.h" 1653effc5e327749ea47bc0c678cb45246644600b0reed@google.com#include "SkReader32.h" 1760bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com#include "SkSize.h" 1866a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark#include "SkStream.h" 198cae8358f78b81539f1006afe592a37f1604e67creed@google.com#include "SkSurface.h" 209c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#include "SkTypes.h" 219c9d4a70028ef8dc33a46cfc0b22e254443effe3mtklein@google.com#include "SkWriter32.h" 228f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 238cae8358f78b81539f1006afe592a37f1604e67creed@google.com 245bcbe91304ec2515208b5218517579f48874e928reedstatic void set_radii(SkVector radii[4], int index, float rad) { 255bcbe91304ec2515208b5218517579f48874e928reed sk_bzero(radii, sizeof(SkVector) * 4); 265bcbe91304ec2515208b5218517579f48874e928reed radii[index].set(rad, rad); 275bcbe91304ec2515208b5218517579f48874e928reed} 285bcbe91304ec2515208b5218517579f48874e928reed 295bcbe91304ec2515208b5218517579f48874e928reedstatic void test_add_rrect(skiatest::Reporter* reporter, const SkRect& bounds, 305bcbe91304ec2515208b5218517579f48874e928reed const SkVector radii[4]) { 315bcbe91304ec2515208b5218517579f48874e928reed SkRRect rrect; 325bcbe91304ec2515208b5218517579f48874e928reed rrect.setRectRadii(bounds, radii); 335bcbe91304ec2515208b5218517579f48874e928reed REPORTER_ASSERT(reporter, bounds == rrect.rect()); 345bcbe91304ec2515208b5218517579f48874e928reed 355bcbe91304ec2515208b5218517579f48874e928reed SkPath path; 365bcbe91304ec2515208b5218517579f48874e928reed // this line should not assert in the debug build (from validate) 375bcbe91304ec2515208b5218517579f48874e928reed path.addRRect(rrect); 385bcbe91304ec2515208b5218517579f48874e928reed REPORTER_ASSERT(reporter, bounds == path.getBounds()); 395bcbe91304ec2515208b5218517579f48874e928reed} 405bcbe91304ec2515208b5218517579f48874e928reed 415ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclarkstatic void test_skbug_3469(skiatest::Reporter* reporter) { 425ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark SkPath path; 435ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark path.moveTo(20, 20); 445ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark path.quadTo(20, 50, 80, 50); 455ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark path.quadTo(20, 50, 20, 80); 465ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark REPORTER_ASSERT(reporter, !path.isConvex()); 475ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark} 485ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark 495bcbe91304ec2515208b5218517579f48874e928reedstatic void test_skbug_3239(skiatest::Reporter* reporter) { 505bcbe91304ec2515208b5218517579f48874e928reed const float min = SkBits2Float(0xcb7f16c8); /* -16717512.000000 */ 515bcbe91304ec2515208b5218517579f48874e928reed const float max = SkBits2Float(0x4b7f1c1d); /* 16718877.000000 */ 525bcbe91304ec2515208b5218517579f48874e928reed const float big = SkBits2Float(0x4b7f1bd7); /* 16718807.000000 */ 535bcbe91304ec2515208b5218517579f48874e928reed 545bcbe91304ec2515208b5218517579f48874e928reed const float rad = 33436320; 555bcbe91304ec2515208b5218517579f48874e928reed 565bcbe91304ec2515208b5218517579f48874e928reed const SkRect rectx = SkRect::MakeLTRB(min, min, max, big); 575bcbe91304ec2515208b5218517579f48874e928reed const SkRect recty = SkRect::MakeLTRB(min, min, big, max); 585bcbe91304ec2515208b5218517579f48874e928reed 595bcbe91304ec2515208b5218517579f48874e928reed SkVector radii[4]; 605bcbe91304ec2515208b5218517579f48874e928reed for (int i = 0; i < 4; ++i) { 615bcbe91304ec2515208b5218517579f48874e928reed set_radii(radii, i, rad); 625bcbe91304ec2515208b5218517579f48874e928reed test_add_rrect(reporter, rectx, radii); 635bcbe91304ec2515208b5218517579f48874e928reed test_add_rrect(reporter, recty, radii); 645bcbe91304ec2515208b5218517579f48874e928reed } 655bcbe91304ec2515208b5218517579f48874e928reed} 665bcbe91304ec2515208b5218517579f48874e928reed 674e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void make_path_crbug364224(SkPath* path) { 684e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->reset(); 694e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->moveTo(3.747501373f, 2.724499941f); 704e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.747501373f, 3.75f); 714e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.747501373f, 3.88774991f, 3.635501385f, 4.0f, 3.497501373f, 4.0f); 724e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.7475013733f, 4.0f); 734e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.6095013618f, 4.0f, 0.4975013733f, 3.88774991f, 0.4975013733f, 3.75f); 744e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.4975013733f, 1.0f); 754e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.4975013733f, 0.8622499704f, 0.6095013618f, 0.75f, 0.7475013733f,0.75f); 764e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.497501373f, 0.75f); 774e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.50275135f, 0.75f, 3.5070014f, 0.7527500391f, 3.513001442f, 0.753000021f); 784e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.715001345f, 0.5512499809f); 794e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.648251295f, 0.5194999576f, 3.575501442f, 0.4999999702f, 3.497501373f, 0.4999999702f); 804e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.7475013733f, 0.4999999702f); 814e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.4715013802f, 0.4999999702f, 0.2475013733f, 0.7239999771f, 0.2475013733f, 1.0f); 824e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(0.2475013733f, 3.75f); 834e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(0.2475013733f, 4.026000023f, 0.4715013504f, 4.25f, 0.7475013733f, 4.25f); 844e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.497501373f, 4.25f); 854e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.773501396f, 4.25f, 3.997501373f, 4.026000023f, 3.997501373f, 3.75f); 864e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.997501373f, 2.474750042f); 874e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->lineTo(3.747501373f, 2.724499941f); 884e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->close(); 894e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 904e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 914e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void make_path_crbug364224_simplified(SkPath* path) { 924e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->moveTo(3.747501373f, 2.724499941f); 934e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->cubicTo(3.648251295f, 0.5194999576f, 3.575501442f, 0.4999999702f, 3.497501373f, 0.4999999702f); 944e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org path->close(); 954e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 964e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 974e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic void test_path_crbug364224() { 984e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkPath path; 994e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkPaint paint; 1003054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(84, 88)); 1014e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org SkCanvas* canvas = surface->getCanvas(); 1024e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 1034e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org make_path_crbug364224_simplified(&path); 1044e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org canvas->drawPath(path, paint); 1054e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 1064e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org make_path_crbug364224(&path); 1074e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org canvas->drawPath(path, paint); 1084e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org} 1094e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 110fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr/** 111fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr * In debug mode, this path was causing an assertion to fail in 112fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr * SkPathStroker::preJoinTo() and, in Release, the use of an unitialized value. 113fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr */ 114fac4e0e83666ab59373169d6c157d3654cb479a3piotaixrstatic void make_path_crbugskia2820(SkPath* path, skiatest::Reporter* reporter) { 115fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr SkPoint orig, p1, p2, p3; 116fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr orig = SkPoint::Make(1.f, 1.f); 117fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr p1 = SkPoint::Make(1.f - SK_ScalarNearlyZero, 1.f); 118fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr p2 = SkPoint::Make(1.f, 1.f + SK_ScalarNearlyZero); 119fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr p3 = SkPoint::Make(2.f, 2.f); 120fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 121fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->reset(); 122fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->moveTo(orig); 123fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->cubicTo(p1, p2, p3); 124fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr path->close(); 125fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr} 126fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 127fac4e0e83666ab59373169d6c157d3654cb479a3piotaixrstatic void test_path_crbugskia2820(skiatest::Reporter* reporter) {//GrContext* context) { 128fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr SkPath path; 129fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr make_path_crbugskia2820(&path, reporter); 130fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 131fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 132fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr stroke.setStrokeStyle(2 * SK_Scalar1); 133fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr stroke.applyToPath(&path, path); 134fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr} 135fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr 136cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void make_path0(SkPath* path) { 137cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com // from * https://code.google.com/p/skia/issues/detail?id=1706 138cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 139cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->moveTo(146.939f, 1012.84f); 140cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(181.747f, 1009.18f); 141cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(182.165f, 1013.16f); 142cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(147.357f, 1016.82f); 143cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->lineTo(146.939f, 1012.84f); 144cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->close(); 145cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 146cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 147cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void make_path1(SkPath* path) { 148cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path->addRect(SkRect::MakeXYWH(10, 10, 10, 1)); 149cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 150cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 151cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comtypedef void (*PathProc)(SkPath*); 152cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 153cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com/* 154cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * Regression test: we used to crash (overwrite internal storage) during 155cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * construction of the region when the path was INVERSE. That is now fixed, 156cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * so test these regions (which used to assert/crash). 157cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * 158cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com * https://code.google.com/p/skia/issues/detail?id=1706 159cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com */ 160cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.comstatic void test_path_to_region(skiatest::Reporter* reporter) { 161cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com PathProc procs[] = { 162cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com make_path0, 163cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com make_path1, 164cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com }; 165472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 166cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkRegion clip; 167cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com clip.setRect(0, 0, 1255, 1925); 168472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 169cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(procs); ++i) { 170cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkPath path; 171cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com procs[i](&path); 172472629190eb3c8220742c584e19f3a07b2d09c8cskia.committer@gmail.com 173cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com SkRegion rgn; 174cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com rgn.setPath(path, clip); 175cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com path.toggleInverseFillType(); 176cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com rgn.setPath(path, clip); 177cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com } 178cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com} 179cc8be77bc2371bba2ebb43102fa7a5ebc098a856reed@google.com 18056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#if defined(WIN32) 18156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com #define SUPPRESS_VISIBILITY_WARNING 18256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#else 18356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com #define SUPPRESS_VISIBILITY_WARNING __attribute__((visibility("hidden"))) 18456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com#endif 18556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 1869d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.orgstatic void test_path_close_issue1474(skiatest::Reporter* reporter) { 1879d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // This test checks that r{Line,Quad,Conic,Cubic}To following a close() 1889d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // are relative to the point we close to, not relative to the point we close from. 1899d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org SkPath path; 1909d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org SkPoint last; 1919d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1929d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rLineTo(). 1939d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 1949d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 1959d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); // Returns us back to 0,0. 1969d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(50, 50); // This should go to 50,50. 1979d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 1989d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 1999d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 50 == last.fX); 2009d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 50 == last.fY); 2019d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2029d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rQuadTo(). 2039d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 2049d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 2059d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 2069d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 2079d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rQuadTo(50, 50, 75, 75); 2089d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2099d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 2109d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 75 == last.fX); 2119d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 75 == last.fY); 2129d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2139d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rConicTo(). 2149d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 2159d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 2169d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 2179d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 2189d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rConicTo(50, 50, 85, 85, 2); 2199d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2209d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 2219d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 85 == last.fX); 2229d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 85 == last.fY); 2239d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2249d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org // Test rCubicTo(). 2259d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rewind(); 2269d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(0, 100); 2279d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rLineTo(100, 0); 2289d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.close(); 2299d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.rCubicTo(50, 50, 85, 85, 95, 95); 2309d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2319d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org path.getLastPt(&last); 2329d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 95 == last.fX); 2339d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org REPORTER_ASSERT(reporter, 95 == last.fY); 2349d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org} 2359d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org 2361ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.orgstatic void test_gen_id(skiatest::Reporter* reporter) { 2371ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org SkPath a, b; 2381ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == b.getGenerationID()); 2391ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2401ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.moveTo(0, 0); 2411ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t z = a.getGenerationID(); 2421ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, z != b.getGenerationID()); 2431ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2441ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.reset(); 2451ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == b.getGenerationID()); 2461ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2471ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.moveTo(1, 1); 2481ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t y = a.getGenerationID(); 2491ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, z != y); 2501ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2511ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org b.moveTo(2, 2); 2521ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t x = b.getGenerationID(); 2531ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, x != y && x != z); 2541ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2551ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org a.swap(b); 2561ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == y && a.getGenerationID() == x); 2571ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2581ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org b = a; 2591ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == x); 2601ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2611ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org SkPath c(a); 2621ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, c.getGenerationID() == x); 2631ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2641ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.lineTo(3, 3); 2651ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t w = c.getGenerationID(); 2661ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, b.getGenerationID() == x); 2671ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, a.getGenerationID() == x); 2681ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, w != x); 2691ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 27050da1d8c3b3799ce22b09c83443b476b12a9af8fdjsollen#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK 2711ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org static bool kExpectGenIDToIgnoreFill = false; 2721ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org#else 2731ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org static bool kExpectGenIDToIgnoreFill = true; 2741ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org#endif 2751ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2761ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.toggleInverseFillType(); 2771ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org const uint32_t v = c.getGenerationID(); 2781ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, (v == w) == kExpectGenIDToIgnoreFill); 2791ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2801ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org c.rewind(); 2811ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org REPORTER_ASSERT(reporter, v != c.getGenerationID()); 2821ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org} 2831ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org 2843eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com// This used to assert in the debug build, as the edges did not all line-up. 2853eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.comstatic void test_bad_cubic_crbug234190() { 2863eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com SkPath path; 2873eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com path.moveTo(13.8509f, 3.16858f); 2883eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com path.cubicTo(-2.35893e+08f, -4.21044e+08f, 2893eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com -2.38991e+08f, -4.26573e+08f, 2903eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com -2.41016e+08f, -4.30188e+08f); 2913eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com 2923eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com SkPaint paint; 2933eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com paint.setAntiAlias(true); 2943054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(84, 88)); 2953eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com surface->getCanvas()->drawPath(path, paint); 2963eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com} 2973eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com 2987a90daf25878a7459ba9fbda581bb97cda034f02reed@google.comstatic void test_bad_cubic_crbug229478() { 2997a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com const SkPoint pts[] = { 300391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4595.91064f, -11596.9873f }, 301391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4597.2168f, -11595.9414f }, 302391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4598.52344f, -11594.8955f }, 303391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com { 4599.83008f, -11593.8496f }, 3047a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com }; 305391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 3067a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPath path; 3077a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com path.moveTo(pts[0]); 3087a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 309391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 3107a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPaint paint; 3117a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.setStyle(SkPaint::kStroke_Style); 3127a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.setStrokeWidth(20); 313391ca66276b27464f255c371e7e95f56f9042042skia.committer@gmail.com 3147a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com SkPath dst; 3157a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com // Before the fix, this would infinite-recurse, and run out of stack 3167a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com // because we would keep trying to subdivide a degenerate cubic segment. 3177a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com paint.getFillPath(path, &dst, NULL); 3187a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com} 3197a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com 32064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.comstatic void build_path_170666(SkPath& path) { 32164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(17.9459f, 21.6344f); 32264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.545f, -47.8105f); 32364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.545f, -47.8105f); 32464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(131.07f, -47.3888f); 32564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(131.07f, -47.3888f); 32664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.586f, -46.9532f); 32764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.586f, -46.9532f); 32864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 32964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 33064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18085.1f, 31390.5f); 33164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18085.1f, 31390.5f); 33264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 33364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18076.6f, 31390.9f); 33464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.3f); 33564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.3f); 33664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17963.5f, 31459.9f); 33764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17963.5f, 31459.9f); 33864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 33964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 34064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9551f, 21.6205f); 34164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9551f, 21.6205f); 34264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(9.47091f, 22.0561f); 34364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(9.47091f, 22.0561f); 34464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9459f, 21.6344f); 34564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17.9459f, 21.6344f); 34664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close();path.moveTo(0.995934f, 22.4779f); 34764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.986725f, 22.4918f); 34864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.986725f, 22.4918f); 34964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.4f); 35064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17955, 31460.4f); 35164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 35264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(17971.9f, 31459.5f); 35364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390.1f); 35464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390.1f); 35564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390); 35664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(18093.6f, 31390); 35764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.555f, -47.8244f); 35864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(139.555f, -47.8244f); 35964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.595f, -46.9671f); 36064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(122.595f, -46.9671f); 36164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.995934f, 22.4779f); 36264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(0.995934f, 22.4779f); 36364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close(); 36464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(5.43941f, 25.5223f); 36564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798267, -28871.1f); 36664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798267, -28871.1f); 36764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(3.12512e+06f, -113102); 36864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(3.12512e+06f, -113102); 36964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(5.16324e+06f, -186882, 8.15247e+06f, -295092, 1.1957e+07f, -432813); 37064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.95659e+07f, -708257, 3.04359e+07f, -1.10175e+06f, 4.34798e+07f, -1.57394e+06f); 37164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(6.95677e+07f, -2.51831e+06f, 1.04352e+08f, -3.77748e+06f, 1.39135e+08f, -5.03666e+06f); 37264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.73919e+08f, -6.29583e+06f, 2.08703e+08f, -7.555e+06f, 2.34791e+08f, -8.49938e+06f); 37364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.47835e+08f, -8.97157e+06f, 2.58705e+08f, -9.36506e+06f, 2.66314e+08f, -9.6405e+06f); 37464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.70118e+08f, -9.77823e+06f, 2.73108e+08f, -9.88644e+06f, 2.75146e+08f, -9.96022e+06f); 37564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.76165e+08f, -9.99711e+06f, 2.76946e+08f, -1.00254e+07f, 2.77473e+08f, -1.00444e+07f); 37664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.78271e+08f, -1.00733e+07f); 37764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.78271e+08f, -1.00733e+07f); 37864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.78271e+08f, -1.00733e+07f, 2.08703e+08f, -7.555e+06f, 135.238f, 23.3517f); 37964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(131.191f, 23.4981f, 125.995f, 23.7976f, 123.631f, 24.0206f); 38064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(121.267f, 24.2436f, 122.631f, 24.3056f, 126.677f, 24.1591f); 38164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 2.78271e+08f, -1.00733e+07f, 2.78271e+08f, -1.00733e+07f); 38264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.77473e+08f, -1.00444e+07f); 38364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(2.77473e+08f, -1.00444e+07f); 38464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.76946e+08f, -1.00254e+07f, 2.76165e+08f, -9.99711e+06f, 2.75146e+08f, -9.96022e+06f); 38564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.73108e+08f, -9.88644e+06f, 2.70118e+08f, -9.77823e+06f, 2.66314e+08f, -9.6405e+06f); 38664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.58705e+08f, -9.36506e+06f, 2.47835e+08f, -8.97157e+06f, 2.34791e+08f, -8.49938e+06f); 38764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 1.73919e+08f, -6.29583e+06f, 1.39135e+08f, -5.03666e+06f); 38864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(1.04352e+08f, -3.77749e+06f, 6.95677e+07f, -2.51831e+06f, 4.34798e+07f, -1.57394e+06f); 38964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(3.04359e+07f, -1.10175e+06f, 1.95659e+07f, -708258, 1.1957e+07f, -432814); 39064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(8.15248e+06f, -295092, 5.16324e+06f, -186883, 3.12513e+06f, -113103); 39164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798284, -28872); 39264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(798284, -28872); 39364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(22.4044f, 24.6677f); 39464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.lineTo(22.4044f, 24.6677f); 39564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(22.5186f, 24.5432f, 18.8134f, 24.6337f, 14.1287f, 24.8697f); 39664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(9.4439f, 25.1057f, 5.55359f, 25.3978f, 5.43941f, 25.5223f); 39764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.close(); 39864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 39964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 40064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.comstatic void build_path_simple_170666(SkPath& path) { 40164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.moveTo(126.677f, 24.1591f); 40264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com path.cubicTo(2.08703e+08f, -7.555e+06f, 2.78271e+08f, -1.00733e+07f, 2.78271e+08f, -1.00733e+07f); 40364d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 40464d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 40564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// This used to assert in the SK_DEBUG build, as the clip step would fail with 40664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// too-few interations in our cubic-line intersection code. That code now runs 40764d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com// 24 interations (instead of 16). 40854f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_crbug_170666() { 40964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com SkPath path; 41064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com SkPaint paint; 41164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com paint.setAntiAlias(true); 41264d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 4133054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(1000, 1000)); 41436df7ed46b41ac31cb2205bfd3ae37659d61e2fbskia.committer@gmail.com 41564d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com build_path_simple_170666(path); 41664d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com surface->getCanvas()->drawPath(path, paint); 41736df7ed46b41ac31cb2205bfd3ae37659d61e2fbskia.committer@gmail.com 41864d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com build_path_170666(path); 41964d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com surface->getCanvas()->drawPath(path, paint); 42064d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com} 42164d6295b0f6d500ccb3e8091adb2c334925dc388reed@google.com 422a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_addrect(skiatest::Reporter* reporter) { 423a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath path; 424a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(0, 0); 425a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 426a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, path.isRect(NULL)); 427a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 428a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 429a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(FLT_EPSILON, FLT_EPSILON); 430a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 431a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 432a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 433a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 434a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.quadTo(0, 0, 0, 0); 435a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 436a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 437a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 438a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 439a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conicTo(0, 0, 0, 0, 0.5f); 440a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 441a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 442a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 443a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 444a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.cubicTo(0, 0, 0, 0, 0, 0); 445a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addRect(SkRect::MakeWH(50, 100)); 446a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isRect(NULL)); 447a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 448a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 449a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com// Make sure we stay non-finite once we get there (unless we reset or rewind). 450a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.comstatic void test_addrect_isfinite(skiatest::Reporter* reporter) { 451a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com SkPath path; 4528b0e2340e11e973d27aea39ec65e6bc9738224a5skia.committer@gmail.com 453a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 454a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 455a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 456a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.moveTo(0, 0); 457a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.lineTo(SK_ScalarInfinity, 42); 458a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 459a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 460a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 461a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 462a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 463a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.reset(); 464a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 4658b0e2340e11e973d27aea39ec65e6bc9738224a5skia.committer@gmail.com 466a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com path.addRect(SkRect::MakeWH(50, 100)); 467a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 468a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com} 469a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com 470848148ec109172f9eef9a26fa23a520cf9072b5creed@google.comstatic void build_big_path(SkPath* path, bool reducedCase) { 471848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com if (reducedCase) { 472848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(577330, 1971.72f); 473848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f); 474848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } else { 475848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(60.1631f, 7.70567f); 476848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(60.1631f, 7.70567f, 0.99474f, 0.901199f); 477848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->lineTo(577379, 1977.77f); 478848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577364, 1979.57f, 577325, 1980.26f); 479848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577286, 1980.95f, 577245, 1980.13f); 480848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577205, 1979.3f, 577187, 1977.45f); 481848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577168, 1975.6f, 577183, 1973.8f); 482848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577198, 1972, 577238, 1971.31f); 483848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577277, 1970.62f, 577317, 1971.45f); 484848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->quadTo(577330, 1971.72f, 577341, 1972.11f); 485848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f); 486848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->moveTo(306.718f, -32.912f); 487848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com path->cubicTo(30.531f, 10.0005f, 1502.47f, 13.2804f, 84.3088f, 9.99601f); 488848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 489848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com} 490848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 49154f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_clipped_cubic() { 4923054be16dfdb0d06233770cbfc338958edef44eareed SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(640, 480)); 493848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 494848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // This path used to assert, because our cubic-chopping code incorrectly 495848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // moved control points after the chop. This test should be run in SK_DEBUG 496848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com // mode to ensure that we no long assert. 497848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com SkPath path; 498848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com for (int doReducedCase = 0; doReducedCase <= 1; ++doReducedCase) { 499848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com build_big_path(&path, SkToBool(doReducedCase)); 500ff21c2e0ae23da0f4742b47d4d37969a2a18bd99skia.committer@gmail.com 501848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com SkPaint paint; 502848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com for (int doAA = 0; doAA <= 1; ++doAA) { 503848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com paint.setAntiAlias(SkToBool(doAA)); 504848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com surface->getCanvas()->drawPath(path, paint); 505848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 506848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com } 507848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com} 508848148ec109172f9eef9a26fa23a520cf9072b5creed@google.com 5098cae8358f78b81539f1006afe592a37f1604e67creed@google.com// Inspired by http://ie.microsoft.com/testdrive/Performance/Chalkboard/ 5108cae8358f78b81539f1006afe592a37f1604e67creed@google.com// which triggered an assert, from a tricky cubic. This test replicates that 5118cae8358f78b81539f1006afe592a37f1604e67creed@google.com// example, so we can ensure that we handle it (in SkEdge.cpp), and don't 5128cae8358f78b81539f1006afe592a37f1604e67creed@google.com// assert in the SK_DEBUG build. 51354f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.comstatic void test_tricky_cubic() { 5148cae8358f78b81539f1006afe592a37f1604e67creed@google.com const SkPoint pts[] = { 515055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8943768), SkDoubleToScalar(129.121277) }, 516055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8937435), SkDoubleToScalar(129.121689) }, 517055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.8950119), SkDoubleToScalar(129.120422) }, 518055c7c299cb47eebd360b809ad58a0006e2e55f7skia.committer@gmail.com { SkDoubleToScalar(18.5030727), SkDoubleToScalar(129.13121) }, 5198cae8358f78b81539f1006afe592a37f1604e67creed@google.com }; 5208cae8358f78b81539f1006afe592a37f1604e67creed@google.com 5218cae8358f78b81539f1006afe592a37f1604e67creed@google.com SkPath path; 5228cae8358f78b81539f1006afe592a37f1604e67creed@google.com path.moveTo(pts[0]); 5238cae8358f78b81539f1006afe592a37f1604e67creed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 5248cae8358f78b81539f1006afe592a37f1604e67creed@google.com 5258cae8358f78b81539f1006afe592a37f1604e67creed@google.com SkPaint paint; 5268cae8358f78b81539f1006afe592a37f1604e67creed@google.com paint.setAntiAlias(true); 5278cae8358f78b81539f1006afe592a37f1604e67creed@google.com 5283054be16dfdb0d06233770cbfc338958edef44eareed SkSurface* surface = SkSurface::NewRasterN32Premul(19, 130); 5298cae8358f78b81539f1006afe592a37f1604e67creed@google.com surface->getCanvas()->drawPath(path, paint); 5308cae8358f78b81539f1006afe592a37f1604e67creed@google.com surface->unref(); 5318cae8358f78b81539f1006afe592a37f1604e67creed@google.com} 5323abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 533ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com// Inspired by http://code.google.com/p/chromium/issues/detail?id=141651 534ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com// 535ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.comstatic void test_isfinite_after_transform(skiatest::Reporter* reporter) { 536ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com SkPath path; 537ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.quadTo(157, 366, 286, 208); 538ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.arcTo(37, 442, 315, 163, 957494590897113.0f); 539d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 540ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com SkMatrix matrix; 541ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com matrix.setScale(1000*1000, 1000*1000); 542ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 543ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // Be sure that path::transform correctly updates isFinite and the bounds 544ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // if the transformation overflows. The previous bug was that isFinite was 545ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // set to true in this case, but the bounds were not set to empty (which 546ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // they should be). 547ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com while (path.isFinite()) { 548ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isFinite()); 549ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, !path.getBounds().isEmpty()); 550ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.transform(matrix); 551ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com } 552ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isEmpty()); 553ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 554ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com matrix.setTranslate(SK_Scalar1, SK_Scalar1); 555ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com path.transform(matrix); 556ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com // we need to still be non-finite 557ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 558ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com REPORTER_ASSERT(reporter, path.getBounds().isEmpty()); 559ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com} 560ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com 5616a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.comstatic void add_corner_arc(SkPath* path, const SkRect& rect, 5626a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.com SkScalar xIn, SkScalar yIn, 563b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com int startAngle) 564b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com{ 565b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 566b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar rx = SkMinScalar(rect.width(), xIn); 567b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar ry = SkMinScalar(rect.height(), yIn); 568b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 569b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkRect arcRect; 570b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.set(-rx, -ry, rx, ry); 571b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com switch (startAngle) { 572b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 0: 573b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom); 574b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 575b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 90: 576b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom); 577b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 578b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 180: 579b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop); 580b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 581b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com case 270: 582b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop); 583b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 584b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com default: 585b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com break; 586b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 587b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 588b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false); 589b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 590b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 5916a748ad8d82576c4ce59e9b2409d41a93bf05cdfskia.committer@gmail.comstatic void make_arb_round_rect(SkPath* path, const SkRect& r, 592b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkScalar xCorner, SkScalar yCorner) { 593b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com // we are lazy here and use the same x & y for each corner 594b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 270); 595b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 0); 596b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 90); 597b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 180); 598158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com path->close(); 599b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 600b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 601b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different. 602b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Performance will suffer if they are not convex. 603b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// Note: PathBench::ArbRoundRectBench performs almost exactly 604b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with drawing) 605b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.comstatic void test_arb_round_rect_is_convex(skiatest::Reporter* reporter) { 606e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 607b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkRect r; 608b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 609b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com for (int i = 0; i < 5000; ++i) { 610b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 611158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 612158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 613b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com continue; 614b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 615b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 616b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 617158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 618158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 619b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 620b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkPath temp; 621b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 622b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15); 623b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 624b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com REPORTER_ASSERT(reporter, temp.isConvex()); 625b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 626b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com} 627b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com 628158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome will sometimes create a 0 radius round rect. The degenerate 629158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// quads prevent the path from being converted to a rect 630158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Note: PathBench::ArbRoundRectBench performs almost exactly 631158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// the same test (but with drawing) 632158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.comstatic void test_arb_zero_rad_round_rect_is_rect(skiatest::Reporter* reporter) { 633e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 634158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkRect r; 635158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 636158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com for (int i = 0; i < 5000; ++i) { 637158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 638158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 639158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 640158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com continue; 641158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 642158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 643158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 644158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 645158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 646158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 647158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkPath temp; 648158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 649158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, 0, 0); 650158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 651158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkRect result; 652158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com REPORTER_ASSERT(reporter, temp.isRect(&result)); 653158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com REPORTER_ASSERT(reporter, r == result); 654158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 655158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com} 656158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 6570bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_rect_isfinite(skiatest::Reporter* reporter) { 6580bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar inf = SK_ScalarInfinity; 6597abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com const SkScalar negInf = SK_ScalarNegativeInfinity; 6600bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar nan = SK_ScalarNaN; 661d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6620bb18bb264b26afca45452910437c09445e23a3creed@google.com SkRect r; 6630bb18bb264b26afca45452910437c09445e23a3creed@google.com r.setEmpty(); 6640bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isFinite()); 6657abfa49390bac6c07161435324ba5f2d3b270635caryclark@google.com r.set(0, 0, inf, negInf); 6660bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isFinite()); 6670bb18bb264b26afca45452910437c09445e23a3creed@google.com r.set(0, 0, nan, 0); 6680bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isFinite()); 669d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6700bb18bb264b26afca45452910437c09445e23a3creed@google.com SkPoint pts[] = { 6710bb18bb264b26afca45452910437c09445e23a3creed@google.com { 0, 0 }, 6720bb18bb264b26afca45452910437c09445e23a3creed@google.com { SK_Scalar1, 0 }, 6730bb18bb264b26afca45452910437c09445e23a3creed@google.com { 0, SK_Scalar1 }, 6740bb18bb264b26afca45452910437c09445e23a3creed@google.com }; 675d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6760bb18bb264b26afca45452910437c09445e23a3creed@google.com bool isFine = r.setBoundsCheck(pts, 3); 6770bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, isFine); 6780bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !r.isEmpty()); 679d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6800bb18bb264b26afca45452910437c09445e23a3creed@google.com pts[1].set(inf, 0); 6810bb18bb264b26afca45452910437c09445e23a3creed@google.com isFine = r.setBoundsCheck(pts, 3); 6820bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !isFine); 6830bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isEmpty()); 684d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6850bb18bb264b26afca45452910437c09445e23a3creed@google.com pts[1].set(nan, 0); 6860bb18bb264b26afca45452910437c09445e23a3creed@google.com isFine = r.setBoundsCheck(pts, 3); 6870bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !isFine); 6880bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, r.isEmpty()); 6890bb18bb264b26afca45452910437c09445e23a3creed@google.com} 6900bb18bb264b26afca45452910437c09445e23a3creed@google.com 6910bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_path_isfinite(skiatest::Reporter* reporter) { 6920bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar inf = SK_ScalarInfinity; 69350c79d886bf435d3a9cad056885370e2c3f526adbsalomon@google.com const SkScalar negInf = SK_ScalarNegativeInfinity; 6940bb18bb264b26afca45452910437c09445e23a3creed@google.com const SkScalar nan = SK_ScalarNaN; 695d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 6960bb18bb264b26afca45452910437c09445e23a3creed@google.com SkPath path; 6970bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 6980bb18bb264b26afca45452910437c09445e23a3creed@google.com 6990bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 7000bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 7010bb18bb264b26afca45452910437c09445e23a3creed@google.com 7020bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 7030bb18bb264b26afca45452910437c09445e23a3creed@google.com path.moveTo(SK_Scalar1, 0); 7040bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, path.isFinite()); 7050bb18bb264b26afca45452910437c09445e23a3creed@google.com 7060bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 70750c79d886bf435d3a9cad056885370e2c3f526adbsalomon@google.com path.moveTo(inf, negInf); 7080bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 7090bb18bb264b26afca45452910437c09445e23a3creed@google.com 7100bb18bb264b26afca45452910437c09445e23a3creed@google.com path.reset(); 7110bb18bb264b26afca45452910437c09445e23a3creed@google.com path.moveTo(nan, 0); 7120bb18bb264b26afca45452910437c09445e23a3creed@google.com REPORTER_ASSERT(reporter, !path.isFinite()); 7130bb18bb264b26afca45452910437c09445e23a3creed@google.com} 7140bb18bb264b26afca45452910437c09445e23a3creed@google.com 7150bb18bb264b26afca45452910437c09445e23a3creed@google.comstatic void test_isfinite(skiatest::Reporter* reporter) { 7160bb18bb264b26afca45452910437c09445e23a3creed@google.com test_rect_isfinite(reporter); 7170bb18bb264b26afca45452910437c09445e23a3creed@google.com test_path_isfinite(reporter); 7180bb18bb264b26afca45452910437c09445e23a3creed@google.com} 7190bb18bb264b26afca45452910437c09445e23a3creed@google.com 720744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// assert that we always 721744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// start with a moveTo 722744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have 1 moveTo 723744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have Lines after that 724744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// end with a single close 725744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// only have (at most) 1 close 726744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com// 727744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comstatic void test_poly(skiatest::Reporter* reporter, const SkPath& path, 72854f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com const SkPoint srcPts[], bool expectClose) { 729744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPath::RawIter iter(path); 730744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPoint pts[4]; 731744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 732744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com bool firstTime = true; 733744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com bool foundClose = false; 734744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (;;) { 735744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com switch (iter.next(pts)) { 736744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kMove_Verb: 737744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, firstTime); 738744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, pts[0] == srcPts[0]); 739744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com srcPts++; 740744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com firstTime = false; 741744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 742744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kLine_Verb: 743744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !firstTime); 744744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, pts[1] == srcPts[0]); 745744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com srcPts++; 746744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 747744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kQuad_Verb: 748330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected quad verb"); 749744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 750277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 751330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected conic verb"); 752277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 753744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kCubic_Verb: 754330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com REPORTER_ASSERT_MESSAGE(reporter, false, "unexpected cubic verb"); 755744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 756744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kClose_Verb: 757744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !firstTime); 758744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, !foundClose); 759744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, expectClose); 760744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com foundClose = true; 761744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com break; 762744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com case SkPath::kDone_Verb: 763744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com goto DONE; 764744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 765744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 766744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comDONE: 767744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com REPORTER_ASSERT(reporter, foundClose == expectClose); 768744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com} 769744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 770744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.comstatic void test_addPoly(skiatest::Reporter* reporter) { 771744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPoint pts[32]; 772e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 773d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 774744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(pts); ++i) { 775744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com pts[i].fX = rand.nextSScalar1(); 776744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com pts[i].fY = rand.nextSScalar1(); 777744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 778744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 779744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (int doClose = 0; doClose <= 1; ++doClose) { 780744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com for (size_t count = 1; count <= SK_ARRAY_COUNT(pts); ++count) { 781744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com SkPath path; 7829880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon path.addPoly(pts, SkToInt(count), SkToBool(doClose)); 78354f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_poly(reporter, path, pts, SkToBool(doClose)); 784744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 785744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com } 786744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com} 787744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com 7888b06f1a7ff6d5a59387a90433064550de20787eereed@google.comstatic void test_strokerec(skiatest::Reporter* reporter) { 7898b06f1a7ff6d5a59387a90433064550de20787eereed@google.com SkStrokeRec rec(SkStrokeRec::kFill_InitStyle); 7908b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, rec.isFillStyle()); 791d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7928b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setHairlineStyle(); 7938b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, rec.isHairlineStyle()); 794d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7958b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(SK_Scalar1, false); 7968b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kStroke_Style == rec.getStyle()); 797d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7988b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(SK_Scalar1, true); 7998b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kStrokeAndFill_Style == rec.getStyle()); 800d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8018b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(0, false); 8028b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kHairline_Style == rec.getStyle()); 803d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8048b06f1a7ff6d5a59387a90433064550de20787eereed@google.com rec.setStrokeStyle(0, true); 8058b06f1a7ff6d5a59387a90433064550de20787eereed@google.com REPORTER_ASSERT(reporter, SkStrokeRec::kFill_Style == rec.getStyle()); 8068b06f1a7ff6d5a59387a90433064550de20787eereed@google.com} 8078b06f1a7ff6d5a59387a90433064550de20787eereed@google.com 80830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com// Set this for paths that don't have a consistent direction such as a bowtie. 80930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com// (cheapComputeDirection is not expected to catch these.) 81030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic const SkPath::Direction kDontCheckDir = static_cast<SkPath::Direction>(-1); 81130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 81230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void check_direction(skiatest::Reporter* reporter, const SkPath& path, 81330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction expected) { 81430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (expected == kDontCheckDir) { 81530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com return; 81630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 81730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath copy(path); // we make a copy so that we don't cache the result on the passed in path. 81830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 81930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir; 82030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (copy.cheapComputeDirection(&dir)) { 82130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, dir == expected); 82230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 82330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kUnknown_Direction == expected); 824f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com } 825f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com} 826f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 8273e71a887628ff25c806675366b081c70bb10b74dreed@google.comstatic void test_direction(skiatest::Reporter* reporter) { 8283e71a887628ff25c806675366b081c70bb10b74dreed@google.com size_t i; 8293e71a887628ff25c806675366b081c70bb10b74dreed@google.com SkPath path; 8303e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapComputeDirection(NULL)); 8313e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapIsDirection(SkPath::kCW_Direction)); 8323e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapIsDirection(SkPath::kCCW_Direction)); 833a8a3b3d9a027ad54ce20f8b4ed7c577a176b31careed@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(SkPath::kUnknown_Direction)); 8343e71a887628ff25c806675366b081c70bb10b74dreed@google.com 8353e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gDegen[] = { 8363e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10", 8373e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 M 20 20", 8383e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 L 20 20", 8393e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 L 10 10 L 10 10", 8403e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 Q 10 10 10 10", 8413e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 10 10 10 10 10 10", 8423e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 8433e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gDegen); ++i) { 8443e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 8453e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gDegen[i], &path); 8463e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 8473e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, !path.cheapComputeDirection(NULL)); 8483e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 849d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8503e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gCW[] = { 851cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com "M 10 10 L 10 10 Q 20 10 20 20", 8523e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 20 10 20 20 20 20", 853d414666d18fa9dca1cb310bc66c574aac3d79b72reed@google.com "M 20 10 Q 20 20 30 20 L 10 20", // test double-back at y-max 8544eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // rect with top two corners replaced by cubics with identical middle 8554eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // control points 85620fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 10 10 C 10 0 10 0 20 0 L 40 0 C 50 0 50 0 50 10", 85720fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 20 10 L 0 10 Q 10 10 20 0", // left, degenerate serif 8583e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 8593e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gCW); ++i) { 8603e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 8613e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gCW[i], &path); 8623e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 86330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCW_Direction); 8643e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 865d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8663e71a887628ff25c806675366b081c70bb10b74dreed@google.com static const char* gCCW[] = { 867cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com "M 10 10 L 10 10 Q 20 10 20 -20", 8683e71a887628ff25c806675366b081c70bb10b74dreed@google.com "M 10 10 C 20 10 20 -20 20 -20", 869d414666d18fa9dca1cb310bc66c574aac3d79b72reed@google.com "M 20 10 Q 20 20 10 20 L 30 20", // test double-back at y-max 8704eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // rect with top two corners replaced by cubics with identical middle 8714eefe6132cbf77696134f65762ebcae574227b77bsalomon@google.com // control points 87220fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 50 10 C 50 0 50 0 40 0 L 20 0 C 10 0 10 0 10 10", 87320fb0c7f22a0bee68bf620f765836a60ca80f9b5reed@google.com "M 10 10 L 30 10 Q 20 10 10 0", // right, degenerate serif 8743e71a887628ff25c806675366b081c70bb10b74dreed@google.com }; 8753e71a887628ff25c806675366b081c70bb10b74dreed@google.com for (i = 0; i < SK_ARRAY_COUNT(gCCW); ++i) { 8763e71a887628ff25c806675366b081c70bb10b74dreed@google.com path.reset(); 8773e71a887628ff25c806675366b081c70bb10b74dreed@google.com bool valid = SkParsePath::FromSVGString(gCCW[i], &path); 8783e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, valid); 87930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCCW_Direction); 8803e71a887628ff25c806675366b081c70bb10b74dreed@google.com } 881ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com 882ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com // Test two donuts, each wound a different direction. Only the outer contour 883ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com // determines the cheap direction 884ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.reset(); 885ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(2), SkPath::kCW_Direction); 886ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(1), SkPath::kCCW_Direction); 88730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCW_Direction); 888f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 889ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.reset(); 890ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(1), SkPath::kCW_Direction); 891ac8543ff574cb08ad46bee691d64e31fe31339e5reed@google.com path.addCircle(0, 0, SkIntToScalar(2), SkPath::kCCW_Direction); 89230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCCW_Direction); 893f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com 894f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com // triangle with one point really far from the origin. 895f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com path.reset(); 896f0ed80a7ebef9b9c08093390b173e64bf300d7d7bsalomon@google.com // the first point is roughly 1.05e10, 1.05e10 8974b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org path.moveTo(SkBits2Float(0x501c7652), SkBits2Float(0x501c7652)); 89853aab7813ca20360426524361941cf43567fc7aebsalomon@google.com path.lineTo(110 * SK_Scalar1, -10 * SK_Scalar1); 89953aab7813ca20360426524361941cf43567fc7aebsalomon@google.com path.lineTo(-10 * SK_Scalar1, 60 * SK_Scalar1); 90030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, SkPath::kCCW_Direction); 901a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 902a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 903a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conicTo(20, 0, 20, 20, 0.5f); 904a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 905a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_direction(reporter, path, SkPath::kCW_Direction); 906a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 907a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 908a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(1, 1e7f); 909a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(1e7f, 2e7f); 910a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 911a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kConvex_Convexity == path.getConvexity()); 912a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_direction(reporter, path, SkPath::kCCW_Direction); 9133e71a887628ff25c806675366b081c70bb10b74dreed@google.com} 9143e71a887628ff25c806675366b081c70bb10b74dreed@google.com 915ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.comstatic void add_rect(SkPath* path, const SkRect& r) { 916ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->moveTo(r.fLeft, r.fTop); 917ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fRight, r.fTop); 918ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fRight, r.fBottom); 919ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->lineTo(r.fLeft, r.fBottom); 920ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path->close(); 921ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com} 922ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 923ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.comstatic void test_bounds(skiatest::Reporter* reporter) { 924ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com static const SkRect rects[] = { 9253563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(160), SkIntToScalar(610), SkIntToScalar(160) }, 9263563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(610), SkIntToScalar(160), SkIntToScalar(610), SkIntToScalar(199) }, 9273563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(198), SkIntToScalar(610), SkIntToScalar(199) }, 9283563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com { SkIntToScalar(10), SkIntToScalar(160), SkIntToScalar(10), SkIntToScalar(199) }, 929ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com }; 930ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 931ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com SkPath path0, path1; 932ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(rects); ++i) { 933ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com path0.addRect(rects[i]); 934ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com add_rect(&path1, rects[i]); 935ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com } 936ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 937ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com REPORTER_ASSERT(reporter, path0.getBounds() == path1.getBounds()); 938ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com} 939ffdb018dae05f1688c6c036299f8c8a0f28342e5reed@google.com 94055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.comstatic void stroke_cubic(const SkPoint pts[4]) { 94155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPath path; 94255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com path.moveTo(pts[0]); 94355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com path.cubicTo(pts[1], pts[2], pts[3]); 944d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 94555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPaint paint; 94655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.setStyle(SkPaint::kStroke_Style); 94755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.setStrokeWidth(SK_Scalar1 * 2); 948d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 94955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPath fill; 95055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com paint.getFillPath(path, &fill); 95155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com} 95255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 95355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// just ensure this can run w/o any SkASSERTS firing in the debug build 95455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// we used to assert due to differences in how we determine a degenerate vector 95555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com// but that was fixed with the introduction of SkPoint::CanNormalize 95655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.comstatic void stroke_tiny_cubic() { 95755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPoint p0[] = { 95855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 95955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 96055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 96155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 96255b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com }; 963d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 96455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_cubic(p0); 965d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 96655b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com SkPoint p1[] = { 96755b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0f, 92.0f }, 96855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 372.0007f, 92.000755f }, 96955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 371.99927f, 92.003922f }, 97055b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com { 371.99826f, 92.003899f }, 97155b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com }; 972d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 97355b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_cubic(p1); 97455b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com} 97555b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 976b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.comstatic void check_close(skiatest::Reporter* reporter, const SkPath& path) { 977b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com for (int i = 0; i < 2; ++i) { 97809042b80d22837c760bb530124aaa67469b19b8frobertphillips@google.com SkPath::Iter iter(path, SkToBool(i)); 979b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPoint mv; 980b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPoint pts[4]; 981b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath::Verb v; 982b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com int nMT = 0; 983b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com int nCL = 0; 984221db3c3364eb110bc03db78cb09aae51d117b27tomhudson@google.com mv.set(0, 0); 985b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com while (SkPath::kDone_Verb != (v = iter.next(pts))) { 986b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com switch (v) { 987b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com case SkPath::kMove_Verb: 988b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com mv = pts[0]; 989b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com ++nMT; 990b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 991b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com case SkPath::kClose_Verb: 992b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com REPORTER_ASSERT(reporter, mv == pts[0]); 993b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com ++nCL; 994b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 995b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com default: 996b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com break; 997b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 998b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 999b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com // if we force a close on the interator we should have a close 1000b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com // for every moveTo 1001b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com REPORTER_ASSERT(reporter, !i || nMT == nCL); 1002b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com } 1003b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com} 1004b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1005b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.comstatic void test_close(skiatest::Reporter* reporter) { 1006b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath closePt; 1007b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com closePt.moveTo(0, 0); 1008b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com closePt.close(); 1009b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, closePt); 1010b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1011b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath openPt; 1012b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com openPt.moveTo(0, 0); 1013b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, openPt); 1014b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1015b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath empty; 1016b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, empty); 1017b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com empty.close(); 1018b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, empty); 1019b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1020b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath rect; 1021b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1022b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect); 1023b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect.close(); 1024b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect); 1025b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1026b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath quad; 1027b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com quad.quadTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1028b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, quad); 1029b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com quad.close(); 1030b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, quad); 1031b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1032b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath cubic; 1033d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com quad.cubicTo(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 1034b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 10*SK_Scalar1, 20 * SK_Scalar1, 20*SK_Scalar1); 1035b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, cubic); 1036b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com cubic.close(); 1037b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, cubic); 1038b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1039b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath line; 1040b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.moveTo(SK_Scalar1, SK_Scalar1); 1041b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.lineTo(10 * SK_Scalar1, 10*SK_Scalar1); 1042b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, line); 1043b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com line.close(); 1044b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, line); 1045b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1046b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath rect2; 1047b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1048b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.close(); 1049b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.addRect(SK_Scalar1, SK_Scalar1, 10 * SK_Scalar1, 10*SK_Scalar1); 1050b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect2); 1051b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com rect2.close(); 1052b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, rect2); 1053b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1054b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath oval3; 1055b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.addOval(SkRect::MakeWH(SK_Scalar1*100,SK_Scalar1*100)); 1056b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.close(); 1057b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.addOval(SkRect::MakeWH(SK_Scalar1*200,SK_Scalar1*200)); 1058b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, oval3); 1059b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com oval3.close(); 1060b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, oval3); 1061b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 1062b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com SkPath moves; 1063b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(SK_Scalar1, SK_Scalar1); 1064b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(5 * SK_Scalar1, SK_Scalar1); 1065b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(SK_Scalar1, 10 * SK_Scalar1); 1066b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com moves.moveTo(10 *SK_Scalar1, SK_Scalar1); 1067b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com check_close(reporter, moves); 106855b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com 106955b5f4bd6a69e70feeaf6018171882ab9cd250aereed@google.com stroke_tiny_cubic(); 1070b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com} 1071b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com 10727c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.comstatic void check_convexity(skiatest::Reporter* reporter, const SkPath& path, 10737c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath::Convexity expected) { 107430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath copy(path); // we make a copy so that we don't cache the result on the passed in path. 107530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Convexity c = copy.getConvexity(); 10767c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com REPORTER_ASSERT(reporter, c == expected); 10777c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com} 10787c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com 1079b421650e13faa2b77d29b018e78ab07ff693ca32caryclarkstatic void test_path_crbug389050(skiatest::Reporter* reporter) { 1080b421650e13faa2b77d29b018e78ab07ff693ca32caryclark SkPath tinyConvexPolygon; 1081b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.moveTo(600.131559f, 800.112512f); 1082b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.lineTo(600.161735f, 800.118627f); 1083b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.lineTo(600.148962f, 800.142338f); 1084b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.lineTo(600.134891f, 800.137724f); 1085b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.close(); 1086b421650e13faa2b77d29b018e78ab07ff693ca32caryclark tinyConvexPolygon.getConvexity(); 1087b421650e13faa2b77d29b018e78ab07ff693ca32caryclark check_convexity(reporter, tinyConvexPolygon, SkPath::kConvex_Convexity); 1088b421650e13faa2b77d29b018e78ab07ff693ca32caryclark check_direction(reporter, tinyConvexPolygon, SkPath::kCW_Direction); 1089b421650e13faa2b77d29b018e78ab07ff693ca32caryclark 1090b421650e13faa2b77d29b018e78ab07ff693ca32caryclark SkPath platTriangle; 1091b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.moveTo(0, 0); 1092b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(200, 0); 1093b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(100, 0.04f); 1094b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.close(); 1095b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.getConvexity(); 1096b421650e13faa2b77d29b018e78ab07ff693ca32caryclark check_direction(reporter, platTriangle, SkPath::kCW_Direction); 1097b421650e13faa2b77d29b018e78ab07ff693ca32caryclark 1098b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.reset(); 1099b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.moveTo(0, 0); 1100b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(200, 0); 1101b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.lineTo(100, 0.03f); 1102b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.close(); 1103b421650e13faa2b77d29b018e78ab07ff693ca32caryclark platTriangle.getConvexity(); 1104b421650e13faa2b77d29b018e78ab07ff693ca32caryclark check_direction(reporter, platTriangle, SkPath::kCW_Direction); 1105b421650e13faa2b77d29b018e78ab07ff693ca32caryclark} 1106b421650e13faa2b77d29b018e78ab07ff693ca32caryclark 11077c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.comstatic void test_convexity2(skiatest::Reporter* reporter) { 11087c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath pt; 11097c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com pt.moveTo(0, 0); 11107c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com pt.close(); 1111b54455e440e66e0b1c30954d226226f49aac26d6reed@google.com check_convexity(reporter, pt, SkPath::kConvex_Convexity); 111230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, pt, SkPath::kUnknown_Direction); 1113d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11147c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath line; 11156c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org line.moveTo(12*SK_Scalar1, 20*SK_Scalar1); 11166c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org line.lineTo(-12*SK_Scalar1, -20*SK_Scalar1); 11177c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com line.close(); 111830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, line, SkPath::kConvex_Convexity); 111930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, line, SkPath::kUnknown_Direction); 1120d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11217c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath triLeft; 11227c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triLeft.moveTo(0, 0); 11236c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triLeft.lineTo(SK_Scalar1, 0); 11246c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triLeft.lineTo(SK_Scalar1, SK_Scalar1); 11257c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triLeft.close(); 11267c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, triLeft, SkPath::kConvex_Convexity); 112730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, triLeft, SkPath::kCW_Direction); 1128d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11297c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath triRight; 11307c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triRight.moveTo(0, 0); 11316c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triRight.lineTo(-SK_Scalar1, 0); 11326c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org triRight.lineTo(SK_Scalar1, SK_Scalar1); 11337c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com triRight.close(); 11347c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, triRight, SkPath::kConvex_Convexity); 113530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, triRight, SkPath::kCCW_Direction); 1136d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11377c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath square; 11387c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com square.moveTo(0, 0); 11396c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(SK_Scalar1, 0); 11406c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(SK_Scalar1, SK_Scalar1); 11416c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org square.lineTo(0, SK_Scalar1); 11427c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com square.close(); 11437c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, square, SkPath::kConvex_Convexity); 114430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, square, SkPath::kCW_Direction); 1145d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11467c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath redundantSquare; 11477c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.moveTo(0, 0); 11487c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.lineTo(0, 0); 11497c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.lineTo(0, 0); 11506c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 11516c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 11526c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, 0); 11536c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 11546c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 11556c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(SK_Scalar1, SK_Scalar1); 11566c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 11576c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 11586c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org redundantSquare.lineTo(0, SK_Scalar1); 11597c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com redundantSquare.close(); 11607c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, redundantSquare, SkPath::kConvex_Convexity); 116130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, redundantSquare, SkPath::kCW_Direction); 1162d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11637c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath bowTie; 11647c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.moveTo(0, 0); 11657c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.lineTo(0, 0); 11667c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.lineTo(0, 0); 11676c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 11686c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 11696c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, SK_Scalar1); 11706c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 11716c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 11726c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(SK_Scalar1, 0); 11736c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 11746c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 11756c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org bowTie.lineTo(0, SK_Scalar1); 11767c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com bowTie.close(); 11777c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, bowTie, SkPath::kConcave_Convexity); 117830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, bowTie, kDontCheckDir); 1179d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11807c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath spiral; 11817c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com spiral.moveTo(0, 0); 11826c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(100*SK_Scalar1, 0); 11836c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(100*SK_Scalar1, 100*SK_Scalar1); 11846c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(0, 100*SK_Scalar1); 11856c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(0, 50*SK_Scalar1); 11866c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(50*SK_Scalar1, 50*SK_Scalar1); 11876c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org spiral.lineTo(50*SK_Scalar1, 75*SK_Scalar1); 11887c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com spiral.close(); 118985b6e399d56d2421980daa432f30910beda41922reed@google.com check_convexity(reporter, spiral, SkPath::kConcave_Convexity); 119030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, spiral, kDontCheckDir); 1191d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 11927c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com SkPath dent; 11936c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.moveTo(0, 0); 11946c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(100*SK_Scalar1, 100*SK_Scalar1); 11956c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(0, 100*SK_Scalar1); 11966c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(-50*SK_Scalar1, 200*SK_Scalar1); 11976c31d9d9b4ea183ec7be29f97e108c8cfb33533bschenney@chromium.org dent.lineTo(-200*SK_Scalar1, 100*SK_Scalar1); 11987c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com dent.close(); 11997c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com check_convexity(reporter, dent, SkPath::kConcave_Convexity); 120030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, dent, SkPath::kCW_Direction); 12018be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org 12028be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org // http://skbug.com/2235 12038be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkPath strokedSin; 12048be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org for (int i = 0; i < 2000; i++) { 12058be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkScalar x = SkIntToScalar(i) / 2; 12068be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkScalar y = 500 - (x + SkScalarSin(x / 100) * 40) / 3; 12078be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org if (0 == i) { 12088be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org strokedSin.moveTo(x, y); 12098be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } else { 12108be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org strokedSin.lineTo(x, y); 12118be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } 12128be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org } 12138be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle); 12148be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org stroke.setStrokeStyle(2 * SK_Scalar1); 12158be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org stroke.applyToPath(&strokedSin, strokedSin); 12168be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org check_convexity(reporter, strokedSin, SkPath::kConcave_Convexity); 12178be07bb12d1f7a2d08fa154320fbe6940b370ea1commit-bot@chromium.org check_direction(reporter, strokedSin, kDontCheckDir); 1218c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips 1219c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips // http://crbug.com/412640 1220c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips SkPath degenerateConcave; 1221c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.moveTo(148.67912f, 191.875f); 1222c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(470.37695f, 7.5f); 1223c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(148.67912f, 191.875f); 1224c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(41.446522f, 376.25f); 1225c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(-55.971577f, 460.0f); 1226c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips degenerateConcave.lineTo(41.446522f, 376.25f); 1227c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips check_convexity(reporter, degenerateConcave, SkPath::kConcave_Convexity); 1228c506e3007e53fe7d1a77991de11fdb50a86fd532robertphillips check_direction(reporter, degenerateConcave, SkPath::kUnknown_Direction); 1229f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips 1230f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips // http://crbug.com/433683 1231f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips SkPath badFirstVector; 1232f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.moveTo(501.087708f, 319.610352f); 1233f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(501.087708f, 319.610352f); 1234f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(501.087677f, 319.610321f, 449.271606f, 258.078674f, 395.084564f, 198.711182f); 1235f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(358.967072f, 159.140717f, 321.910553f, 120.650436f, 298.442322f, 101.955399f); 1236f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(301.557678f, 98.044601f); 1237f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(325.283844f, 116.945084f, 362.615204f, 155.720825f, 398.777557f, 195.340454f); 1238f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.cubicTo(453.031860f, 254.781662f, 504.912262f, 316.389618f, 504.912292f, 316.389648f); 1239f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(504.912292f, 316.389648f); 1240f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.lineTo(501.087708f, 319.610352f); 1241f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips badFirstVector.close(); 1242f52a063dfd7883bbaa58617416a48c2be724e36brobertphillips check_convexity(reporter, badFirstVector, SkPath::kConcave_Convexity); 12437c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com} 12447c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com 12456b82d1adc6a4726e36674e468ff1157e0b75373freed@android.comstatic void check_convex_bounds(skiatest::Reporter* reporter, const SkPath& p, 12466b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com const SkRect& bounds) { 12476b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p.isConvex()); 12486b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p.getBounds() == bounds); 124962047cf1980861234e7367a225928b84ce492c68reed@google.com 12506b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com SkPath p2(p); 12516b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p2.isConvex()); 12526b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, p2.getBounds() == bounds); 12536b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 12546b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com SkPath other; 12556b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com other.swap(p2); 12566b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, other.isConvex()); 12576b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com REPORTER_ASSERT(reporter, other.getBounds() == bounds); 12586b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com} 12596b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 126004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.comstatic void setFromString(SkPath* path, const char str[]) { 126104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com bool first = true; 126204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com while (str) { 126304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkScalar x, y; 126404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com str = SkParse::FindScalar(str, &x); 126504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com if (NULL == str) { 126604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com break; 126704863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 126804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com str = SkParse::FindScalar(str, &y); 126904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkASSERT(str); 127004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com if (first) { 127104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path->moveTo(x, y); 127204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com first = false; 127304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } else { 127404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path->lineTo(x, y); 127504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 127604863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 127704863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com} 127804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 127904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.comstatic void test_convexity(skiatest::Reporter* reporter) { 128004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath path; 128104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 128230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1283e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addCircle(0, 0, SkIntToScalar(10)); 128430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 1285e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addCircle(0, 0, SkIntToScalar(10)); // 2nd circle 128630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConcave_Convexity); 128730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 128804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path.reset(); 1289e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addRect(0, 0, SkIntToScalar(10), SkIntToScalar(10), SkPath::kCCW_Direction); 129030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 12913e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(SkPath::kCCW_Direction)); 129230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 129304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com path.reset(); 1294e354397dd9ac2f0d011fcdcdbae242bb0cfd0fa9reed@google.com path.addRect(0, 0, SkIntToScalar(10), SkIntToScalar(10), SkPath::kCW_Direction); 129530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, SkPath::kConvex_Convexity); 12963e71a887628ff25c806675366b081c70bb10b74dreed@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(SkPath::kCW_Direction)); 1297d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 129804863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com static const struct { 129904863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com const char* fPathStr; 130004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath::Convexity fExpectedConvexity; 130130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction fExpectedDirection; 130204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } gRec[] = { 130330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "", SkPath::kConvex_Convexity, SkPath::kUnknown_Direction }, 130430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0", SkPath::kConvex_Convexity, SkPath::kUnknown_Direction }, 130530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10", SkPath::kConvex_Convexity, SkPath::kUnknown_Direction }, 130630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 20 20 0 0 10 10", SkPath::kConcave_Convexity, SkPath::kUnknown_Direction }, 130730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 10 20", SkPath::kConvex_Convexity, SkPath::kCW_Direction }, 130830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 10 0", SkPath::kConvex_Convexity, SkPath::kCCW_Direction }, 130930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 10 10 0 0 10", SkPath::kConcave_Convexity, kDontCheckDir }, 131030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com { "0 0 10 0 0 10 -10 -10", SkPath::kConcave_Convexity, SkPath::kCW_Direction }, 131104863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com }; 131204863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 131304863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 131404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com SkPath path; 131504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com setFromString(&path, gRec[i].fPathStr); 131630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_convexity(reporter, path, gRec[i].fExpectedConvexity); 131730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_direction(reporter, path, gRec[i].fExpectedDirection); 1318a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // check after setting the initial convex and direction 1319a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org if (kDontCheckDir != gRec[i].fExpectedDirection) { 1320a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath copy(path); 1321a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir; 1322a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool foundDir = copy.cheapComputeDirection(&dir); 1323a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, (gRec[i].fExpectedDirection == SkPath::kUnknown_Direction) 1324a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org ^ foundDir); 1325a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !foundDir || gRec[i].fExpectedDirection == dir); 1326a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_convexity(reporter, copy, gRec[i].fExpectedConvexity); 1327a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 1328a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, gRec[i].fExpectedConvexity == path.getConvexity()); 1329a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_direction(reporter, path, gRec[i].fExpectedDirection); 133004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com } 1331d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1332d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark static const SkPoint nonFinitePts[] = { 1333d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarInfinity, 0 }, 1334d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarInfinity }, 1335d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarInfinity, SK_ScalarInfinity }, 1336d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNegativeInfinity, 0}, 1337d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarNegativeInfinity }, 1338d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNegativeInfinity, SK_ScalarNegativeInfinity }, 1339d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNegativeInfinity, SK_ScalarInfinity }, 1340d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarInfinity, SK_ScalarNegativeInfinity }, 1341d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNaN, 0 }, 1342d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarNaN }, 1343d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarNaN, SK_ScalarNaN }, 1344d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark }; 1345d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1346d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark const size_t nonFinitePtsCount = sizeof(nonFinitePts) / sizeof(nonFinitePts[0]); 1347d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1348d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark static const SkPoint finitePts[] = { 1349d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMax, 0 }, 1350d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarMax }, 1351d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMax, SK_ScalarMax }, 1352d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMin, 0 }, 1353d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { 0, SK_ScalarMin }, 1354d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark { SK_ScalarMin, SK_ScalarMin }, 1355d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark }; 1356d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1357d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark const size_t finitePtsCount = sizeof(finitePts) / sizeof(finitePts[0]); 1358d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1359d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark for (int index = 0; index < (int) (13 * nonFinitePtsCount * finitePtsCount); ++index) { 1360d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int i = (int) (index % nonFinitePtsCount); 1361d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int f = (int) (index % finitePtsCount); 1362d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int g = (int) ((f + 1) % finitePtsCount); 1363d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path.reset(); 1364d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark switch (index % 13) { 1365d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 0: path.lineTo(nonFinitePts[i]); break; 1366d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 1: path.quadTo(nonFinitePts[i], nonFinitePts[i]); break; 1367d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 2: path.quadTo(nonFinitePts[i], finitePts[f]); break; 1368d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 3: path.quadTo(finitePts[f], nonFinitePts[i]); break; 1369d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 4: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[f]); break; 1370d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 5: path.cubicTo(finitePts[f], nonFinitePts[i], finitePts[f]); break; 1371d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 6: path.cubicTo(finitePts[f], finitePts[f], nonFinitePts[i]); break; 1372d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 7: path.cubicTo(nonFinitePts[i], nonFinitePts[i], finitePts[f]); break; 1373d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 8: path.cubicTo(nonFinitePts[i], finitePts[f], nonFinitePts[i]); break; 1374d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 9: path.cubicTo(finitePts[f], nonFinitePts[i], nonFinitePts[i]); break; 1375d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 10: path.cubicTo(nonFinitePts[i], nonFinitePts[i], nonFinitePts[i]); break; 1376d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 11: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[g]); break; 1377d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 12: path.moveTo(nonFinitePts[i]); break; 1378d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1379d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark check_convexity(reporter, path, SkPath::kUnknown_Convexity); 1380d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1381d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 1382d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark for (int index = 0; index < (int) (11 * finitePtsCount); ++index) { 1383d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int f = (int) (index % finitePtsCount); 1384d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int g = (int) ((f + 1) % finitePtsCount); 1385d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path.reset(); 1386d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark int curveSelect = index % 11; 1387d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark switch (curveSelect) { 1388d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 0: path.moveTo(finitePts[f]); break; 1389d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 1: path.lineTo(finitePts[f]); break; 1390d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 2: path.quadTo(finitePts[f], finitePts[f]); break; 1391d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 3: path.quadTo(finitePts[f], finitePts[g]); break; 1392d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 4: path.quadTo(finitePts[g], finitePts[f]); break; 1393d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 5: path.cubicTo(finitePts[f], finitePts[f], finitePts[f]); break; 1394d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 6: path.cubicTo(finitePts[f], finitePts[f], finitePts[g]); break; 1395d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 7: path.cubicTo(finitePts[f], finitePts[g], finitePts[f]); break; 1396d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 8: path.cubicTo(finitePts[f], finitePts[g], finitePts[g]); break; 1397d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 9: path.cubicTo(finitePts[g], finitePts[f], finitePts[f]); break; 1398d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark case 10: path.cubicTo(finitePts[g], finitePts[f], finitePts[g]); break; 1399d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1400d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark check_convexity(reporter, path, curveSelect == 0 ? SkPath::kConvex_Convexity 1401d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark : SkPath::kUnknown_Convexity); 1402d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark } 1403d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 140404863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com} 140504863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com 14067e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.comstatic void test_isLine(skiatest::Reporter* reporter) { 14077e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com SkPath path; 14087e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com SkPoint pts[2]; 14097e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar value = SkIntToScalar(5); 14107e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14117e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(NULL)); 1412d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 14137e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // set some non-zero values 14147e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com pts[0].set(value, value); 14157e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com pts[1].set(value, value); 14167e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 14177e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // check that pts was untouched 14187e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(value, value)); 14197e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(value, value)); 14207e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14217e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar moveX = SkIntToScalar(1); 14227e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar moveY = SkIntToScalar(2); 1423a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, value != moveX && value != moveY); 14247e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14257e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.moveTo(moveX, moveY); 14267e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(NULL)); 14277e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 14287e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com // check that pts was untouched 14297e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(value, value)); 14307e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(value, value)); 14317e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14327e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar lineX = SkIntToScalar(2); 14337e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com const SkScalar lineY = SkIntToScalar(2); 1434a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, value != lineX && value != lineY); 14357e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14367e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.lineTo(lineX, lineY); 14377e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, path.isLine(NULL)); 14387e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14397e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !pts[0].equals(moveX, moveY)); 14407e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !pts[1].equals(lineX, lineY)); 14417e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, path.isLine(pts)); 14427e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(moveX, moveY)); 14437e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(lineX, lineY)); 14447e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14457e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com path.lineTo(0, 0); // too many points/verbs 14467e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(NULL)); 14477e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, !path.isLine(pts)); 14487e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[0].equals(moveX, moveY)); 14497e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com REPORTER_ASSERT(reporter, pts[1].equals(lineX, lineY)); 1450a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1451a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1452a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.quadTo(1, 1, 2, 2); 1453a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.isLine(NULL)); 14547e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com} 14557e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com 14569bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comstatic void test_conservativelyContains(skiatest::Reporter* reporter) { 14579bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath path; 14589bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // kBaseRect is used to construct most our test paths: a rect, a circle, and a round-rect. 14609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBaseRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 14619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // A circle that bounds kBaseRect (with a significant amount of slop) 14639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkScalar circleR = SkMaxScalar(kBaseRect.width(), kBaseRect.height()); 1464a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org circleR = SkScalarMul(circleR, 1.75f) / 2; 14659bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkPoint kCircleC = {kBaseRect.centerX(), kBaseRect.centerY()}; 14669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // round-rect radii 14689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkScalar kRRRadii[] = {SkIntToScalar(5), SkIntToScalar(3)}; 1469cec8de68217186d0f5676a696de44343aaa61de7skia.committer@gmail.com 147056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com static const struct SUPPRESS_VISIBILITY_WARNING { 14719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect fQueryRect; 14729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInRect; 14739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInCircle; 14749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fInRR; 1475a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool fInCubicRR; 14769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } kQueries[] = { 1477a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {kBaseRect, true, true, false, false}, 14789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // rect well inside of kBaseRect 14804b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org {SkRect::MakeLTRB(kBaseRect.fLeft + 0.25f*kBaseRect.width(), 14814b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fTop + 0.25f*kBaseRect.height(), 14824b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fRight - 0.25f*kBaseRect.width(), 14834b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org kBaseRect.fBottom - 0.25f*kBaseRect.height()), 1484a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 14859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 14869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // rects with edges off by one from kBaseRect's edges 14879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 14889bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height() + 1), 1489a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 14909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 14919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, kBaseRect.height()), 1492a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 14939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 14949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, kBaseRect.height() + 1), 1495a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 14969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 1, kBaseRect.fTop, 14979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height()), 1498a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 14999bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop - 1, 15009bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width(), kBaseRect.height()), 1501a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 15029bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 1, kBaseRect.fTop, 15039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 2, kBaseRect.height()), 1504a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 15059bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop - 1, 15069bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 2, kBaseRect.height()), 1507a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 15089bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15099bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // zero-w/h rects at each corner of kBaseRect 1510a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fTop, 0, 0), true, true, false, false}, 1511a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fRight, kBaseRect.fTop, 0, 0), true, true, false, true}, 1512a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.fBottom, 0, 0), true, true, false, true}, 1513a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org {SkRect::MakeXYWH(kBaseRect.fRight, kBaseRect.fBottom, 0, 0), true, true, false, true}, 15149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // far away rect 15169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(10 * kBaseRect.fRight, 10 * kBaseRect.fBottom, 15179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), SkIntToScalar(10)), 1518a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, false, false, false}, 15199bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // very large rect containing kBaseRect 15219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft - 5 * kBaseRect.width(), 15229bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.fTop - 5 * kBaseRect.height(), 15239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 11 * kBaseRect.width(), 11 * kBaseRect.height()), 1524a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, false, false, false}, 15259bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15269bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // skinny rect that spans same y-range as kBaseRect 15279bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.centerX(), kBaseRect.fTop, 15289bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(1), kBaseRect.height()), 1529a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 15309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // short rect that spans same x-range as kBaseRect 15329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.centerY(), kBaseRect.width(), SkScalar(1)), 1533a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org true, true, true, true}, 15349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // skinny rect that spans slightly larger y-range than kBaseRect 15369bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.centerX(), kBaseRect.fTop, 15379bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(1), kBaseRect.height() + 1), 1538a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 15399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // short rect that spans slightly larger x-range than kBaseRect 15419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com {SkRect::MakeXYWH(kBaseRect.fLeft, kBaseRect.centerY(), 15429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kBaseRect.width() + 1, SkScalar(1)), 1543a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org false, true, false, false}, 15449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 15459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int inv = 0; inv < 4; ++inv) { 154756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (size_t q = 0; q < SK_ARRAY_COUNT(kQueries); ++q) { 15489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect qRect = kQueries[q].fQueryRect; 15499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com if (inv & 0x1) { 15509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTSwap(qRect.fLeft, qRect.fRight); 15519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 15529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com if (inv & 0x2) { 15539bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTSwap(qRect.fTop, qRect.fBottom); 15549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 15559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int d = 0; d < 2; ++d) { 15569bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath::Direction dir = d ? SkPath::kCCW_Direction : SkPath::kCW_Direction; 15579bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 15589bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addRect(kBaseRect, dir); 15599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInRect == 15609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 15619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 15639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addCircle(kCircleC.fX, kCircleC.fY, circleR, dir); 15649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInCircle == 15659bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 15669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 15689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1], dir); 15699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, kQueries[q].fInRR == 15709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.conservativelyContainsRect(qRect)); 1571a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 1572a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1573a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.moveTo(kBaseRect.fLeft + kRRRadii[0], kBaseRect.fTop); 1574a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.cubicTo(kBaseRect.fLeft + kRRRadii[0] / 2, kBaseRect.fTop, 1575a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org kBaseRect.fLeft, kBaseRect.fTop + kRRRadii[1] / 2, 1576a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org kBaseRect.fLeft, kBaseRect.fTop + kRRRadii[1]); 1577a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fLeft, kBaseRect.fBottom); 1578a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fRight, kBaseRect.fBottom); 1579a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(kBaseRect.fRight, kBaseRect.fTop); 1580a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.close(); 1581a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, kQueries[q].fInCubicRR == 1582a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.conservativelyContainsRect(qRect)); 1583a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 15849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 15859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // Slightly non-convex shape, shouldn't contain any rects. 15869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 15879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.moveTo(0, 0); 15884b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org path.lineTo(SkIntToScalar(50), 0.05f); 15899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), 0); 15909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), SkIntToScalar(100)); 15919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(0, SkIntToScalar(100)); 15929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.close(); 15939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(qRect)); 15949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 15959bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 15969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 15979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // make sure a minimal convex shape works, a right tri with edges along pos x and y axes. 15989bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.reset(); 15999bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.moveTo(0, 0); 16009bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(SkIntToScalar(100), 0); 16019bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com path.lineTo(0, SkIntToScalar(100)); 16029bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // inside, on along top edge 16049bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 16059bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), 16069bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10)))); 16079bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // above 16089bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect( 16099bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkRect::MakeXYWH(SkIntToScalar(50), 16109bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(-10), 16119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10), 16129bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(10)))); 16139bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // to the left 16149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(-10), 16159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5), 16169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5), 16179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5)))); 16189bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 16199bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com // outside the diagonal edge 16209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(10), 16219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(200), 16229bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(20), 16239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkIntToScalar(5)))); 162462df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 1625b17c1291085e50819c0c46aae783067c30a67516bsalomon 1626b17c1291085e50819c0c46aae783067c30a67516bsalomon // Test that multiple move commands do not cause asserts. 1627b17c1291085e50819c0c46aae783067c30a67516bsalomon 1628b17c1291085e50819c0c46aae783067c30a67516bsalomon // At the time of writing, this would not modify cached convexity. This caused an assert while 1629b17c1291085e50819c0c46aae783067c30a67516bsalomon // checking conservative containment again. http://skbug.com/1460 1630b17c1291085e50819c0c46aae783067c30a67516bsalomon path.moveTo(SkIntToScalar(100), SkIntToScalar(100)); 1631b17c1291085e50819c0c46aae783067c30a67516bsalomon#if 0 1632b17c1291085e50819c0c46aae783067c30a67516bsalomon REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 1633b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10), 1634b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10)))); 1635b17c1291085e50819c0c46aae783067c30a67516bsalomon#endif 1636b17c1291085e50819c0c46aae783067c30a67516bsalomon 1637b17c1291085e50819c0c46aae783067c30a67516bsalomon // Same as above path and first test but with an extra moveTo. 163862df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.reset(); 163962df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.moveTo(100, 100); 164062df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.moveTo(0, 0); 164162df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.lineTo(SkIntToScalar(100), 0); 164262df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org path.lineTo(0, SkIntToScalar(100)); 164362df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 164462df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org REPORTER_ASSERT(reporter, path.conservativelyContainsRect(SkRect::MakeXYWH(SkIntToScalar(50), 0, 164562df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org SkIntToScalar(10), 164662df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org SkIntToScalar(10)))); 164762df526042f8a753c6817ba9d809ff8dfc412d4acommit-bot@chromium.org 1648b17c1291085e50819c0c46aae783067c30a67516bsalomon // Test that multiple move commands do not cause asserts and that the function 1649b17c1291085e50819c0c46aae783067c30a67516bsalomon // is not confused by the multiple moves. 1650b17c1291085e50819c0c46aae783067c30a67516bsalomon path.reset(); 1651b17c1291085e50819c0c46aae783067c30a67516bsalomon path.moveTo(0, 0); 1652b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(SkIntToScalar(100), 0); 1653b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(0, SkIntToScalar(100)); 1654b17c1291085e50819c0c46aae783067c30a67516bsalomon path.moveTo(0, SkIntToScalar(200)); 1655b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(SkIntToScalar(100), SkIntToScalar(200)); 1656b17c1291085e50819c0c46aae783067c30a67516bsalomon path.lineTo(0, SkIntToScalar(300)); 1657b17c1291085e50819c0c46aae783067c30a67516bsalomon 1658b17c1291085e50819c0c46aae783067c30a67516bsalomon REPORTER_ASSERT(reporter, !path.conservativelyContainsRect( 1659b17c1291085e50819c0c46aae783067c30a67516bsalomon SkRect::MakeXYWH(SkIntToScalar(50), 0, 1660b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10), 1661b17c1291085e50819c0c46aae783067c30a67516bsalomon SkIntToScalar(10)))); 1662b17c1291085e50819c0c46aae783067c30a67516bsalomon 1663a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 1664a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.lineTo(100, 100); 1665a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !path.conservativelyContainsRect(SkRect::MakeXYWH(0, 0, 1, 1))); 16669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com} 16679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 1668f32322b9cefd950013ead6f914678580eff20b5breed@google.comstatic void test_isRect_open_close(skiatest::Reporter* reporter) { 1669f32322b9cefd950013ead6f914678580eff20b5breed@google.com SkPath path; 1670f32322b9cefd950013ead6f914678580eff20b5breed@google.com bool isClosed; 1671f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1672f32322b9cefd950013ead6f914678580eff20b5breed@google.com path.moveTo(0, 0); path.lineTo(1, 0); path.lineTo(1, 1); path.lineTo(0, 1); 1673f32322b9cefd950013ead6f914678580eff20b5breed@google.com path.close(); 167405ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 167591b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, path.isRect(NULL, &isClosed, NULL)); 1676f32322b9cefd950013ead6f914678580eff20b5breed@google.com REPORTER_ASSERT(reporter, isClosed); 1677f32322b9cefd950013ead6f914678580eff20b5breed@google.com} 1678f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1679f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com// Simple isRect test is inline TestPath, below. 1680f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com// test_isRect provides more extensive testing. 1681f131694617ce0410eafcb01124459382576bb1d9caryclark@google.comstatic void test_isRect(skiatest::Reporter* reporter) { 1682f32322b9cefd950013ead6f914678580eff20b5breed@google.com test_isRect_open_close(reporter); 1683f32322b9cefd950013ead6f914678580eff20b5breed@google.com 1684f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // passing tests (all moveTo / lineTo... 1685f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; 1686f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r2[] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}}; 1687f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r3[] = {{1, 1}, {0, 1}, {0, 0}, {1, 0}}; 1688f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r4[] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}}; 1689f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r5[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; 1690f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r6[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1691f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r7[] = {{1, 1}, {1, 0}, {0, 0}, {0, 1}}; 1692f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r8[] = {{1, 0}, {0, 0}, {0, 1}, {1, 1}}; 1693f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint r9[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1694b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint ra[] = {{0, 0}, {0, .5f}, {0, 1}, {.5f, 1}, {1, 1}, {1, .5f}, {1, 0}, {.5f, 0}}; 1695b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint rb[] = {{0, 0}, {.5f, 0}, {1, 0}, {1, .5f}, {1, 1}, {.5f, 1}, {0, 1}, {0, .5f}}; 1696f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint rc[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}; 1697f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint rd[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1698f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint re[] = {{0, 0}, {1, 0}, {1, 0}, {1, 1}, {0, 1}}; 1699bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint rf[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 0}}; 1700d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1701f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // failing tests 1702f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f1[] = {{0, 0}, {1, 0}, {1, 1}}; // too few points 1703f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f2[] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; // diagonal 1704f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f3[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}; // wraps 1705f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f4[] = {{0, 0}, {1, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 1}}; // backs up 1706f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f5[] = {{0, 0}, {1, 0}, {1, 1}, {2, 0}}; // end overshoots 1707f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f6[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 2}}; // end overshoots 1708f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f7[] = {{0, 0}, {1, 0}, {1, 1}, {0, 2}}; // end overshoots 1709f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPoint f8[] = {{0, 0}, {1, 0}, {1, 1}, {1, 0}}; // 'L' 1710bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint f9[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 0}, {2, 0}}; // overlaps 1711bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint fa[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, -1}, {1, -1}}; // non colinear gap 1712bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPoint fb[] = {{1, 0}, {8, 0}, {8, 8}, {0, 8}, {0, 1}}; // falls short 1713d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 171405ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // no close, but we should detect them as fillably the same as a rect 171505ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; 171605ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}}; 171705ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint c3[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}, {0, 0}}; // hit the start 171805ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 171905ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // like c2, but we double-back on ourselves 172005ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d1[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}, {0, 2}}; 172105ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org // like c2, but we overshoot the start point 172205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, -1}}; 172305ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org SkPoint d3[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, -1}, {0, 0}}; 1724f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 1725b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com struct IsRectTest { 1726b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint *fPoints; 17279880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int fPointCount; 1728b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fClose; 1729b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fIsRect; 1730b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com } tests[] = { 1731b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r1, SK_ARRAY_COUNT(r1), true, true }, 1732b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r2, SK_ARRAY_COUNT(r2), true, true }, 1733b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r3, SK_ARRAY_COUNT(r3), true, true }, 1734b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r4, SK_ARRAY_COUNT(r4), true, true }, 1735b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r5, SK_ARRAY_COUNT(r5), true, true }, 1736b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r6, SK_ARRAY_COUNT(r6), true, true }, 1737b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r7, SK_ARRAY_COUNT(r7), true, true }, 1738b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r8, SK_ARRAY_COUNT(r8), true, true }, 1739b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r9, SK_ARRAY_COUNT(r9), true, true }, 1740b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { ra, SK_ARRAY_COUNT(ra), true, true }, 1741b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rb, SK_ARRAY_COUNT(rb), true, true }, 1742b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rc, SK_ARRAY_COUNT(rc), true, true }, 1743b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rd, SK_ARRAY_COUNT(rd), true, true }, 1744b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { re, SK_ARRAY_COUNT(re), true, true }, 1745b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rf, SK_ARRAY_COUNT(rf), true, true }, 1746b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1747b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f1, SK_ARRAY_COUNT(f1), true, false }, 1748b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f2, SK_ARRAY_COUNT(f2), true, false }, 1749b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f3, SK_ARRAY_COUNT(f3), true, false }, 1750b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f4, SK_ARRAY_COUNT(f4), true, false }, 1751b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f5, SK_ARRAY_COUNT(f5), true, false }, 1752b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f6, SK_ARRAY_COUNT(f6), true, false }, 1753b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f7, SK_ARRAY_COUNT(f7), true, false }, 1754b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f8, SK_ARRAY_COUNT(f8), true, false }, 1755b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f9, SK_ARRAY_COUNT(f9), true, false }, 1756b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { fa, SK_ARRAY_COUNT(fa), true, false }, 1757b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { fb, SK_ARRAY_COUNT(fb), true, false }, 1758b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 175905ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c1, SK_ARRAY_COUNT(c1), false, true }, 176005ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c2, SK_ARRAY_COUNT(c2), false, true }, 176105ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { c3, SK_ARRAY_COUNT(c3), false, true }, 176205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org 176305ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d1, SK_ARRAY_COUNT(d1), false, false }, 176405ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d2, SK_ARRAY_COUNT(d2), false, false }, 176505ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.org { d3, SK_ARRAY_COUNT(d3), false, false }, 1766f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com }; 1767b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1768b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com const size_t testCount = SK_ARRAY_COUNT(tests); 17699880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int index; 1770f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com for (size_t testIndex = 0; testIndex < testCount; ++testIndex) { 1771f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPath path; 1772b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.moveTo(tests[testIndex].fPoints[0].fX, tests[testIndex].fPoints[0].fY); 1773b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < tests[testIndex].fPointCount; ++index) { 1774b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.lineTo(tests[testIndex].fPoints[index].fX, tests[testIndex].fPoints[index].fY); 1775f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1776b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fClose) { 1777f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path.close(); 1778f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1779b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, tests[testIndex].fIsRect == path.isRect(NULL)); 1780f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com 1781b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fIsRect) { 178256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect computed, expected; 1783f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com bool isClosed; 1784f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com SkPath::Direction direction, cheapDirection; 178591b0a3587342c48a1a6e1c4687686688737359darobertphillips expected.set(tests[testIndex].fPoints, tests[testIndex].fPointCount); 1786f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, path.cheapComputeDirection(&cheapDirection)); 178791b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, path.isRect(&computed, &isClosed, &direction)); 178891b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, expected == computed); 1789b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, isClosed == tests[testIndex].fClose); 1790f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, direction == cheapDirection); 1791f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com } else { 1792f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com SkRect computed; 1793f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com computed.set(123, 456, 789, 1011); 179491b0a3587342c48a1a6e1c4687686688737359darobertphillips bool isClosed = (bool)-1; 179591b0a3587342c48a1a6e1c4687686688737359darobertphillips SkPath::Direction direction = (SkPath::Direction) - 1; 179691b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, !path.isRect(&computed, &isClosed, &direction)); 1797f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, computed.fLeft == 123 && computed.fTop == 456); 1798f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, computed.fRight == 789 && computed.fBottom == 1011); 1799f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, isClosed == (bool) -1); 1800f68154a3cf43eb22d45be11f3b09e25440c366a6caryclark@google.com REPORTER_ASSERT(reporter, direction == (SkPath::Direction) -1); 180156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1802f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1803d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1804f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, close then line 1805f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com SkPath path1; 1806f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 18079880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1808f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1809f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1810f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1811f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(1, 0); 1812b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1813d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1814f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, move in the middle 1815f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1816f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 18179880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1818f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1819f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(1, .5f); 1820f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1821f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1822f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1823f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1824b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1825f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 1826f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, move on the edge 1827f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 18289880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1829f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[index - 1].fX, r1[index - 1].fY); 1830f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1831f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1832f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1833b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1834d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1835f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, quad 1836f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1837f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 18389880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1839f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1840f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.quadTo(1, .5f, 1, .5f); 1841f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1842f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1843f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1844f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1845b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1846d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 1847f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com // fail, cubic 1848f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.reset(); 1849f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 18509880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 1851f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com if (index == 2) { 1852f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.cubicTo(1, .5f, 1, .5f, 1, .5f); 1853f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1854f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 1855f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com } 1856f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com path1.close(); 1857b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com REPORTER_ASSERT(reporter, !path1.isRect(NULL)); 1858f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com} 1859f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com 186095bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclarkstatic void test_isNestedFillRects(skiatest::Reporter* reporter) { 186156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // passing tests (all moveTo / lineTo... 186283d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint r1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // CW 186356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r2[] = {{1, 0}, {1, 1}, {0, 1}, {0, 0}}; 186456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r3[] = {{1, 1}, {0, 1}, {0, 0}, {1, 0}}; 186556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r4[] = {{0, 1}, {0, 0}, {1, 0}, {1, 1}}; 186683d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint r5[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; // CCW 186756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r6[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 186856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r7[] = {{1, 1}, {1, 0}, {0, 0}, {0, 1}}; 186956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r8[] = {{1, 0}, {0, 0}, {0, 1}, {1, 1}}; 187056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint r9[] = {{0, 1}, {1, 1}, {1, 0}, {0, 0}}; 1871b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint ra[] = {{0, 0}, {0, .5f}, {0, 1}, {.5f, 1}, {1, 1}, {1, .5f}, {1, 0}, {.5f, 0}}; // CCW 1872b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint rb[] = {{0, 0}, {.5f, 0}, {1, 0}, {1, .5f}, {1, 1}, {.5f, 1}, {0, 1}, {0, .5f}}; // CW 187383d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint rc[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}}; // CW 187483d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint rd[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}, {0, 0}}; // CCW 187583d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPoint re[] = {{0, 0}, {1, 0}, {1, 0}, {1, 1}, {0, 1}}; // CW 187656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 187756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // failing tests 187856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f1[] = {{0, 0}, {1, 0}, {1, 1}}; // too few points 187956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f2[] = {{0, 0}, {1, 1}, {0, 1}, {1, 0}}; // diagonal 188056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f3[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}; // wraps 188156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f4[] = {{0, 0}, {1, 0}, {0, 0}, {1, 0}, {1, 1}, {0, 1}}; // backs up 188256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f5[] = {{0, 0}, {1, 0}, {1, 1}, {2, 0}}; // end overshoots 188356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f6[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}, {0, 2}}; // end overshoots 188456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f7[] = {{0, 0}, {1, 0}, {1, 1}, {0, 2}}; // end overshoots 188556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint f8[] = {{0, 0}, {1, 0}, {1, 1}, {1, 0}}; // 'L' 188656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 188795bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark // success, no close is OK 188856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint c1[] = {{0, 0}, {1, 0}, {1, 1}, {0, 1}}; // close doesn't match 188956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPoint c2[] = {{0, 0}, {1, 0}, {1, 2}, {0, 2}, {0, 1}}; // ditto 189056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 1891b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com struct IsNestedRectTest { 1892b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPoint *fPoints; 18939880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int fPointCount; 1894b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com SkPath::Direction fDirection; 1895b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fClose; 1896b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com bool fIsNestedRect; // nests with path.addRect(-1, -1, 2, 2); 1897b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com } tests[] = { 1898b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r1, SK_ARRAY_COUNT(r1), SkPath::kCW_Direction , true, true }, 1899b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r2, SK_ARRAY_COUNT(r2), SkPath::kCW_Direction , true, true }, 1900b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r3, SK_ARRAY_COUNT(r3), SkPath::kCW_Direction , true, true }, 1901b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r4, SK_ARRAY_COUNT(r4), SkPath::kCW_Direction , true, true }, 1902b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r5, SK_ARRAY_COUNT(r5), SkPath::kCCW_Direction, true, true }, 1903b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r6, SK_ARRAY_COUNT(r6), SkPath::kCCW_Direction, true, true }, 1904b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r7, SK_ARRAY_COUNT(r7), SkPath::kCCW_Direction, true, true }, 1905b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r8, SK_ARRAY_COUNT(r8), SkPath::kCCW_Direction, true, true }, 1906b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { r9, SK_ARRAY_COUNT(r9), SkPath::kCCW_Direction, true, true }, 1907b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { ra, SK_ARRAY_COUNT(ra), SkPath::kCCW_Direction, true, true }, 1908b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rb, SK_ARRAY_COUNT(rb), SkPath::kCW_Direction, true, true }, 1909b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rc, SK_ARRAY_COUNT(rc), SkPath::kCW_Direction, true, true }, 1910b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { rd, SK_ARRAY_COUNT(rd), SkPath::kCCW_Direction, true, true }, 1911b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { re, SK_ARRAY_COUNT(re), SkPath::kCW_Direction, true, true }, 1912b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 1913b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f1, SK_ARRAY_COUNT(f1), SkPath::kUnknown_Direction, true, false }, 1914b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f2, SK_ARRAY_COUNT(f2), SkPath::kUnknown_Direction, true, false }, 1915b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f3, SK_ARRAY_COUNT(f3), SkPath::kUnknown_Direction, true, false }, 1916b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f4, SK_ARRAY_COUNT(f4), SkPath::kUnknown_Direction, true, false }, 1917b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f5, SK_ARRAY_COUNT(f5), SkPath::kUnknown_Direction, true, false }, 1918b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f6, SK_ARRAY_COUNT(f6), SkPath::kUnknown_Direction, true, false }, 1919b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f7, SK_ARRAY_COUNT(f7), SkPath::kUnknown_Direction, true, false }, 1920b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com { f8, SK_ARRAY_COUNT(f8), SkPath::kUnknown_Direction, true, false }, 1921b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com 192295bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark { c1, SK_ARRAY_COUNT(c1), SkPath::kCW_Direction, false, true }, 192395bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark { c2, SK_ARRAY_COUNT(c2), SkPath::kCW_Direction, false, true }, 192456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com }; 192583d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com 1926b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com const size_t testCount = SK_ARRAY_COUNT(tests); 19279880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon int index; 192856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (int rectFirst = 0; rectFirst <= 1; ++rectFirst) { 192956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com for (size_t testIndex = 0; testIndex < testCount; ++testIndex) { 193056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPath path; 193156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 193256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 193356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1934b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.moveTo(tests[testIndex].fPoints[0].fX, tests[testIndex].fPoints[0].fY); 1935b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com for (index = 1; index < tests[testIndex].fPointCount; ++index) { 1936b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com path.lineTo(tests[testIndex].fPoints[index].fX, tests[testIndex].fPoints[index].fY); 193756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 1938b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fClose) { 193956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.close(); 194056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 194156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 194256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 194356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 194495bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, 194595bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark tests[testIndex].fIsNestedRect == path.isNestedFillRects(NULL)); 1946b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com if (tests[testIndex].fIsNestedRect) { 194756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect expected[2], computed[2]; 194883d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com SkPath::Direction expectedDirs[2], computedDirs[2]; 194956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkRect testBounds; 1950b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com testBounds.set(tests[testIndex].fPoints, tests[testIndex].fPointCount); 195156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com expected[0] = SkRect::MakeLTRB(-1, -1, 2, 2); 195256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com expected[1] = testBounds; 195383d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com if (rectFirst) { 195483d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com expectedDirs[0] = SkPath::kCW_Direction; 195583d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com } else { 195683d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com expectedDirs[0] = SkPath::kCCW_Direction; 195783d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com } 1958b8d9d5bd29edbdaeabd5478c1d3e71e92c09cd52bungeman@google.com expectedDirs[1] = tests[testIndex].fDirection; 195995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, path.isNestedFillRects(computed, computedDirs)); 196056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, expected[0] == computed[0]); 196156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com REPORTER_ASSERT(reporter, expected[1] == computed[1]); 196283d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com REPORTER_ASSERT(reporter, expectedDirs[0] == computedDirs[0]); 196383d1a68141830cbfa0d5fca6f9c9bccf9c978ad2robertphillips@google.com REPORTER_ASSERT(reporter, expectedDirs[1] == computedDirs[1]); 196456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 196556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 196656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 196756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, close then line 196856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com SkPath path1; 196956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 197056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 197156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 197256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 19739880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 197456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 197556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 197656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 197756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(1, 0); 197856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 197956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 198056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 198195bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, !path1.isNestedFillRects(NULL)); 198256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 198356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, move in the middle 198456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 198556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 198656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 198756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 198856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 19899880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 199056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 199156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(1, .5f); 199256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 199356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 199456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 199556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 199656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 199756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 199856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 199995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, !path1.isNestedFillRects(NULL)); 200056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 200156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, move on the edge 200256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 200356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 200456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 200556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 20069880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 200756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[index - 1].fX, r1[index - 1].fY); 200856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 200956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 201056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 201156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 201256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 201356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 201495bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, !path1.isNestedFillRects(NULL)); 201556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 201656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, quad 201756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 201856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 201956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 202056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 202156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 20229880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 202356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 202456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.quadTo(1, .5f, 1, .5f); 202556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 202656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 202756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 202856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 202956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 203056f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 203156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 203295bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, !path1.isNestedFillRects(NULL)); 203356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 203456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, cubic 203556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 203656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (rectFirst) { 203756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCW_Direction); 203856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 203956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.moveTo(r1[0].fX, r1[0].fY); 20409880607151ca7c2dc6b1a4b9756938bd71913ab5bsalomon for (index = 1; index < SkToInt(SK_ARRAY_COUNT(r1)); ++index) { 204156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (index == 2) { 204256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.cubicTo(1, .5f, 1, .5f, 1, .5f); 204356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 204456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.lineTo(r1[index].fX, r1[index].fY); 204556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 204656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.close(); 204756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com if (!rectFirst) { 204856f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(-1, -1, 2, 2, SkPath::kCCW_Direction); 204956f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 205095bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, !path1.isNestedFillRects(NULL)); 20513458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com 205256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com // fail, not nested 205356f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.reset(); 205456f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(1, 1, 3, 3, SkPath::kCW_Direction); 205556f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com path1.addRect(2, 2, 4, 4, SkPath::kCW_Direction); 205695bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, !path1.isNestedFillRects(NULL)); 205756f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com } 2058bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com 205995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark // pass, constructed explicitly from manually closed rects specified as moves/lines. 206095bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark SkPath path; 206195bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.moveTo(0, 0); 206295bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(10, 0); 206395bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(10, 10); 206495bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(0, 10); 206595bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(0, 0); 206695bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.moveTo(1, 1); 206795bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(9, 1); 206895bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(9, 9); 206995bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(1, 9); 207095bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark path.lineTo(1, 1); 207195bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, path.isNestedFillRects(NULL)); 207295bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark 2073bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com // pass, stroke rect 2074bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPath src, dst; 2075bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com src.addRect(1, 1, 7, 7, SkPath::kCW_Direction); 2076bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com SkPaint strokePaint; 2077bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.setStyle(SkPaint::kStroke_Style); 2078bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.setStrokeWidth(2); 2079bfe90370ea68798b2b9b5ba44142db67d99555e8caryclark@google.com strokePaint.getFillPath(src, &dst); 208095bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark REPORTER_ASSERT(reporter, dst.isNestedFillRects(NULL)); 208156f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com} 208256f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com 20832972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.comstatic void write_and_read_back(skiatest::Reporter* reporter, 20842972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkPath& p) { 208519382421b916aab00be7265815ba4e2690adf2c9commit-bot@chromium.org SkWriter32 writer; 20862972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com writer.writePath(p); 20874469938e92d779dff05e745559e67907bbf21e78reed@google.com size_t size = writer.bytesWritten(); 20882972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkAutoMalloc storage(size); 20892972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com writer.flatten(storage.get()); 20902972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkReader32 reader(storage.get(), size); 20912972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 20922972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkPath readBack; 20932972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack != p); 20942972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com reader.readPath(&readBack); 20952972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack == p); 20962972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 2097d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com REPORTER_ASSERT(reporter, readBack.getConvexityOrUnknown() == 20982972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com p.getConvexityOrUnknown()); 20992972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 21002972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, readBack.isOval(NULL) == p.isOval(NULL)); 21012972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 21022972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkRect& origBounds = p.getBounds(); 21032972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com const SkRect& readBackBounds = readBack.getBounds(); 21042972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 21052972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com REPORTER_ASSERT(reporter, origBounds == readBackBounds); 21062972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com} 21072972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 210853effc5e327749ea47bc0c678cb45246644600b0reed@google.comstatic void test_flattening(skiatest::Reporter* reporter) { 210953effc5e327749ea47bc0c678cb45246644600b0reed@google.com SkPath p; 211053effc5e327749ea47bc0c678cb45246644600b0reed@google.com 211153effc5e327749ea47bc0c678cb45246644600b0reed@google.com static const SkPoint pts[] = { 211253effc5e327749ea47bc0c678cb45246644600b0reed@google.com { 0, 0 }, 211353effc5e327749ea47bc0c678cb45246644600b0reed@google.com { SkIntToScalar(10), SkIntToScalar(10) }, 211453effc5e327749ea47bc0c678cb45246644600b0reed@google.com { SkIntToScalar(20), SkIntToScalar(10) }, { SkIntToScalar(20), 0 }, 211553effc5e327749ea47bc0c678cb45246644600b0reed@google.com { 0, 0 }, { 0, SkIntToScalar(10) }, { SkIntToScalar(1), SkIntToScalar(10) } 211653effc5e327749ea47bc0c678cb45246644600b0reed@google.com }; 211753effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.moveTo(pts[0]); 211853effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.lineTo(pts[1]); 211953effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.quadTo(pts[2], pts[3]); 212053effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.cubicTo(pts[4], pts[5], pts[6]); 212153effc5e327749ea47bc0c678cb45246644600b0reed@google.com 21222972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com write_and_read_back(reporter, p); 212394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 212494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com // create a buffer that should be much larger than the path so we don't 212594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com // kill our stack if writer goes too far. 212694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com char buffer[1024]; 21274faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size1 = p.writeToMemory(NULL); 21284faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size2 = p.writeToMemory(buffer); 212994e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size2); 213094e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 213194e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com SkPath p2; 21324faa869cdabbdcf4867118b4a1272296baaeeb52commit-bot@chromium.org size_t size3 = p2.readFromMemory(buffer, 1024); 213394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size3); 213494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, p == p2); 213594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com 2136a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org size3 = p2.readFromMemory(buffer, 0); 2137a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !size3); 2138a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2139a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath tooShort; 2140a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org size3 = tooShort.readFromMemory(buffer, size1 - 1); 2141a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, tooShort.isEmpty()); 2142a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 214394e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com char buffer2[1024]; 214494e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com size3 = p2.writeToMemory(buffer2); 214594e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, size1 == size3); 214694e75ee46a569cbcdf61fb7f04ee3a69d3ca0896djsollen@google.com REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); 21472972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 21482972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com // test persistence of the oval flag & convexity 21492972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com { 21502972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkPath oval; 21512972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com SkRect rect = SkRect::MakeWH(10, 10); 21522972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com oval.addOval(rect); 21532972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com 21542972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com write_and_read_back(reporter, oval); 21552972bb5fd2441709026b350c6b9b66eecd80f868robertphillips@google.com } 215653effc5e327749ea47bc0c678cb45246644600b0reed@google.com} 215753effc5e327749ea47bc0c678cb45246644600b0reed@google.com 215853effc5e327749ea47bc0c678cb45246644600b0reed@google.comstatic void test_transform(skiatest::Reporter* reporter) { 2159b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p; 2160d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 2161a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#define CONIC_PERSPECTIVE_BUG_FIXED 0 216253effc5e327749ea47bc0c678cb45246644600b0reed@google.com static const SkPoint pts[] = { 2163a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, // move 2164a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { SkIntToScalar(10), SkIntToScalar(10) }, // line 2165a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { SkIntToScalar(20), SkIntToScalar(10) }, { SkIntToScalar(20), 0 }, // quad 2166a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, { 0, SkIntToScalar(10) }, { SkIntToScalar(1), SkIntToScalar(10) }, // cubic 2167a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_PERSPECTIVE_BUG_FIXED 2168a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org { 0, 0 }, { SkIntToScalar(20), SkIntToScalar(10) }, // conic 2169a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 217053effc5e327749ea47bc0c678cb45246644600b0reed@google.com }; 2171a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org const int kPtCount = SK_ARRAY_COUNT(pts); 2172b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 217353effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.moveTo(pts[0]); 217453effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.lineTo(pts[1]); 217553effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.quadTo(pts[2], pts[3]); 217653effc5e327749ea47bc0c678cb45246644600b0reed@google.com p.cubicTo(pts[4], pts[5], pts[6]); 2177a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_PERSPECTIVE_BUG_FIXED 2178a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(pts[4], pts[5], 0.5f); 2179a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 2180a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 2181b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2182b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2183b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2184b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2185b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2186b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2187b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p == p1); 2188b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2189b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2190b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2191b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2192b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2193b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setScale(SK_Scalar1 * 2, SK_Scalar1 * 3); 2194b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2195b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; // Leave p1 non-unique (i.e., the empty path) 2196b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 21976e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com p.transform(matrix, &p1); 2198b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPoint pts1[kPtCount]; 21996e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com int count = p1.getPoints(pts1, kPtCount); 2200b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, kPtCount == count); 2201b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com for (int i = 0; i < count; ++i) { 2202b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPoint newPt = SkPoint::Make(pts[i].fX * 2, pts[i].fY * 3); 2203b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, newPt == pts1[i]); 2204b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2205b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2206b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2207b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2208b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2209b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 22103f43f8ab9cd3ba0ea83f5ae0659c21f101dfca7areed matrix.setPerspX(4); 2211b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2212b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2213b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); 2214b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2215b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2216b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, matrix.invert(&matrix)); 2217b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.transform(matrix, NULL); 2218b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkRect pBounds = p.getBounds(); 2219b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkRect p1Bounds = p1.getBounds(); 2220b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fLeft, p1Bounds.fLeft)); 2221b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fTop, p1Bounds.fTop)); 2222b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fRight, p1Bounds.fRight)); 2223b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, SkScalarNearlyEqual(pBounds.fBottom, p1Bounds.fBottom)); 222453effc5e327749ea47bc0c678cb45246644600b0reed@google.com } 2225b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2226a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2227a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addCircle(0, 0, 1, SkPath::kCW_Direction); 2228b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2229b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2230b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2231b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2232b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2233b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); 2234b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2235b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2236b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p1.cheapIsDirection(SkPath::kCW_Direction)); 2237b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2238b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2239b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2240b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2241b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2242b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.reset(); 2243b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setScaleX(-1); 2244b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2245b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); // Make p1 unique (i.e., not empty path) 2246b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2247b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2248b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p1.cheapIsDirection(SkPath::kCCW_Direction)); 2249b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 2250b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2251b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com { 2252b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkMatrix matrix; 2253b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com matrix.setAll(1, 1, 0, 1, 1, 0, 0, 0, 1); 2254b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com SkPath p1; 2255b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p1.moveTo(SkPoint::Make(0, 0)); // Make p1 unique (i.e., not empty path) 2256b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com 2257b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com p.transform(matrix, &p1); 2258b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com REPORTER_ASSERT(reporter, p1.cheapIsDirection(SkPath::kUnknown_Direction)); 2259b06e88dc6505412cc2b1a5f0bfb0f669465e1f8erobertphillips@google.com } 226053effc5e327749ea47bc0c678cb45246644600b0reed@google.com} 226153effc5e327749ea47bc0c678cb45246644600b0reed@google.com 22624da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstatic void test_zero_length_paths(skiatest::Reporter* reporter) { 22636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath p; 22647e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org uint8_t verbs[32]; 22657e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 226656f233ab54d228f3ce05d0f7e15996424f9d5dd2caryclark@google.com struct SUPPRESS_VISIBILITY_WARNING zeroPathTestData { 22677e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const char* testPath; 22687e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultPts; 22697e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkRect resultBound; 22707e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPath::Verb* resultVerbs; 22717e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultVerbs; 22727e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22734da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 22747e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs1[] = { SkPath::kMove_Verb }; 22757e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs2[] = { SkPath::kMove_Verb, SkPath::kMove_Verb }; 22767e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs3[] = { SkPath::kMove_Verb, SkPath::kClose_Verb }; 22777e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs4[] = { SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb }; 22787e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs5[] = { SkPath::kMove_Verb, SkPath::kLine_Verb }; 22797e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs6[] = { SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kMove_Verb, SkPath::kLine_Verb }; 22807e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs7[] = { SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb }; 22817e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs8[] = { 22827e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb 22837e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22847e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs9[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb }; 22857e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs10[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kMove_Verb, SkPath::kQuad_Verb }; 22867e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs11[] = { SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb }; 22877e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs12[] = { 22887e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kQuad_Verb, SkPath::kClose_Verb 22897e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22907e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs13[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb }; 22917e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs14[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kMove_Verb, SkPath::kCubic_Verb }; 22927e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs15[] = { SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb }; 22937e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs16[] = { 22947e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kCubic_Verb, SkPath::kClose_Verb 22957e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 22967e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const struct zeroPathTestData gZeroLengthTests[] = { 22977e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "M 1 1", 1, {0, 0, 0, 0}, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2298aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 M 2 1", 2, {SK_Scalar1, SK_Scalar1, 2*SK_Scalar1, SK_Scalar1}, resultVerbs2, SK_ARRAY_COUNT(resultVerbs2) }, 22997e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "M 1 1 z", 1, {0, 0, 0, 0}, resultVerbs3, SK_ARRAY_COUNT(resultVerbs3) }, 2300aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2301aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1", 2, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs5, SK_ARRAY_COUNT(resultVerbs5) }, 2302aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2303aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 L 1 1 z", 2, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs7, SK_ARRAY_COUNT(resultVerbs7) }, 2304aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2305aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 1 Q 1 1 1 1", 3, {SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1}, resultVerbs9, SK_ARRAY_COUNT(resultVerbs9) }, 2306aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2307aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2308aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2309aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2310aaf1688959ba5dc74007e711599552928d255dfaschenney@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, 23117e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SK_ARRAY_COUNT(resultVerbs14) 23127e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }, 2313aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2314aaf1688959ba5dc74007e711599552928d255dfaschenney@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, 23157e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SK_ARRAY_COUNT(resultVerbs16) 23167e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 23177e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 23184da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 23197e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gZeroLengthTests); ++i) { 23207e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org p.reset(); 23217e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org bool valid = SkParsePath::FromSVGString(gZeroLengthTests[i].testPath, &p); 23227e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, valid); 23237e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 23247e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].numResultPts == (size_t)p.countPoints()); 23257e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].resultBound == p.getBounds()); 23267e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].numResultVerbs == (size_t)p.getVerbs(verbs, SK_ARRAY_COUNT(verbs))); 23277e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t j = 0; j < gZeroLengthTests[i].numResultVerbs; ++j) { 23287e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, gZeroLengthTests[i].resultVerbs[j] == verbs[j]); 23297e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 2330df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com } 23314da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org} 23324da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 23334da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.orgstruct SegmentInfo { 23344da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org SkPath fPath; 23354da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org int fPointCount; 23364da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org}; 23374da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org 233810296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com#define kCurveSegmentMask (SkPath::kQuad_SegmentMask | SkPath::kCubic_SegmentMask) 233910296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com 23406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_segment_masks(skiatest::Reporter* reporter) { 2341eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com SkPath p, p2; 2342eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com 23436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(0, 0); 23446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.quadTo(100, 100, 200, 200); 23456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, SkPath::kQuad_SegmentMask == p.getSegmentMasks()); 23466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 2347eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2348eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 23496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(100, 100, 200, 200, 300, 300); 23506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, kCurveSegmentMask == p.getSegmentMasks()); 23516630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 2352eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2353eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 2354eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com 23556630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 23566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(0, 0); 23576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(100, 100, 200, 200, 300, 300); 23586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_SegmentMask == p.getSegmentMasks()); 2359eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com p2 = p; 2360eef938c0a764ca24bfebf38655124c8fcb8144f2reed@google.com REPORTER_ASSERT(reporter, p2.getSegmentMasks() == p.getSegmentMasks()); 2361d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 23626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 23636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 23646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 23656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_iter(skiatest::Reporter* reporter) { 23667e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath p; 23676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint pts[4]; 23686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 23696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with no path 23706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Iter noPathIter; 23716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 23727e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 23736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that setting an empty path works 23746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p, false); 23756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 23767e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 23776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that close path makes no difference for an empty path 23786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p, true); 23796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 23807e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org 23816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with an initial empty path 23826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Iter iter(p, false); 23836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 23846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 23856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that close path makes no difference 23867e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org iter.setPath(p, true); 23876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 23886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 2389d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 23907e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org struct iterTestData { 23917e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const char* testPath; 23927e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const bool forceClose; 23937e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const bool consumeDegenerates; 23947e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t* numResultPtsPerVerb; 23957e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPoint* resultPts; 23967e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const SkPath::Verb* resultVerbs; 23977e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org const size_t numResultVerbs; 23987e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 23996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24007e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs1[] = { SkPath::kDone_Verb }; 24017e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs2[] = { 24027e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kDone_Verb 24037e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24047e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs3[] = { 24057e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 24067e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24077e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs4[] = { 24087e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 24097e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24107e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPath::Verb resultVerbs5[] = { 24117e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org SkPath::kMove_Verb, SkPath::kLine_Verb, SkPath::kClose_Verb, SkPath::kMove_Verb, SkPath::kClose_Verb, SkPath::kDone_Verb 24127e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24137e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const size_t resultPtsSizes1[] = { 0 }; 2414fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes2[] = { 1, 2, 2, 0 }; 2415fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes3[] = { 1, 2, 2, 2, 1, 0 }; 2416fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes4[] = { 1, 2, 1, 1, 0 }; 2417fedd09ba7e218116df8a676069726de6e9d35277schenney@chromium.org static const size_t resultPtsSizes5[] = { 1, 2, 1, 1, 1, 0 }; 2418aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org static const SkPoint* resultPts1 = 0; 24197e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts2[] = { 24207e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, SK_Scalar1 }, { SK_Scalar1, SK_Scalar1 }, { 0, SK_Scalar1 } 24217e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24227e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts3[] = { 24237e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, SK_Scalar1 }, { SK_Scalar1, SK_Scalar1 }, { 0, SK_Scalar1 }, 24247e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { 0, SK_Scalar1 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 } 24257e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24267e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts4[] = { 24277e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { 0, 0 }, { 0, 0 } 24287e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24297e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const SkPoint resultPts5[] = { 24307e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { SK_Scalar1, 0 }, { 0, 0 }, { 0, 0 } 24317e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24327e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org static const struct iterTestData gIterTests[] = { 24337e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "M 1 0", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2434aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 2435aaf1688959ba5dc74007e711599552928d255dfaschenney@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) }, 24367e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 24377e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org { "z", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 24387e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@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) }, 24397e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@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) }, 2440aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 1 L 0 1 M 0 0 z", false, true, resultPtsSizes2, resultPts2, resultVerbs2, SK_ARRAY_COUNT(resultVerbs2) }, 2441aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 1 L 0 1 M 0 0 z", true, true, resultPtsSizes3, resultPts3, resultVerbs3, SK_ARRAY_COUNT(resultVerbs3) }, 2442aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", false, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2443aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", true, true, resultPtsSizes1, resultPts1, resultVerbs1, SK_ARRAY_COUNT(resultVerbs1) }, 2444aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", false, false, resultPtsSizes4, resultPts4, resultVerbs4, SK_ARRAY_COUNT(resultVerbs4) }, 2445aaf1688959ba5dc74007e711599552928d255dfaschenney@chromium.org { "M 1 0 L 1 0 M 0 0 z", true, false, resultPtsSizes5, resultPts5, resultVerbs5, SK_ARRAY_COUNT(resultVerbs5) } 24467e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org }; 24476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 24487e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gIterTests); ++i) { 24497e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org p.reset(); 24507e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org bool valid = SkParsePath::FromSVGString(gIterTests[i].testPath, &p); 24517e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, valid); 24527e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org iter.setPath(p, gIterTests[i].forceClose); 24537e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org int j = 0, l = 0; 24547e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org do { 24557e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts, gIterTests[i].consumeDegenerates) == gIterTests[i].resultVerbs[j]); 24567e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org for (int k = 0; k < (int)gIterTests[i].numResultPtsPerVerb[j]; ++k) { 24577e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, pts[k] == gIterTests[i].resultPts[l++]); 24587e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 24597e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } while (gIterTests[i].resultVerbs[j++] != SkPath::kDone_Verb); 24607e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org REPORTER_ASSERT(reporter, j == (int)gIterTests[i].numResultVerbs); 24617e963605d5b8177c30afa0d8e5541b0fbe1b6e13schenney@chromium.org } 24626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 2463a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2464a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2465a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2466a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 1); 2467a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 2468a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2469a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, iter.isClosedContour()); 2470a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2471a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2472a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2473a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 1); 2474a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2475a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, iter.isClosedContour()); 2476a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(0, 0); 2477a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(2, 2); 2478a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2479a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !iter.isClosedContour()); 2480a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2481a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this checks to see if the NaN logic is executed in SkPath::autoClose(), but does not 2482a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // check to see if the result is correct. 2483a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (int setNaN = 0; setNaN < 4; ++setNaN) { 2484a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2485a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(setNaN == 0 ? SK_ScalarNaN : 0, setNaN == 1 ? SK_ScalarNaN : 0); 2486a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(setNaN == 2 ? SK_ScalarNaN : 1, setNaN == 3 ? SK_ScalarNaN : 1); 2487a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, true); 2488a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2489a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2490a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kClose_Verb == iter.next(pts, false)); 2491a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 2492a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2493a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2494a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(0, 0, 0, 0); 2495a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2496a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2497a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kQuad_Verb == iter.next(pts, false)); 2498a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2499a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2500a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2501a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2502a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2503a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(0, 0, 0, 0, 0.5f); 2504a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2505a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2506a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kConic_Verb == iter.next(pts, false)); 2507a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2508a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2509a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2510a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2511a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 2512a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.cubicTo(0, 0, 0, 0, 0, 0); 2513a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2514a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2515a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == iter.next(pts, false)); 2516a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2517a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2518a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2519a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2520a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(1, 1); // add a trailing moveto 2521a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2522a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2523a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == iter.next(pts, false)); 2524a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.setPath(p, false); 2525a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org iter.next(pts, false); 2526a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kDone_Verb == iter.next(pts, true)); 2527a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 25286630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // The GM degeneratesegments.cpp test is more extensive 2529b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips 2530b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips // Test out mixed degenerate and non-degenerate geometry with Conics 2531b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips const SkVector radii[4] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 100, 100 } }; 2532b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips SkRect r = SkRect::MakeWH(100, 100); 2533b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips SkRRect rr; 2534b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips rr.setRectRadii(r, radii); 2535b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips p.reset(); 2536b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips p.addRRect(rr); 2537b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips iter.setPath(p, false); 2538b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kMove_Verb == iter.next(pts)); 2539b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kLine_Verb == iter.next(pts)); 2540b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kLine_Verb == iter.next(pts)); 2541b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SkPath::kConic_Verb == iter.next(pts)); 2542b8de1f46594c3cd9c537f0b128c6d6eb30a9f463robertphillips REPORTER_ASSERT(reporter, SK_ScalarRoot2Over2 == iter.conicWeight()); 25436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 25446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.orgstatic void test_raw_iter(skiatest::Reporter* reporter) { 25466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath p; 25476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint pts[4]; 25486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with no path 25506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::RawIter noPathIter; 25516630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 25526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that setting an empty path works 25536630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org noPathIter.setPath(p); 25546630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, noPathIter.next(pts) == SkPath::kDone_Verb); 2555d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 25566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test an iterator with an initial empty path 25576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::RawIter iter(p); 25586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 25596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Test that a move-only path returns the move. 25616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1, 0); 25626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 25636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 25646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 25656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 25666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 25676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // No matter how many moves we add, we should get them all back 25696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*2, SK_Scalar1); 25706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*3, SK_Scalar1*2); 25716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 25726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 25736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 25746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 25756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 25766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 25776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 25786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 25796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*3); 25806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*2); 25816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 25826630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25836630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Initial close is never ever stored 25846630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 25856630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 25866630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 25876630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 25886630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 25896630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Move/close sequences 25906630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 25916630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); // Not stored, no purpose 25926630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1, 0); 25936630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 25946630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); // Not stored, no purpose 25956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*2, SK_Scalar1); 25966630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 25976630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*3, SK_Scalar1*2); 25986630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(SK_Scalar1*4, SK_Scalar1*3); 25996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 26006630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 26016630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26026630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 26036630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 26046630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 26056630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1); 26066630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == 0); 26076630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26086630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 26096630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 26106630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 26116630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*2); 26126630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1); 26136630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26146630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*3); 26156630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*2); 26166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kMove_Verb); 26176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*4); 26186630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*3); 26196630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kClose_Verb); 26206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == SK_Scalar1*4); 26216630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == SK_Scalar1*3); 26226630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, iter.next(pts) == SkPath::kDone_Verb); 26236630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 26246630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Generate random paths and verify 26256630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint randomPts[25]; 26266630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int i = 0; i < 5; ++i) { 26276630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int j = 0; j < 5; ++j) { 26286630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org randomPts[i*5+j].set(SK_Scalar1*i, SK_Scalar1*j); 26296630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 26306630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 26316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 26326630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org // Max of 10 segments, max 3 points per segment 2633e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand(9876543); 26346630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint expectedPts[31]; // May have leading moveTo 2635d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com SkPath::Verb expectedVerbs[22]; // May have leading moveTo 26366630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPath::Verb nextVerb; 2637d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com 26386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int i = 0; i < 500; ++i) { 26396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.reset(); 26406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org bool lastWasClose = true; 26416630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org bool haveMoveTo = false; 2642d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com SkPoint lastMoveToPt = { 0, 0 }; 26436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numPoints = 0; 26446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numVerbs = (rand.nextU() >> 16) % 10; 26456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numIterVerbs = 0; 26466630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org for (int j = 0; j < numVerbs; ++j) { 26476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org do { 26486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org nextVerb = static_cast<SkPath::Verb>((rand.nextU() >> 16) % SkPath::kDone_Verb); 26496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } while (lastWasClose && nextVerb == SkPath::kClose_Verb); 26506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org switch (nextVerb) { 26516630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kMove_Verb: 26526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 26536630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.moveTo(expectedPts[numPoints]); 2654d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com lastMoveToPt = expectedPts[numPoints]; 26556630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 1; 26566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 26576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 26586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 26596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kLine_Verb: 26606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2661d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 26626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 26636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 26646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 26656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 26666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.lineTo(expectedPts[numPoints]); 26676630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 1; 26686630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 26696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 26706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kQuad_Verb: 26716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2672d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 26736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 26746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 26756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 26766630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 26776630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 26786630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.quadTo(expectedPts[numPoints], expectedPts[numPoints + 1]); 26796630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 2; 26806630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 26816630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2682277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 2683277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com if (!haveMoveTo) { 2684277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints++] = lastMoveToPt; 2685277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 2686277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com haveMoveTo = true; 2687277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com } 2688277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 2689277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 2690277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com p.conicTo(expectedPts[numPoints], expectedPts[numPoints + 1], 2691277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com rand.nextUScalar1() * 4); 2692277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com numPoints += 2; 2693277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com lastWasClose = false; 2694277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 26956630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kCubic_Verb: 26966630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org if (!haveMoveTo) { 2697d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com expectedPts[numPoints++] = lastMoveToPt; 26986630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = SkPath::kMove_Verb; 26996630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org haveMoveTo = true; 27006630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27016630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints] = randomPts[(rand.nextU() >> 16) % 25]; 27026630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 1] = randomPts[(rand.nextU() >> 16) % 25]; 27036630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 2] = randomPts[(rand.nextU() >> 16) % 25]; 27046630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.cubicTo(expectedPts[numPoints], expectedPts[numPoints + 1], 27056630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedPts[numPoints + 2]); 27066630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numPoints += 3; 27076630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = false; 27086630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 27096630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kClose_Verb: 27106630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org p.close(); 2711d335d1d784167f8b9a4bf8a35e04d8e82d0a9507reed@google.com haveMoveTo = false; 27126630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastWasClose = true; 27136630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2714277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com default: 2715330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com SkDEBUGFAIL("unexpected verb"); 27166630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27176630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org expectedVerbs[numIterVerbs++] = nextVerb; 27186630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 2719d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 27206630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org iter.setPath(p); 27216630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numVerbs = numIterVerbs; 27226630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterVerbs = 0; 27236630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org int numIterPts = 0; 27246630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint lastMoveTo; 27256630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org SkPoint lastPt; 27266630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastMoveTo.set(0, 0); 27276630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt.set(0, 0); 27286630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org while ((nextVerb = iter.next(pts)) != SkPath::kDone_Verb) { 27296630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, nextVerb == expectedVerbs[numIterVerbs]); 27306630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterVerbs++; 27316630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org switch (nextVerb) { 27326630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kMove_Verb: 27336630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints); 27346630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == expectedPts[numIterPts]); 27356630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = lastMoveTo = pts[0]; 27366630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 1; 27376630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 27386630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kLine_Verb: 27396630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 1); 27406630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 27416630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 27426630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[1]; 27436630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 1; 27446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 27456630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kQuad_Verb: 2746277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 27476630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 2); 27486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 27496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 27506630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[2] == expectedPts[numIterPts + 1]); 27516630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[2]; 27526630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 2; 27536630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 27546630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kCubic_Verb: 27556630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts < numPoints + 3); 27566630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastPt); 27576630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[1] == expectedPts[numIterPts]); 27586630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[2] == expectedPts[numIterPts + 1]); 27596630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[3] == expectedPts[numIterPts + 2]); 27606630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = pts[3]; 27616630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org numIterPts += 3; 27626630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 27636630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org case SkPath::kClose_Verb: 27646630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, pts[0] == lastMoveTo); 27656630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org lastPt = lastMoveTo; 27666630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org break; 2767277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com default: 2768330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com SkDEBUGFAIL("unexpected verb"); 27696630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27706630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27716630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterPts == numPoints); 27726630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org REPORTER_ASSERT(reporter, numIterVerbs == numVerbs); 27736630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org } 27746630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org} 27756630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org 27766aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void check_for_circle(skiatest::Reporter* reporter, 277730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 277830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com bool expectedCircle, 277930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction expectedDir) { 2780466310dbd3073add2ec934e336c30deaaf702eaerobertphillips@google.com SkRect rect = SkRect::MakeEmpty(); 278130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(&rect) == expectedCircle); 278230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com REPORTER_ASSERT(reporter, path.cheapIsDirection(expectedDir)); 2783fbb0ed959de64f16d236d2f0d81ddf5cb318e1feskia.committer@gmail.com 278430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (expectedCircle) { 27856aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, rect.height() == rect.width()); 27866aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 27876aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 27886aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27896aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_skew(skiatest::Reporter* reporter, 279030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 279130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 27926aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 27936aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 27946aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 27956aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setSkew(SkIntToScalar(3), SkIntToScalar(5)); 27966aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 279730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com // this matrix reverses the direction. 279830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (SkPath::kCCW_Direction == dir) { 279930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCW_Direction; 280030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2801a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCW_Direction == dir); 280230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCCW_Direction; 280330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 280430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, false, dir); 28056aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 28066aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28076aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_translate(skiatest::Reporter* reporter, 280830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 280930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 28106aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 28116aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28126aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // translate at small offset 28136aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 28146aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setTranslate(SkIntToScalar(15), SkIntToScalar(15)); 28156aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 281630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 28176aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28186aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 28196aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 28206aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28216aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // translate at a relatively big offset 28226aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setTranslate(SkIntToScalar(1000), SkIntToScalar(1000)); 28236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 282430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 28256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 28266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 28276aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_rotate(skiatest::Reporter* reporter, 282830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 282930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 28306aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com for (int angle = 0; angle < 360; ++angle) { 28316aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 28326aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 28336aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(angle)); 28346aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 28356aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 283630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com // TODO: a rotated circle whose rotated angle is not a multiple of 90 28376aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // degrees is not an oval anymore, this can be improved. we made this 28386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // for the simplicity of our implementation. 28396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com if (angle % 90 == 0) { 284030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 28416aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } else { 284230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, false, dir); 28436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 28446aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com } 28456aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 28466aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 284730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_x(skiatest::Reporter* reporter, 284830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 284930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 285030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 285130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 285230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 285330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleX(-SK_Scalar1); 285430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 285530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 285630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (SkPath::kCW_Direction == dir) { 285730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCCW_Direction; 285830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2859a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCCW_Direction == dir); 286030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCW_Direction; 286130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 286230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 286330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 286430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 286530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 286630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_y(skiatest::Reporter* reporter, 286730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 286830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 286930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 287030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 287130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 287230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleY(-SK_Scalar1); 287330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 287430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 287530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com if (SkPath::kCW_Direction == dir) { 287630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCCW_Direction; 287730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } else { 2878a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCCW_Direction == dir); 287930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com dir = SkPath::kCW_Direction; 288030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com } 288130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 288230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 288330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 288430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 288530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.comstatic void test_circle_mirror_xy(skiatest::Reporter* reporter, 288630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com const SkPath& path, 288730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath::Direction dir) { 288830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkPath tmp; 288930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com SkMatrix m; 289030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.reset(); 289130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleX(-SK_Scalar1); 289230c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com m.setScaleY(-SK_Scalar1); 289330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com path.transform(m, &tmp); 289430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 289530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, tmp, true, dir); 289630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com} 289730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 28986aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_with_direction(skiatest::Reporter* reporter, 28996aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath::Direction dir) { 29006aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 29016aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29026aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle at origin 29036aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(20), dir); 290430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, true, dir); 290530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_rotate(reporter, path, dir); 290630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_translate(reporter, path, dir); 290730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_skew(reporter, path, dir); 29086aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29096aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle at an offset at (10, 10) 29106aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 29116aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(SkIntToScalar(10), SkIntToScalar(10), 29126aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkIntToScalar(20), dir); 291330c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, true, dir); 291430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_rotate(reporter, path, dir); 291530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_translate(reporter, path, dir); 291630c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_skew(reporter, path, dir); 291730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_x(reporter, path, dir); 291830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_y(reporter, path, dir); 291930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com test_circle_mirror_xy(reporter, path, dir); 29206aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 29216aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29226aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle_with_add_paths(skiatest::Reporter* reporter) { 29236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 29246aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath circle; 29256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath rect; 29266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath empty; 29276aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 292830c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com static const SkPath::Direction kCircleDir = SkPath::kCW_Direction; 292930c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com static const SkPath::Direction kCircleDirOpposite = SkPath::kCCW_Direction; 293030c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com 293130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com circle.addCircle(0, 0, SkIntToScalar(10), kCircleDir); 29326aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com rect.addRect(SkIntToScalar(5), SkIntToScalar(5), 29336aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkIntToScalar(20), SkIntToScalar(20), SkPath::kCW_Direction); 29346aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29356aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix translate; 29366aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com translate.setTranslate(SkIntToScalar(12), SkIntToScalar(12)); 29376aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29380efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com // Although all the path concatenation related operations leave 29390efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com // the path a circle, most mark it as a non-circle for simplicity 29406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29416aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // empty + circle (translate) 29426aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = empty; 29436aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addPath(circle, translate); 294430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, kCircleDir); 29456aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29466aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // circle + empty (translate) 29476aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = circle; 29486aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addPath(empty, translate); 29490efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com check_for_circle(reporter, path, true, kCircleDir); 29506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // test reverseAddPath 29526aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = circle; 29536aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reverseAddPath(rect); 295430c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, kCircleDirOpposite); 29556aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 29566aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29576aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_circle(skiatest::Reporter* reporter) { 29586aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_direction(reporter, SkPath::kCW_Direction); 29596aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_direction(reporter, SkPath::kCCW_Direction); 29606aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29616aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // multiple addCircle() 29626aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 29636aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 29646aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(20), SkPath::kCW_Direction); 296530c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, SkPath::kCW_Direction); 29666aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29676aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // some extra lineTo() would make isOval() fail 29686aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 29696aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 29706aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.lineTo(0, 0); 297130c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, SkPath::kCW_Direction); 29726aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29736aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // not back to the original point 29746aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 29756aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addCircle(0, 0, SkIntToScalar(10), SkPath::kCW_Direction); 29766aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.setLastPt(SkIntToScalar(5), SkIntToScalar(5)); 297730c174b9ce6b9777ee50ae0d0565a01b2a060f01bsalomon@google.com check_for_circle(reporter, path, false, SkPath::kCW_Direction); 29786aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29796aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle_with_add_paths(reporter); 2980a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 2981a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test negative radius 2982a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.reset(); 2983a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org path.addCircle(0, 0, -1, SkPath::kCW_Direction); 2984a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, path.isEmpty()); 29856aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 29866aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29876aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.comstatic void test_oval(skiatest::Reporter* reporter) { 29886aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkRect rect; 29896aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkMatrix m; 29906aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath path; 29916aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29926aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com rect = SkRect::MakeWH(SkIntToScalar(30), SkIntToScalar(50)); 29936aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addOval(rect); 29946aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29956aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(NULL)); 29966aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 29976aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(90)); 29986aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com SkPath tmp; 29996aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 30006aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // an oval rotated 90 degrees is still an oval. 30016aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, tmp.isOval(NULL)); 30026aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30036aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 30046aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.setRotate(SkIntToScalar(30)); 30056aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 30066aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 30076aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // an oval rotated 30 degrees is not an oval anymore. 30086aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 30096aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30106aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // since empty path being transformed. 30116aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 30126aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 30136aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com m.reset(); 30146aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.transform(m, &tmp); 30156aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 30166aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30176aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // empty path is not an oval 30186aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 30196aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 30206aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30216aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // only has moveTo()s 30226aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 30236aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.moveTo(0, 0); 30246aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.moveTo(SkIntToScalar(10), SkIntToScalar(10)); 30256aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, !tmp.isOval(NULL)); 30266aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30276aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // mimic WebKit's calling convention, 30286aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // call moveTo() first and then call addOval() 30296aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 30306aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.moveTo(0, 0); 30316aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.addOval(rect); 30326aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(NULL)); 30336aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 30346aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com // copy path 30356aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path.reset(); 30366aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.reset(); 30376aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com tmp.addOval(rect); 30386aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com path = tmp; 30396aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com REPORTER_ASSERT(reporter, path.isOval(NULL)); 30406aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com} 30416aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com 3042a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.comstatic void test_empty(skiatest::Reporter* reporter, const SkPath& p) { 3043a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkPath empty; 304480e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 30453abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isEmpty()); 30464da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, 0 == p.countPoints()); 3047df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, 0 == p.countVerbs()); 304810296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com REPORTER_ASSERT(reporter, 0 == p.getSegmentMasks()); 3049b54455e440e66e0b1c30954d226226f49aac26d6reed@google.com REPORTER_ASSERT(reporter, p.isConvex()); 30503abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.getFillType() == SkPath::kWinding_FillType); 30513abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, !p.isInverseFillType()); 3052a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, p == empty); 3053a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, !(p != empty)); 3054a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com} 3055a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 3056a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_rrect_is_convex(skiatest::Reporter* reporter, SkPath* path, 3057a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir) { 305842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org REPORTER_ASSERT(reporter, path->isConvex()); 3059a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, path->cheapIsDirection(dir)); 306042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org path->setConvexity(SkPath::kUnknown_Convexity); 306142feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org REPORTER_ASSERT(reporter, path->isConvex()); 306242feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org path->reset(); 306342feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org} 306442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org 3065d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclarkstatic void test_rrect_convexity_is_unknown(skiatest::Reporter* reporter, SkPath* path, 3066d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark SkPath::Direction dir) { 3067d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark REPORTER_ASSERT(reporter, path->isConvex()); 3068d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark REPORTER_ASSERT(reporter, path->cheapIsDirection(dir)); 3069d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path->setConvexity(SkPath::kUnknown_Convexity); 3070d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark REPORTER_ASSERT(reporter, path->getConvexity() == SkPath::kUnknown_Convexity); 3071d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark path->reset(); 3072d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark} 3073d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark 307442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.orgstatic void test_rrect(skiatest::Reporter* reporter) { 307542feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkPath p; 307642feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkRRect rr; 307742feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkVector radii[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; 307842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org SkRect r = {10, 20, 30, 40}; 307942feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org rr.setRectRadii(r, radii); 308042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRRect(rr); 3081a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 308242feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 3083a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 308442feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, &radii[0].fX); 3085a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 308642feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, &radii[0].fX, SkPath::kCCW_Direction); 3087a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 308842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, radii[1].fX, radii[1].fY); 3089a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 309042feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org p.addRoundRect(r, radii[1].fX, radii[1].fY, SkPath::kCCW_Direction); 3091a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCCW_Direction); 3092a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(radii); ++i) { 3093a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkVector save = radii[i]; 3094a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org radii[i].set(0, 0); 3095a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(r, radii); 3096a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3097a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3098a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org radii[i] = save; 3099a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3100a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRoundRect(r, 0, 0); 3101a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect returnedRect; 3102a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isRect(&returnedRect)); 3103a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, returnedRect == r); 3104a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3105a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkVector zeroRadii[] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; 3106a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(r, zeroRadii); 3107a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3108a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool closed; 3109a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Direction dir; 311091b0a3587342c48a1a6e1c4687686688737359darobertphillips REPORTER_ASSERT(reporter, p.isRect(NULL, &closed, &dir)); 3111a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, closed); 3112a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, SkPath::kCW_Direction == dir); 3113a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3114a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCW_Direction); 3115a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCW_Direction); 3116a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.isConvex()); 3117a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3118a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 3119a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr, SkPath::kCCW_Direction); 3120a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.isConvex()); 3121a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3122a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect emptyR = {10, 20, 10, 30}; 3123a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(emptyR, radii); 3124a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3125a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3126a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect largeR = {0, 0, SK_ScalarMax, SK_ScalarMax}; 3127a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(largeR, radii); 3128a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRRect(rr); 3129d3d1a988b1ed144b0123dbe594c3a47a63d6451dcaryclark test_rrect_convexity_is_unknown(reporter, &p, SkPath::kCW_Direction); 3130454fa71cc31bf45c14e4c0b25502d5332d76c51creed 3131454fa71cc31bf45c14e4c0b25502d5332d76c51creed // we check for non-finites 3132a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect infR = {0, 0, SK_ScalarMax, SK_ScalarInfinity}; 3133a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org rr.setRectRadii(infR, radii); 3134454fa71cc31bf45c14e4c0b25502d5332d76c51creed REPORTER_ASSERT(reporter, rr.isEmpty()); 3135454fa71cc31bf45c14e4c0b25502d5332d76c51creed 3136a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect tinyR = {0, 0, 1e-9f, 1e-9f}; 3137a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addRoundRect(tinyR, 5e-11f, 5e-11f); 3138a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); 3139a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3140a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3141a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_arc(skiatest::Reporter* reporter) { 3142a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3143a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect emptyOval = {10, 20, 30, 20}; 3144a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, emptyOval.isEmpty()); 3145a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(emptyOval, 1, 2); 3146a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3147a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3148a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect oval = {10, 20, 30, 40}; 3149a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 0); 3150a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3151a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3152a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath cwOval; 3153a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org cwOval.addOval(oval); 3154a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 360); 3155a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p == cwOval); 3156a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3157a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath ccwOval; 3158a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org ccwOval.addOval(oval, SkPath::kCCW_Direction); 3159a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, -360); 3160a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p == ccwOval); 3161a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3162a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addArc(oval, 1, 180); 3163a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isConvex()); 3164a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.cheapIsDirection(SkPath::kCW_Direction)); 3165a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setConvexity(SkPath::kUnknown_Convexity); 3166a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isConvex()); 3167a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3168a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3169a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_move(skiatest::Reporter* reporter, SkPath::RawIter* iter, 3170a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x0, SkScalar y0) { 3171a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3172a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3173a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kMove_Verb); 3174a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[0].fX == x0); 3175a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[0].fY == y0); 3176a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3177a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3178a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_line(skiatest::Reporter* reporter, SkPath::RawIter* iter, 3179a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3180a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3181a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3182a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kLine_Verb); 3183a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fX == x1); 3184a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fY == y1); 3185a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3186a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3187a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_quad(skiatest::Reporter* reporter, SkPath::RawIter* iter, 3188a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3189a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3190a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3191a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kQuad_Verb); 3192a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fX == x1); 3193a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[1].fY == y1); 3194a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[2].fX == x2); 3195a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pts[2].fY == y2); 3196a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3197a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3198a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_done(skiatest::Reporter* reporter, SkPath* p, SkPath::RawIter* iter) { 3199a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pts[4]; 3200a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::Verb v = iter->next(pts); 3201a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, v == SkPath::kDone_Verb); 3202a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3203a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3204a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_done_and_reset(skiatest::Reporter* reporter, SkPath* p, SkPath::RawIter* iter) { 3205a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done(reporter, p, iter); 3206a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p->reset(); 3207a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3208a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3209a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_move_and_reset(skiatest::Reporter* reporter, SkPath* p, 3210a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x0, SkScalar y0) { 3211a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3212a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, x0, y0); 3213a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3214a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3215a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3216a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line_and_reset(skiatest::Reporter* reporter, SkPath* p, 3217a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3218a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3219a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3220a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3221a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3222a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3223a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3224a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line(skiatest::Reporter* reporter, SkPath* p, 3225a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1) { 3226a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3227a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3228a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3229a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done(reporter, p, &iter); 3230a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3231a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3232a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_line_pair_and_reset(skiatest::Reporter* reporter, SkPath* p, 3233a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3234a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3235a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3236a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x1, y1); 3237a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_line(reporter, &iter, x2, y2); 3238a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 3239a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3240a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3241a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void check_path_is_quad_and_reset(skiatest::Reporter* reporter, SkPath* p, 3242a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) { 3243a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath::RawIter iter(*p); 3244a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_move(reporter, &iter, 0, 0); 3245a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_quad(reporter, &iter, x1, y1, x2, y2); 3246a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_done_and_reset(reporter, p, &iter); 324742feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org} 324842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org 3249d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reedstatic bool nearly_equal(const SkRect& a, const SkRect& b) { 3250d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed return SkScalarNearlyEqual(a.fLeft, b.fLeft) && 3251d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed SkScalarNearlyEqual(a.fTop, b.fTop) && 3252d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed SkScalarNearlyEqual(a.fRight, b.fRight) && 3253d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed SkScalarNearlyEqual(a.fBottom, b.fBottom); 3254d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed} 3255d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed 3256a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_arcTo(skiatest::Reporter* reporter) { 3257a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3258a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(0, 0, 1, 2, 1); 3259a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 0, 0); 3260a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 1, 2, 1); 3261a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3262a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 3, 4, 0); 3263a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3264a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 2, 0, 0, 1); 3265a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 1, 2); 3266a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 0, 1, 1, 1); 3267a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pt; 3268a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt.fX == 1 && pt.fY == 1); 3269a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3270a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(1, 0, 1, -1, 1); 3271a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt.fX == 1 && pt.fY == -1); 3272a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3273a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect oval = {1, 2, 3, 4}; 3274a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 0, 0, true); 3275a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3276a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 0, 0, false); 3277a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3278a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 360, 0, true); 3279a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3280a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(oval, 360, 0, false); 3281a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_move_and_reset(reporter, &p, oval.fRight, oval.centerY()); 3282d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed 3283a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (float sweep = 359, delta = 0.5f; sweep != (float) (sweep + delta); ) { 32844b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org p.arcTo(oval, 0, sweep, false); 3285d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed REPORTER_ASSERT(reporter, nearly_equal(p.getBounds(), oval)); 3286a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org sweep += delta; 3287a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org delta /= 2; 3288a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3289a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (float sweep = 361, delta = 0.5f; sweep != (float) (sweep - delta);) { 32904b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org p.arcTo(oval, 0, sweep, false); 3291d5d27d9b146731b871b1bcc6d6de36fba2d5ea44reed REPORTER_ASSERT(reporter, nearly_equal(p.getBounds(), oval)); 3292a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org sweep -= delta; 3293a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org delta /= 2; 3294a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3295a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect noOvalWidth = {1, 2, 0, 3}; 3296a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3297a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(noOvalWidth, 0, 360, false); 3298a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3299a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3300a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect noOvalHeight = {1, 2, 3, 1}; 3301a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3302a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.arcTo(noOvalHeight, 0, 360, false); 3303a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.isEmpty()); 3304a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3305a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3306a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_addPath(skiatest::Reporter* reporter) { 3307a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p, q; 3308a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(1, 2); 3309a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.moveTo(4, 4); 3310a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.lineTo(7, 8); 3311a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.conicTo(8, 7, 6, 5, 0.5f); 3312a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.quadTo(6, 7, 8, 6); 3313a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.cubicTo(5, 6, 7, 8, 7, 5); 3314a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.close(); 3315a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.addPath(q, -4, -4); 3316a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect expected = {0, 0, 4, 4}; 3317a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == expected); 3318a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3319a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reverseAddPath(q); 3320a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect reverseExpected = {4, 4, 8, 8}; 3321a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == reverseExpected); 3322a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3323a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 332414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_addPathMode(skiatest::Reporter* reporter, bool explicitMoveTo, bool extend) { 332514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q; 332614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org if (explicitMoveTo) { 332714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(1, 1); 332814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org } 332914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(1, 2); 333014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org if (explicitMoveTo) { 333114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.moveTo(2, 1); 333214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org } 333314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.lineTo(2, 2); 333414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(q, extend ? SkPath::kExtend_AddPathMode : SkPath::kAppend_AddPathMode); 333514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org uint8_t verbs[4]; 333614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org int verbcount = p.getVerbs(verbs, 4); 333714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbcount == 4); 333814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[0] == SkPath::kMove_Verb); 333914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[1] == SkPath::kLine_Verb); 334014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[2] == (extend ? SkPath::kLine_Verb : SkPath::kMove_Verb)); 334114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[3] == SkPath::kLine_Verb); 334214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org} 334314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 334414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_extendClosedPath(skiatest::Reporter* reporter) { 334514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q; 334614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(1, 1); 334714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(1, 2); 334814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(2, 2); 334914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.close(); 335014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.moveTo(2, 1); 335114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.lineTo(2, 3); 335214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(q, SkPath::kExtend_AddPathMode); 335314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org uint8_t verbs[7]; 335414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org int verbcount = p.getVerbs(verbs, 7); 335514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbcount == 7); 335614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[0] == SkPath::kMove_Verb); 335714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[1] == SkPath::kLine_Verb); 335814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[2] == SkPath::kLine_Verb); 335914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[3] == SkPath::kClose_Verb); 336014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[4] == SkPath::kMove_Verb); 336114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[5] == SkPath::kLine_Verb); 336214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, verbs[6] == SkPath::kLine_Verb); 336314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 336414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPoint pt; 336514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt)); 336614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(2, 3)); 336714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, p.getPoint(3) == SkPoint::Make(1, 1)); 336814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org} 336914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 337014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.orgstatic void test_addEmptyPath(skiatest::Reporter* reporter, SkPath::AddPathMode mode) { 337114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org SkPath p, q, r; 337214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 1: dst is empty 337314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.moveTo(2, 1); 337414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.lineTo(2, 3); 337514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.addPath(p, mode); 337614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q == p); 337714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 2: src is empty 337814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org p.addPath(r, mode); 337914747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q == p); 338014747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org // case 3: src and dst are empty 338114747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.reset(); 338214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org q.addPath(r, mode); 338314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org REPORTER_ASSERT(reporter, q.isEmpty()); 3384877c44956dceff038c0e315c8d311b0d581f2680skia.committer@gmail.com} 338514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org 3386a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_conicTo_special_case(skiatest::Reporter* reporter) { 3387a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3388a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, -1); 3389a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_and_reset(reporter, &p, 3, 4); 3390a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, SK_ScalarInfinity); 3391a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line_pair_and_reset(reporter, &p, 1, 2, 3, 4); 3392a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(1, 2, 3, 4, 1); 3393a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_quad_and_reset(reporter, &p, 1, 2, 3, 4); 3394a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3395a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3396a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_get_point(skiatest::Reporter* reporter) { 3397a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3398a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPoint pt = p.getPoint(0); 3399a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(0, 0)); 3400a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.getLastPt(NULL)); 3401a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.getLastPt(&pt) && pt == SkPoint::Make(0, 0)); 3402a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setLastPt(10, 10); 3403a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org pt = p.getPoint(0); 3404a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, pt == SkPoint::Make(10, 10)); 3405a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(NULL)); 3406a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.rMoveTo(10, 10); 3407a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getLastPt(&pt) && pt == SkPoint::Make(20, 20)); 3408a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3409a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3410a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_contains(skiatest::Reporter* reporter) { 3411a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p; 3412a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kInverseWinding_FillType); 3413a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(0, 0)); 3414a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kWinding_FillType); 3415a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(0, 0)); 3416a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3417a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(6, 8); 3418a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(8, 4); 3419a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test quick reject 3420a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4, 0)); 3421a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(0, 4)); 3422a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4, 10)); 3423a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(10, 4)); 3424a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test various crossings in x 3425a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(5, 7)); 3426a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(6, 7)); 3427a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 7)); 3428a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3429a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3430a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(8, 6); 3431a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(4, 8); 3432a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test various crossings in y 3433a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 5)); 3434a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(7, 6)); 3435a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(7, 7)); 3436a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test quads 3437a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3438a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3439a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(6, 6, 8, 8); 3440a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(6, 8, 4, 8); 3441a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(4, 6, 4, 4); 3442a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3443a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 3444a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3445a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3446a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(6, 6); 3447a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(8, 8, 6, 8); 3448a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(4, 8, 4, 6); 3449a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.quadTo(4, 4, 6, 6); 3450a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3451a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 3452a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3453a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#define CONIC_CONTAINS_BUG_FIXED 0 3454a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#if CONIC_CONTAINS_BUG_FIXED 3455a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3456a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(4, 4); 3457a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(6, 6, 8, 8, 0.5f); 3458a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(6, 8, 4, 8, 0.5f); 3459a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.conicTo(4, 6, 4, 4, 0.5f); 3460a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5, 6)); 3461a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(6, 5)); 3462a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org#endif 3463a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3464a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // test cubics 3465a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-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}}; 3466a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org for (int i = 0; i < 3; ++i) { 3467a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reset(); 3468a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.setFillType(SkPath::kEvenOdd_FillType); 3469a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.moveTo(pts[i].fX, pts[i].fY); 3470a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-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); 3471a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-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); 3472a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.close(); 3473a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.contains(5.5f, 5.5f)); 3474a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, !p.contains(4.5f, 5.5f)); 3475a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3476a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3477a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 34780efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.comclass PathRefTest_Private { 34790efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.compublic: 34800efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com static void TestPathRef(skiatest::Reporter* reporter) { 34810efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com static const int kRepeatCnt = 10; 34826b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 34830efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com SkAutoTUnref<SkPathRef> pathRef(SkNEW(SkPathRef)); 34846b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 34850efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com SkPathRef::Editor ed(&pathRef); 34866b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 34870efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 34880efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kMove_Verb, kRepeatCnt); 34890efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 34900efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countPoints()); 34910efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 0 == pathRef->getSegmentMasks()); 34920efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 34930efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kMove_Verb == pathRef->atVerb(i)); 34940efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 34950efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 34966b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 34976b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 34980efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 34990efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kLine_Verb, kRepeatCnt); 35000efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 35010efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countPoints()); 35020efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kLine_SegmentMask == pathRef->getSegmentMasks()); 35030efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 35040efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == pathRef->atVerb(i)); 35050efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 35060efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 35076b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 35086b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 35090efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 35100efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kQuad_Verb, kRepeatCnt); 35110efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 35120efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 2*kRepeatCnt == pathRef->countPoints()); 35130efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kQuad_SegmentMask == pathRef->getSegmentMasks()); 35140efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 35150efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kQuad_Verb == pathRef->atVerb(i)); 35160efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 35170efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 35186b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 35196b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 35200efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 35210efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com SkScalar* weights = NULL; 35220efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kConic_Verb, kRepeatCnt, &weights); 35230efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 35240efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 2*kRepeatCnt == pathRef->countPoints()); 35250efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countWeights()); 35260efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kConic_SegmentMask == pathRef->getSegmentMasks()); 352749f085dddff10473b6ebf832a974288300224e60bsalomon REPORTER_ASSERT(reporter, weights); 35280efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 35290efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kConic_Verb == pathRef->atVerb(i)); 35300efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 35310efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 35326b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 35336b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 35340efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com { 35350efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.growForRepeatedVerb(SkPath::kCubic_Verb, kRepeatCnt); 35360efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, kRepeatCnt == pathRef->countVerbs()); 35370efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, 3*kRepeatCnt == pathRef->countPoints()); 35380efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kCubic_SegmentMask == pathRef->getSegmentMasks()); 35390efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com for (int i = 0; i < kRepeatCnt; ++i) { 35400efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com REPORTER_ASSERT(reporter, SkPath::kCubic_Verb == pathRef->atVerb(i)); 35410efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com } 35420efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com ed.resetToSize(0, 0, 0); 35436b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 35446b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com } 35450efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com}; 35466b8dbb668f1f069270d35a47cfe98decd059c625robertphillips@google.com 3547a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgstatic void test_operatorEqual(skiatest::Reporter* reporter) { 3548a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath a; 3549a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath b; 3550a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == a); 3551a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3552a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.setFillType(SkPath::kInverseWinding_FillType); 3553a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3554a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3555a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3556a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 1); 3557a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3558a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3559a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3560a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 1); 3561a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org b.lineTo(1, 2); 3562a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a != b); 3563a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.reset(); 3564a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org a.lineTo(1, 2); 3565a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, a == b); 3566a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org} 3567a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 356866a5d8bf13fe98baae268db0211e9c25e5ece7facaryclarkstatic void compare_dump(skiatest::Reporter* reporter, const SkPath& path, bool force, 3569e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark bool dumpAsHex, const char* str) { 357066a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark SkDynamicMemoryWStream wStream; 3571e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark path.dump(&wStream, force, dumpAsHex); 357266a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark SkAutoDataUnref data(wStream.copyToData()); 357366a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark REPORTER_ASSERT(reporter, data->size() == strlen(str)); 3574d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein if (strlen(str) > 0) { 3575d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein REPORTER_ASSERT(reporter, !memcmp(data->data(), str, strlen(str))); 3576d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein } else { 3577d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein REPORTER_ASSERT(reporter, data->data() == NULL || !memcmp(data->data(), str, strlen(str))); 3578d4897591fddf8f2a4860066449fb7dd8b0cc7b77mtklein } 357966a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark} 358066a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark 358166a5d8bf13fe98baae268db0211e9c25e5ece7facaryclarkstatic void test_dump(skiatest::Reporter* reporter) { 358266a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark SkPath p; 3583e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, ""); 3584e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, true, false, ""); 358566a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 358666a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.lineTo(3, 4); 3587e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3588e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(3, 4);\n"); 3589e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, true, false, "path.moveTo(1, 2);\n" 3590e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(3, 4);\n" 3591e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(1, 2);\n" 3592e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.close();\n"); 359366a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.reset(); 359466a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 359566a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.quadTo(3, 4, 5, 6); 3596e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3597e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.quadTo(3, 4, 5, 6);\n"); 359866a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.reset(); 359966a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 360066a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.conicTo(3, 4, 5, 6, 0.5f); 3601e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3602e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.conicTo(3, 4, 5, 6, 0.5f);\n"); 360366a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.reset(); 360466a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.moveTo(1, 2); 360566a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark p.cubicTo(3, 4, 5, 6, 7, 8); 3606e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3607e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.cubicTo(3, 4, 5, 6, 7, 8);\n"); 3608e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.reset(); 3609e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.moveTo(1, 2); 3610e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.lineTo(3, 4); 361108fa28cd31c96b4ebd9cb532539c3a8c88803d90caryclark compare_dump(reporter, p, false, true, 361208fa28cd31c96b4ebd9cb532539c3a8c88803d90caryclark "path.moveTo(SkBits2Float(0x3f800000), SkBits2Float(0x40000000)); // 1, 2\n" 361308fa28cd31c96b4ebd9cb532539c3a8c88803d90caryclark "path.lineTo(SkBits2Float(0x40400000), SkBits2Float(0x40800000)); // 3, 4\n"); 3614e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.reset(); 3615e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.moveTo(SkBits2Float(0x3f800000), SkBits2Float(0x40000000)); 3616e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark p.lineTo(SkBits2Float(0x40400000), SkBits2Float(0x40800000)); 3617e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark compare_dump(reporter, p, false, false, "path.moveTo(1, 2);\n" 3618e956259c5a4f71768afb34ec032eaed49dcbe9f2caryclark "path.lineTo(3, 4);\n"); 361966a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark} 362066a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark 3621a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgclass PathTest_Private { 3622a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.orgpublic: 3623a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org static void TestPathTo(skiatest::Reporter* reporter) { 3624a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath p, q; 3625a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.lineTo(4, 4); 3626a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3627a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line(reporter, &p, 4, 4); 3628a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.moveTo(-4, -4); 3629a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3630a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org check_path_is_line(reporter, &p, 4, 4); 3631a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.lineTo(7, 8); 3632a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.conicTo(8, 7, 6, 5, 0.5f); 3633a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.quadTo(6, 7, 8, 6); 3634a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.cubicTo(5, 6, 7, 8, 7, 5); 3635a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org q.close(); 3636a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.reversePathTo(q); 3637a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkRect reverseExpected = {-4, -4, 8, 8}; 3638a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org REPORTER_ASSERT(reporter, p.getBounds() == reverseExpected); 3639a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org } 3640a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org}; 3641a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 364205ec2233e372cc11ad59b3337c96f0147a44ca29commit-bot@chromium.orgDEF_TEST(Paths, reporter) { 36434e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org test_path_crbug364224(); 36444e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org 3645a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkTSize<SkScalar>::Make(3,4); 3646a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 3647a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkPath p, empty; 3648a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com SkRect bounds, bounds2; 3649a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 36503abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3651d252db03d9650013b545ef9781fe993c07f8f314reed@android.com REPORTER_ASSERT(reporter, p.getBounds().isEmpty()); 365280e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 3653a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this triggers a code path in SkPath::operator= which is otherwise unexercised 3654a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org SkPath& self = p; 3655a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p = self; 3656a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 3657a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // this triggers a code path in SkPath::swap which is otherwise unexercised 3658a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org p.swap(self); 3659a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org 36603abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.set(0, 0, SK_Scalar1, SK_Scalar1); 36616b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com 36626b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.addRoundRect(bounds, SK_Scalar1, SK_Scalar1); 36636b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 366410296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com // we have quads or cubics 3665220f926d9d4b38a9018c922c095847bbd261f583reed REPORTER_ASSERT(reporter, 3666220f926d9d4b38a9018c922c095847bbd261f583reed p.getSegmentMasks() & (kCurveSegmentMask | SkPath::kConic_SegmentMask)); 36674da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 366862047cf1980861234e7367a225928b84ce492c68reed@google.com 36696b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.reset(); 3670a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 367110296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com 36726b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com p.addOval(bounds); 36736b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 36744da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 367562047cf1980861234e7367a225928b84ce492c68reed@google.com 3676a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com p.rewind(); 3677a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com test_empty(reporter, p); 3678a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com 36793abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.addRect(bounds); 36806b82d1adc6a4726e36674e468ff1157e0b75373freed@android.com check_convex_bounds(reporter, p, bounds); 368110296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com // we have only lines 368210296ccb6a63c65b2e60733a929bf15d8bf94309reed@google.com REPORTER_ASSERT(reporter, SkPath::kLine_SegmentMask == p.getSegmentMasks()); 36834da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org REPORTER_ASSERT(reporter, !p.isEmpty()); 36843abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3685a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, p != empty); 3686a5809a3e4cb356387c5201ab9c0a10edf11a01bebungeman@google.com REPORTER_ASSERT(reporter, !(p == empty)); 36873abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3688df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com // do getPoints and getVerbs return the right result 3689df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, p.getPoints(NULL, 0) == 4); 3690df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, p.getVerbs(NULL, 0) == 5); 36913abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com SkPoint pts[4]; 36923abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com int count = p.getPoints(pts, 4); 36933abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, count == 4); 3694df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com uint8_t verbs[6]; 3695df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com verbs[5] = 0xff; 3696df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com p.getVerbs(verbs, 5); 3697df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kMove_Verb == verbs[0]); 3698df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[1]); 3699df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[2]); 3700df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kLine_Verb == verbs[3]); 3701df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, SkPath::kClose_Verb == verbs[4]); 3702df9d656c352928f995abce0a62c4ec3255232a45bsalomon@google.com REPORTER_ASSERT(reporter, 0xff == verbs[5]); 37033abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds2.set(pts, 4); 37043abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, bounds == bounds2); 370580e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 37063abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.offset(SK_Scalar1*3, SK_Scalar1*4); 37073abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.offset(SK_Scalar1*3, SK_Scalar1*4); 3708d252db03d9650013b545ef9781fe993c07f8f314reed@android.com REPORTER_ASSERT(reporter, bounds == p.getBounds()); 37093abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 37103abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isRect(NULL)); 3711f131694617ce0410eafcb01124459382576bb1d9caryclark@google.com bounds2.setEmpty(); 37123abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, p.isRect(&bounds2)); 37133abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, bounds == bounds2); 371480e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 37153abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com // now force p to not be a rect 37163abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com bounds.set(0, 0, SK_Scalar1/2, SK_Scalar1/2); 37173abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com p.addRect(bounds); 37183abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com REPORTER_ASSERT(reporter, !p.isRect(NULL)); 37193abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com 3720fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips // Test an edge case w.r.t. the bound returned by isRect (i.e., the 3721fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips // path has a trailing moveTo. Please see crbug.com\445368) 3722fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips { 3723fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips SkRect r; 3724fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips p.reset(); 3725fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips p.addRect(bounds); 3726fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, p.isRect(&r)); 3727fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, r == bounds); 3728fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips // add a moveTo outside of our bounds 3729fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips p.moveTo(bounds.fLeft + 10, bounds.fBottom + 10); 3730fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, p.isRect(&r)); 3731fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips REPORTER_ASSERT(reporter, r == bounds); 3732fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips } 3733fe7c427e3d1c2c98bce7a3fa0ae6b5864527f169robertphillips 3734a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_operatorEqual(reporter); 37357e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com test_isLine(reporter); 37367e6c4d16010550ee148f1c79cf088c0320fed5c1reed@google.com test_isRect(reporter); 373795bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark test_isNestedFillRects(reporter); 37384da06ab3351f2a96f9216d96106db33a77b19644schenney@chromium.org test_zero_length_paths(reporter); 3739cabaf1daf3fdcc151c12d59b05bdbe136c178b3breed@google.com test_direction(reporter); 374004863fa14a44ddf85acbc6268690ebc3f0d1d6dbreed@google.com test_convexity(reporter); 37417c42481c9d3f6c71f78cc1fc1d1cb7ac18df2d1breed@google.com test_convexity2(reporter); 37429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com test_conservativelyContains(reporter); 3743b3b8dfa31326c51dab8b5ed569e19ee715582d1bbsalomon@google.com test_close(reporter); 37446630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_segment_masks(reporter); 374553effc5e327749ea47bc0c678cb45246644600b0reed@google.com test_flattening(reporter); 374653effc5e327749ea47bc0c678cb45246644600b0reed@google.com test_transform(reporter); 37473563c9ee527f524d421964b54d9b09e12ec0bf6breed@google.com test_bounds(reporter); 37486630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_iter(reporter); 37496630d8d8ea7a897a18e3d950bab9fa40f065804aschenney@chromium.org test_raw_iter(reporter); 37506aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_circle(reporter); 37516aa2965ca814dd3329b65398b5c5af980e54b101bsalomon@google.com test_oval(reporter); 37528b06f1a7ff6d5a59387a90433064550de20787eereed@google.com test_strokerec(reporter); 3753744fabad474e3e111e7cbd8609cf7e209df17f32reed@google.com test_addPoly(reporter); 37540bb18bb264b26afca45452910437c09445e23a3creed@google.com test_isfinite(reporter); 3755ed02c4d05e3f2ed86dbf4276a69827ab23810598tomhudson@google.com test_isfinite_after_transform(reporter); 3756b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com test_arb_round_rect_is_convex(reporter); 3757158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com test_arb_zero_rad_round_rect_is_rect(reporter); 3758a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_addrect(reporter); 3759a8790debaab6c5e3b6a4a51d2cc91ae5aea9b2ddreed@google.com test_addrect_isfinite(reporter); 376054f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_tricky_cubic(); 376154f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_clipped_cubic(); 376254f0d1b7113cb0dc184e522539aab1030a28a421sugoi@google.com test_crbug_170666(); 37637a90daf25878a7459ba9fbda581bb97cda034f02reed@google.com test_bad_cubic_crbug229478(); 37643eff3592acfa6c7b6d4e85c91f0a200eddb09db7reed@google.com test_bad_cubic_crbug234190(); 37651ab9f737f000e530f0c7713c8fad282f39e26efecommit-bot@chromium.org test_gen_id(reporter); 37669d54aeb8a192845f1f8122dba780d40ee6a0de1bcommit-bot@chromium.org test_path_close_issue1474(reporter); 3767b58ba8912ab1a372eb60ab111f477b915eb3da4dreed@google.com test_path_to_region(reporter); 376842feaaf0a5fbb508b237d5c844c484a1a3b0c865commit-bot@chromium.org test_rrect(reporter); 3769a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_arc(reporter); 3770a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_arcTo(reporter); 3771a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_addPath(reporter); 377214747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, false, false); 377314747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, true, false); 377414747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, false, true); 377514747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addPathMode(reporter, true, true); 377614747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_extendClosedPath(reporter); 377714747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addEmptyPath(reporter, SkPath::kExtend_AddPathMode); 377814747e58f8127a6d6b3c748bf0642b0d6a3a79e8commit-bot@chromium.org test_addEmptyPath(reporter, SkPath::kAppend_AddPathMode); 3779a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_conicTo_special_case(reporter); 3780a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_get_point(reporter); 3781a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org test_contains(reporter); 3782a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org PathTest_Private::TestPathTo(reporter); 37830efb21bd1cd359b732a59753f3c1da096aab561arobertphillips@google.com PathRefTest_Private::TestPathRef(reporter); 378466a5d8bf13fe98baae268db0211e9c25e5ece7facaryclark test_dump(reporter); 3785b421650e13faa2b77d29b018e78ab07ff693ca32caryclark test_path_crbug389050(reporter); 3786fac4e0e83666ab59373169d6c157d3654cb479a3piotaixr test_path_crbugskia2820(reporter); 37875ccef577902ce1aefa05fb8107ad5d0aba848e7dcaryclark test_skbug_3469(reporter); 37885bcbe91304ec2515208b5218517579f48874e928reed test_skbug_3239(reporter); 37893abec1d7c38e9bd786fc6057f9608f3eeec98c86reed@android.com} 3790