169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com/* 369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com * Copyright 2011 Google Inc. 469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com * 569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com * found in the LICENSE file. 769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com */ 869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com#include "gm.h" 969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com#include "SkRandom.h" 1069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com#include "SkTArray.h" 1169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 122ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.orgclass SkDoOnce : SkNoncopyable { 13d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.compublic: 142ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.org SkDoOnce() { fDidOnce = false; } 15d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 16d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com bool needToDo() const { return !fDidOnce; } 17d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com bool alreadyDone() const { return fDidOnce; } 18d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com void accomplished() { 19d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com SkASSERT(!fDidOnce); 20d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com fDidOnce = true; 21d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com } 22d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com 23d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.comprivate: 24d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com bool fDidOnce; 25d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com}; 26d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com 2769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.comnamespace skiagm { 2869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 2969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.comclass ConvexPathsGM : public GM { 302ab1ba055536825552d6b49f0210c4e1531f02f0commit-bot@chromium.org SkDoOnce fOnce; 3169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.compublic: 3269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com ConvexPathsGM() { 3372b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com this->setBGColor(0xFF000000); 3469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com } 3569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 3669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.comprotected: 37a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 38a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 39a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 40a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 4169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com virtual SkString onShortName() { 4269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com return SkString("convexpaths"); 4369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com } 4469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 4569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 4669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com virtual SkISize onISize() { 47f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(1200, 1100); 4869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com } 4969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 5069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com void makePaths() { 51d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com if (fOnce.alreadyDone()) { 52d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com return; 53d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com } 54d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com fOnce.accomplished(); 55fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 56278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com fPaths.push_back().moveTo(0, 0); 57278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1, 58278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com 0, 100 * SK_Scalar1); 59278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com fPaths.back().lineTo(0, 0); 60278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com 61278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com fPaths.push_back().moveTo(0, 50 * SK_Scalar1); 62278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com fPaths.back().quadTo(50 * SK_Scalar1, 0, 63278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com 100 * SK_Scalar1, 50 * SK_Scalar1); 64278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1, 65278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com 0, 50 * SK_Scalar1); 66278dc6929b6481204874dcfcc055e2aaa30a95b2bsalomon@google.com 6769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().addRect(0, 0, 6869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 100 * SK_Scalar1, 100 * SK_Scalar1, 6969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkPath::kCW_Direction); 7069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 7169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().addRect(0, 0, 7269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 100 * SK_Scalar1, 100 * SK_Scalar1, 7369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkPath::kCCW_Direction); 7469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 7569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1, 7669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 50 * SK_Scalar1, SkPath::kCW_Direction); 7769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 7869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 7969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 8069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 50 * SK_Scalar1, 8169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 100 * SK_Scalar1), 8269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkPath::kCW_Direction); 8369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 8469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 8569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 100 * SK_Scalar1, 8669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 5 * SK_Scalar1), 8769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkPath::kCCW_Direction); 8869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 8969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 9069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SK_Scalar1, 9169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 100 * SK_Scalar1), 92fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org SkPath::kCCW_Direction); 9369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 9469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0, 9569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SK_Scalar1 * 100, 9669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SK_Scalar1 * 100), 9769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 40 * SK_Scalar1, 20 * SK_Scalar1, 9869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkPath::kCW_Direction); 9969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 1007d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com // large number of points 1017d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com enum { 1027d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com kLength = 100, 1037d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com kPtsPerSide = (1 << 12), 1047d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com }; 1057d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com fPaths.push_back().moveTo(0, 0); 1067d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com for (int i = 1; i < kPtsPerSide; ++i) { // skip the first point due to moveTo. 1077d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, 0); 1087d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com } 1097d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com for (int i = 0; i < kPtsPerSide; ++i) { 1107d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com fPaths.back().lineTo(kLength, kLength * SkIntToScalar(i) / kPtsPerSide); 1117d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com } 1127d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com for (int i = kPtsPerSide; i > 0; --i) { 1137d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, kLength); 1147d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com } 1157d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com for (int i = kPtsPerSide; i > 0; --i) { 1167d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com fPaths.back().lineTo(0, kLength * SkIntToScalar(i) / kPtsPerSide); 1177d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com } 1187d9ffc8a04533d0207efe5511b587e89ecb9d898bsalomon@google.com 11972b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com // shallow diagonals 12072b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1); 12172b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1); 12272b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1); 1239732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com 124fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0, 125fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 50 * SK_Scalar1, 126fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 100 * SK_Scalar1), 127fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 25 * SK_Scalar1, 130 * SK_Scalar1, false); 128d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 12972b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com // cubics 13072b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1, 13172b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com 10 * SK_Scalar1, 90 * SK_Scalar1, 13272b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com 0 * SK_Scalar1, 100 * SK_Scalar1); 13372b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1, 13472b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com 20 * SK_Scalar1, 100 * SK_Scalar1, 13572b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com 0 * SK_Scalar1, 0 * SK_Scalar1); 136d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 137a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com // path that has a cubic with a repeated first control point and 138a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com // a repeated last control point. 139a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.push_back().moveTo(SK_Scalar1 * 10, SK_Scalar1 * 10); 140a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.back().cubicTo(10 * SK_Scalar1, 10 * SK_Scalar1, 141a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 10 * SK_Scalar1, 0, 142a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 20 * SK_Scalar1, 0); 143a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.back().lineTo(40 * SK_Scalar1, 0); 144a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.back().cubicTo(40 * SK_Scalar1, 0, 145a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 50 * SK_Scalar1, 0, 146a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 50 * SK_Scalar1, 10 * SK_Scalar1); 147a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 148a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com // path that has two cubics with repeated middle control points. 149a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.push_back().moveTo(SK_Scalar1 * 10, SK_Scalar1 * 10); 150a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.back().cubicTo(10 * SK_Scalar1, 0, 151a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 10 * SK_Scalar1, 0, 152a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 20 * SK_Scalar1, 0); 153a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.back().lineTo(40 * SK_Scalar1, 0); 154a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com fPaths.back().cubicTo(50 * SK_Scalar1, 0, 155a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 50 * SK_Scalar1, 0, 156a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 50 * SK_Scalar1, 10 * SK_Scalar1); 157a51ab8416db9772a2eae3122f4f69801642daeb5bsalomon@google.com 15854ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com // cubic where last three points are almost a line 15954ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.push_back().moveTo(0, 228 * SK_Scalar1 / 8); 16054ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.back().cubicTo(628 * SK_Scalar1 / 8, 82 * SK_Scalar1 / 8, 16154ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 1255 * SK_Scalar1 / 8, 141 * SK_Scalar1 / 8, 16254ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 1883 * SK_Scalar1 / 8, 202 * SK_Scalar1 / 8); 16354ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 16454ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com // flat cubic where the at end point tangents both point outward. 16554ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.push_back().moveTo(10 * SK_Scalar1, 0); 16654ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.back().cubicTo(0, SK_Scalar1, 16754ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 30 * SK_Scalar1, SK_Scalar1, 16854ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 20 * SK_Scalar1, 0); 16954ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 17054ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com // flat cubic where initial tangent is in, end tangent out 17154ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.push_back().moveTo(0, 0 * SK_Scalar1); 17254ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.back().cubicTo(10 * SK_Scalar1, SK_Scalar1, 17354ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 30 * SK_Scalar1, SK_Scalar1, 17454ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 20 * SK_Scalar1, 0); 17554ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 17654ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com // flat cubic where initial tangent is out, end tangent in 17754ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.push_back().moveTo(10 * SK_Scalar1, 0); 17854ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com fPaths.back().cubicTo(0, SK_Scalar1, 17954ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 20 * SK_Scalar1, SK_Scalar1, 18054ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 30 * SK_Scalar1, 0); 18154ad851361c55466f1e4950585afc2aa6cf173c5bsalomon@google.com 182dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com // triangle where one edge is a degenerate quad 1834b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fPaths.push_back().moveTo(8.59375f, 45 * SK_Scalar1); 1844b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fPaths.back().quadTo(16.9921875f, 45 * SK_Scalar1, 1854b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 31.25f, 45 * SK_Scalar1); 186dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com fPaths.back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1); 1874b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fPaths.back().lineTo(8.59375f, 45 * SK_Scalar1); 188dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com 189fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // triangle where one edge is a quad with a repeated point 190fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.push_back().moveTo(0, 25 * SK_Scalar1); 191fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().lineTo(50 * SK_Scalar1, 0); 192fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1); 193fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 194fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // triangle where one edge is a cubic with a 2x repeated point 195fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.push_back().moveTo(0, 25 * SK_Scalar1); 196fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().lineTo(50 * SK_Scalar1, 0); 197fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().cubicTo(50 * SK_Scalar1, 0, 198fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 50 * SK_Scalar1, 50 * SK_Scalar1, 199fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 50 * SK_Scalar1, 50 * SK_Scalar1); 200fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 201fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // triangle where one edge is a quad with a nearly repeated point 202fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.push_back().moveTo(0, 25 * SK_Scalar1); 203fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().lineTo(50 * SK_Scalar1, 0); 2044b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fPaths.back().quadTo(50 * SK_Scalar1, 49.95f, 205fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 50 * SK_Scalar1, 50 * SK_Scalar1); 206fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 207fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // triangle where one edge is a cubic with a 3x nearly repeated point 208fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.push_back().moveTo(0, 25 * SK_Scalar1); 209fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().lineTo(50 * SK_Scalar1, 0); 2104b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fPaths.back().cubicTo(50 * SK_Scalar1, 49.95f, 2114b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 50 * SK_Scalar1, 49.97f, 212fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 50 * SK_Scalar1, 50 * SK_Scalar1); 213fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 214fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // triangle where there is a point degenerate cubic at one corner 215fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.push_back().moveTo(0, 25 * SK_Scalar1); 216fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().lineTo(50 * SK_Scalar1, 0); 217fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1); 218fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1, 219fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 50 * SK_Scalar1, 50 * SK_Scalar1, 220fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 50 * SK_Scalar1, 50 * SK_Scalar1); 221fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 222fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // point line 2235cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 2245cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1); 225d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 226fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // point quad 2275cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 2285cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 2295cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com 50 * SK_Scalar1, 50 * SK_Scalar1); 230fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 231fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // point cubic 2325cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 2335cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1, 2345cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com 50 * SK_Scalar1, 50 * SK_Scalar1, 2355cc90d132220a69c1d5734178d851f9c7cd57f16bsalomon@google.com 50 * SK_Scalar1, 50 * SK_Scalar1); 236dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com 2379732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com // moveTo only paths 2389732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com fPaths.push_back().moveTo(0, 0); 2399732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com fPaths.back().moveTo(0, 0); 2409732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com fPaths.back().moveTo(SK_Scalar1, SK_Scalar1); 2419732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com fPaths.back().moveTo(SK_Scalar1, SK_Scalar1); 2429732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com fPaths.back().moveTo(10 * SK_Scalar1, 10 * SK_Scalar1); 2439732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com 2449732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com fPaths.push_back().moveTo(0, 0); 2459732f62eaec427e0d4a8de06748ebb59450dfe31bsalomon@google.com fPaths.back().moveTo(0, 0); 24669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 24769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com // line degenerate 24869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1); 24969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0); 25069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 25169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 50 * SK_Scalar1, 50 * SK_Scalar1); 25269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 25369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 100 * SK_Scalar1, 100 * SK_Scalar1); 25469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com fPaths.push_back().cubicTo(0, 0, 25569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 0, 0, 25669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 100 * SK_Scalar1, 100 * SK_Scalar1); 2575b56d9e43fee4393f25f41d400981ce3960cd1aabsalomon@google.com 2585b56d9e43fee4393f25f41d400981ce3960cd1aabsalomon@google.com // small circle. This is listed last so that it has device coords far 2595b56d9e43fee4393f25f41d400981ce3960cd1aabsalomon@google.com // from the origin (small area relative to x,y values). 2604b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fPaths.push_back().addCircle(0, 0, 1.2f); 26169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com } 26269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 26369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com virtual void onDraw(SkCanvas* canvas) { 264d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com this->makePaths(); 26569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 26669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkPaint paint; 26769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com paint.setAntiAlias(true); 268e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkLCGRandom rand; 26969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1); 270fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 271fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org // As we've added more paths this has gotten pretty big. Scale the whole thing down. 272fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org canvas->scale(2 * SK_Scalar1 / 3, 2 * SK_Scalar1 / 3); 273fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org 27472b55be3f3448287e8ff6fe83633edadfb60f59absalomon@google.com for (int i = 0; i < fPaths.count(); ++i) { 27569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com canvas->save(); 27669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com // position the path, and make it at off-integer coords. 277fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 10, 278fdfbb9d5f0d29cb4a956a693c499653f87f04ac4commit-bot@chromium.org SK_Scalar1 * 200 * (i / 5) + 9 * SK_Scalar1 / 10); 27969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkColor color = rand.nextU(); 28069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com color |= 0xff000000; 28169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com paint.setColor(color); 28244d662b86a504c1815ba0b73a3b83b599db2eed2bsalomon@google.com#if 0 // This hitting on 32bit Linux builds for some paths. Temporarily disabling while it is 28344d662b86a504c1815ba0b73a3b83b599db2eed2bsalomon@google.com // debugged. 28469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkASSERT(fPaths[i].isConvex()); 28544d662b86a504c1815ba0b73a3b83b599db2eed2bsalomon@google.com#endif 28669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com canvas->drawPath(fPaths[i], paint); 28769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com canvas->restore(); 28869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com } 28969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com } 290d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 29169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.comprivate: 29269cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com typedef GM INHERITED; 29369cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com SkTArray<SkPath> fPaths; 29469cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com}; 29569cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 29669cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com////////////////////////////////////////////////////////////////////////////// 29769cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 29869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.comstatic GM* MyFactory(void*) { return new ConvexPathsGM; } 29969cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.comstatic GMRegistry reg(MyFactory); 30069cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com 30169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com} 302