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