Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: gm/convexpaths.cpp

Issue 23576015: Change old PRG to be SkLCGRandom; change new one to SkRandom (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Fix some spurious SkMWCRandoms Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gm/complexclip2.cpp ('k') | gm/cubicpaths.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gm/convexpaths.cpp
diff --git a/gm/convexpaths.cpp b/gm/convexpaths.cpp
index 668e01c0a7dcdec992b79be6b3aa7b5a318a667a..6b4ac201289f8149da58c14cf12e23b65bcb0abf 100644
--- a/gm/convexpaths.cpp
+++ b/gm/convexpaths.cpp
@@ -1,297 +1,297 @@
-
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-#include "gm.h"
-#include "SkRandom.h"
-#include "SkTArray.h"
-
-class SkOnce : SkNoncopyable {
-public:
- SkOnce() { fDidOnce = false; }
-
- bool needToDo() const { return !fDidOnce; }
- bool alreadyDone() const { return fDidOnce; }
- void accomplished() {
- SkASSERT(!fDidOnce);
- fDidOnce = true;
- }
-
-private:
- bool fDidOnce;
-};
-
-namespace skiagm {
-
-class ConvexPathsGM : public GM {
- SkOnce fOnce;
-public:
- ConvexPathsGM() {
- this->setBGColor(0xFF000000);
- }
-
-protected:
- virtual SkString onShortName() {
- return SkString("convexpaths");
- }
-
-
- virtual SkISize onISize() {
- return make_isize(1200, 1100);
- }
-
- void makePaths() {
- if (fOnce.alreadyDone()) {
- return;
- }
- fOnce.accomplished();
-
- fPaths.push_back().moveTo(0, 0);
- fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
- 0, 100 * SK_Scalar1);
- fPaths.back().lineTo(0, 0);
-
- fPaths.push_back().moveTo(0, 50 * SK_Scalar1);
- fPaths.back().quadTo(50 * SK_Scalar1, 0,
- 100 * SK_Scalar1, 50 * SK_Scalar1);
- fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
- 0, 50 * SK_Scalar1);
-
- fPaths.push_back().addRect(0, 0,
- 100 * SK_Scalar1, 100 * SK_Scalar1,
- SkPath::kCW_Direction);
-
- fPaths.push_back().addRect(0, 0,
- 100 * SK_Scalar1, 100 * SK_Scalar1,
- SkPath::kCCW_Direction);
-
- fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1,
- 50 * SK_Scalar1, SkPath::kCW_Direction);
-
-
- fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
- 50 * SK_Scalar1,
- 100 * SK_Scalar1),
- SkPath::kCW_Direction);
-
- fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
- 100 * SK_Scalar1,
- 5 * SK_Scalar1),
- SkPath::kCCW_Direction);
-
- fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
- SK_Scalar1,
- 100 * SK_Scalar1),
- SkPath::kCCW_Direction);
-
- fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
- SK_Scalar1 * 100,
- SK_Scalar1 * 100),
- 40 * SK_Scalar1, 20 * SK_Scalar1,
- SkPath::kCW_Direction);
-
- // large number of points
- enum {
- kLength = 100,
- kPtsPerSide = (1 << 12),
- };
- fPaths.push_back().moveTo(0, 0);
- for (int i = 1; i < kPtsPerSide; ++i) { // skip the first point due to moveTo.
- fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, 0);
- }
- for (int i = 0; i < kPtsPerSide; ++i) {
- fPaths.back().lineTo(kLength, kLength * SkIntToScalar(i) / kPtsPerSide);
- }
- for (int i = kPtsPerSide; i > 0; --i) {
- fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, kLength);
- }
- for (int i = kPtsPerSide; i > 0; --i) {
- fPaths.back().lineTo(0, kLength * SkIntToScalar(i) / kPtsPerSide);
- }
-
- // shallow diagonals
- fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1);
- fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1);
- fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1);
-
- fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
- 50 * SK_Scalar1,
- 100 * SK_Scalar1),
- 25 * SK_Scalar1, 130 * SK_Scalar1, false);
-
- // cubics
- fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1,
- 10 * SK_Scalar1, 90 * SK_Scalar1,
- 0 * SK_Scalar1, 100 * SK_Scalar1);
- fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1,
- 20 * SK_Scalar1, 100 * SK_Scalar1,
- 0 * SK_Scalar1, 0 * SK_Scalar1);
-
- // path that has a cubic with a repeated first control point and
- // a repeated last control point.
- fPaths.push_back().moveTo(SK_Scalar1 * 10, SK_Scalar1 * 10);
- fPaths.back().cubicTo(10 * SK_Scalar1, 10 * SK_Scalar1,
- 10 * SK_Scalar1, 0,
- 20 * SK_Scalar1, 0);
- fPaths.back().lineTo(40 * SK_Scalar1, 0);
- fPaths.back().cubicTo(40 * SK_Scalar1, 0,
- 50 * SK_Scalar1, 0,
- 50 * SK_Scalar1, 10 * SK_Scalar1);
-
- // path that has two cubics with repeated middle control points.
- fPaths.push_back().moveTo(SK_Scalar1 * 10, SK_Scalar1 * 10);
- fPaths.back().cubicTo(10 * SK_Scalar1, 0,
- 10 * SK_Scalar1, 0,
- 20 * SK_Scalar1, 0);
- fPaths.back().lineTo(40 * SK_Scalar1, 0);
- fPaths.back().cubicTo(50 * SK_Scalar1, 0,
- 50 * SK_Scalar1, 0,
- 50 * SK_Scalar1, 10 * SK_Scalar1);
-
- // cubic where last three points are almost a line
- fPaths.push_back().moveTo(0, 228 * SK_Scalar1 / 8);
- fPaths.back().cubicTo(628 * SK_Scalar1 / 8, 82 * SK_Scalar1 / 8,
- 1255 * SK_Scalar1 / 8, 141 * SK_Scalar1 / 8,
- 1883 * SK_Scalar1 / 8, 202 * SK_Scalar1 / 8);
-
- // flat cubic where the at end point tangents both point outward.
- fPaths.push_back().moveTo(10 * SK_Scalar1, 0);
- fPaths.back().cubicTo(0, SK_Scalar1,
- 30 * SK_Scalar1, SK_Scalar1,
- 20 * SK_Scalar1, 0);
-
- // flat cubic where initial tangent is in, end tangent out
- fPaths.push_back().moveTo(0, 0 * SK_Scalar1);
- fPaths.back().cubicTo(10 * SK_Scalar1, SK_Scalar1,
- 30 * SK_Scalar1, SK_Scalar1,
- 20 * SK_Scalar1, 0);
-
- // flat cubic where initial tangent is out, end tangent in
- fPaths.push_back().moveTo(10 * SK_Scalar1, 0);
- fPaths.back().cubicTo(0, SK_Scalar1,
- 20 * SK_Scalar1, SK_Scalar1,
- 30 * SK_Scalar1, 0);
-
- // triangle where one edge is a degenerate quad
- fPaths.push_back().moveTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
- fPaths.back().quadTo(SkFloatToScalar(16.9921875f), 45 * SK_Scalar1,
- SkFloatToScalar(31.25f), 45 * SK_Scalar1);
- fPaths.back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
- fPaths.back().lineTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
-
- // triangle where one edge is a quad with a repeated point
- fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
- fPaths.back().lineTo(50 * SK_Scalar1, 0);
- fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // triangle where one edge is a cubic with a 2x repeated point
- fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
- fPaths.back().lineTo(50 * SK_Scalar1, 0);
- fPaths.back().cubicTo(50 * SK_Scalar1, 0,
- 50 * SK_Scalar1, 50 * SK_Scalar1,
- 50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // triangle where one edge is a quad with a nearly repeated point
- fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
- fPaths.back().lineTo(50 * SK_Scalar1, 0);
- fPaths.back().quadTo(50 * SK_Scalar1, SkFloatToScalar(49.95f),
- 50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // triangle where one edge is a cubic with a 3x nearly repeated point
- fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
- fPaths.back().lineTo(50 * SK_Scalar1, 0);
- fPaths.back().cubicTo(50 * SK_Scalar1, SkFloatToScalar(49.95f),
- 50 * SK_Scalar1, SkFloatToScalar(49.97f),
- 50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // triangle where there is a point degenerate cubic at one corner
- fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
- fPaths.back().lineTo(50 * SK_Scalar1, 0);
- fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
- fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
- 50 * SK_Scalar1, 50 * SK_Scalar1,
- 50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // point line
- fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
- fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // point quad
- fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
- fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
- 50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // point cubic
- fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
- fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
- 50 * SK_Scalar1, 50 * SK_Scalar1,
- 50 * SK_Scalar1, 50 * SK_Scalar1);
-
- // moveTo only paths
- fPaths.push_back().moveTo(0, 0);
- fPaths.back().moveTo(0, 0);
- fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
- fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
- fPaths.back().moveTo(10 * SK_Scalar1, 10 * SK_Scalar1);
-
- fPaths.push_back().moveTo(0, 0);
- fPaths.back().moveTo(0, 0);
-
- // line degenerate
- fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
- fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0);
- fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1,
- 50 * SK_Scalar1, 50 * SK_Scalar1);
- fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
- 100 * SK_Scalar1, 100 * SK_Scalar1);
- fPaths.push_back().cubicTo(0, 0,
- 0, 0,
- 100 * SK_Scalar1, 100 * SK_Scalar1);
-
- // small circle. This is listed last so that it has device coords far
- // from the origin (small area relative to x,y values).
- fPaths.push_back().addCircle(0, 0, SkFloatToScalar(1.2f));
- }
-
- virtual void onDraw(SkCanvas* canvas) {
- this->makePaths();
-
- SkPaint paint;
- paint.setAntiAlias(true);
- SkRandom rand;
- canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
-
- // As we've added more paths this has gotten pretty big. Scale the whole thing down.
- canvas->scale(2 * SK_Scalar1 / 3, 2 * SK_Scalar1 / 3);
-
- for (int i = 0; i < fPaths.count(); ++i) {
- canvas->save();
- // position the path, and make it at off-integer coords.
- canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 10,
- SK_Scalar1 * 200 * (i / 5) + 9 * SK_Scalar1 / 10);
- SkColor color = rand.nextU();
- color |= 0xff000000;
- paint.setColor(color);
-#if 0 // This hitting on 32bit Linux builds for some paths. Temporarily disabling while it is
- // debugged.
- SkASSERT(fPaths[i].isConvex());
-#endif
- canvas->drawPath(fPaths[i], paint);
- canvas->restore();
- }
- }
-
-private:
- typedef GM INHERITED;
- SkTArray<SkPath> fPaths;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-static GM* MyFactory(void*) { return new ConvexPathsGM; }
-static GMRegistry reg(MyFactory);
-
-}
+
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "gm.h"
+#include "SkRandom.h"
+#include "SkTArray.h"
+
+class SkOnce : SkNoncopyable {
+public:
+ SkOnce() { fDidOnce = false; }
+
+ bool needToDo() const { return !fDidOnce; }
+ bool alreadyDone() const { return fDidOnce; }
+ void accomplished() {
+ SkASSERT(!fDidOnce);
+ fDidOnce = true;
+ }
+
+private:
+ bool fDidOnce;
+};
+
+namespace skiagm {
+
+class ConvexPathsGM : public GM {
+ SkOnce fOnce;
+public:
+ ConvexPathsGM() {
+ this->setBGColor(0xFF000000);
+ }
+
+protected:
+ virtual SkString onShortName() {
+ return SkString("convexpaths");
+ }
+
+
+ virtual SkISize onISize() {
+ return make_isize(1200, 1100);
+ }
+
+ void makePaths() {
+ if (fOnce.alreadyDone()) {
+ return;
+ }
+ fOnce.accomplished();
+
+ fPaths.push_back().moveTo(0, 0);
+ fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
+ 0, 100 * SK_Scalar1);
+ fPaths.back().lineTo(0, 0);
+
+ fPaths.push_back().moveTo(0, 50 * SK_Scalar1);
+ fPaths.back().quadTo(50 * SK_Scalar1, 0,
+ 100 * SK_Scalar1, 50 * SK_Scalar1);
+ fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
+ 0, 50 * SK_Scalar1);
+
+ fPaths.push_back().addRect(0, 0,
+ 100 * SK_Scalar1, 100 * SK_Scalar1,
+ SkPath::kCW_Direction);
+
+ fPaths.push_back().addRect(0, 0,
+ 100 * SK_Scalar1, 100 * SK_Scalar1,
+ SkPath::kCCW_Direction);
+
+ fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1,
+ 50 * SK_Scalar1, SkPath::kCW_Direction);
+
+
+ fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
+ 50 * SK_Scalar1,
+ 100 * SK_Scalar1),
+ SkPath::kCW_Direction);
+
+ fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
+ 100 * SK_Scalar1,
+ 5 * SK_Scalar1),
+ SkPath::kCCW_Direction);
+
+ fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
+ SK_Scalar1,
+ 100 * SK_Scalar1),
+ SkPath::kCCW_Direction);
+
+ fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
+ SK_Scalar1 * 100,
+ SK_Scalar1 * 100),
+ 40 * SK_Scalar1, 20 * SK_Scalar1,
+ SkPath::kCW_Direction);
+
+ // large number of points
+ enum {
+ kLength = 100,
+ kPtsPerSide = (1 << 12),
+ };
+ fPaths.push_back().moveTo(0, 0);
+ for (int i = 1; i < kPtsPerSide; ++i) { // skip the first point due to moveTo.
+ fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, 0);
+ }
+ for (int i = 0; i < kPtsPerSide; ++i) {
+ fPaths.back().lineTo(kLength, kLength * SkIntToScalar(i) / kPtsPerSide);
+ }
+ for (int i = kPtsPerSide; i > 0; --i) {
+ fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, kLength);
+ }
+ for (int i = kPtsPerSide; i > 0; --i) {
+ fPaths.back().lineTo(0, kLength * SkIntToScalar(i) / kPtsPerSide);
+ }
+
+ // shallow diagonals
+ fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1);
+ fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1);
+ fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1);
+
+ fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
+ 50 * SK_Scalar1,
+ 100 * SK_Scalar1),
+ 25 * SK_Scalar1, 130 * SK_Scalar1, false);
+
+ // cubics
+ fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1,
+ 10 * SK_Scalar1, 90 * SK_Scalar1,
+ 0 * SK_Scalar1, 100 * SK_Scalar1);
+ fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1,
+ 20 * SK_Scalar1, 100 * SK_Scalar1,
+ 0 * SK_Scalar1, 0 * SK_Scalar1);
+
+ // path that has a cubic with a repeated first control point and
+ // a repeated last control point.
+ fPaths.push_back().moveTo(SK_Scalar1 * 10, SK_Scalar1 * 10);
+ fPaths.back().cubicTo(10 * SK_Scalar1, 10 * SK_Scalar1,
+ 10 * SK_Scalar1, 0,
+ 20 * SK_Scalar1, 0);
+ fPaths.back().lineTo(40 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(40 * SK_Scalar1, 0,
+ 50 * SK_Scalar1, 0,
+ 50 * SK_Scalar1, 10 * SK_Scalar1);
+
+ // path that has two cubics with repeated middle control points.
+ fPaths.push_back().moveTo(SK_Scalar1 * 10, SK_Scalar1 * 10);
+ fPaths.back().cubicTo(10 * SK_Scalar1, 0,
+ 10 * SK_Scalar1, 0,
+ 20 * SK_Scalar1, 0);
+ fPaths.back().lineTo(40 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(50 * SK_Scalar1, 0,
+ 50 * SK_Scalar1, 0,
+ 50 * SK_Scalar1, 10 * SK_Scalar1);
+
+ // cubic where last three points are almost a line
+ fPaths.push_back().moveTo(0, 228 * SK_Scalar1 / 8);
+ fPaths.back().cubicTo(628 * SK_Scalar1 / 8, 82 * SK_Scalar1 / 8,
+ 1255 * SK_Scalar1 / 8, 141 * SK_Scalar1 / 8,
+ 1883 * SK_Scalar1 / 8, 202 * SK_Scalar1 / 8);
+
+ // flat cubic where the at end point tangents both point outward.
+ fPaths.push_back().moveTo(10 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(0, SK_Scalar1,
+ 30 * SK_Scalar1, SK_Scalar1,
+ 20 * SK_Scalar1, 0);
+
+ // flat cubic where initial tangent is in, end tangent out
+ fPaths.push_back().moveTo(0, 0 * SK_Scalar1);
+ fPaths.back().cubicTo(10 * SK_Scalar1, SK_Scalar1,
+ 30 * SK_Scalar1, SK_Scalar1,
+ 20 * SK_Scalar1, 0);
+
+ // flat cubic where initial tangent is out, end tangent in
+ fPaths.push_back().moveTo(10 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(0, SK_Scalar1,
+ 20 * SK_Scalar1, SK_Scalar1,
+ 30 * SK_Scalar1, 0);
+
+ // triangle where one edge is a degenerate quad
+ fPaths.push_back().moveTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
+ fPaths.back().quadTo(SkFloatToScalar(16.9921875f), 45 * SK_Scalar1,
+ SkFloatToScalar(31.25f), 45 * SK_Scalar1);
+ fPaths.back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
+ fPaths.back().lineTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
+
+ // triangle where one edge is a quad with a repeated point
+ fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
+ fPaths.back().lineTo(50 * SK_Scalar1, 0);
+ fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // triangle where one edge is a cubic with a 2x repeated point
+ fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
+ fPaths.back().lineTo(50 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(50 * SK_Scalar1, 0,
+ 50 * SK_Scalar1, 50 * SK_Scalar1,
+ 50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // triangle where one edge is a quad with a nearly repeated point
+ fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
+ fPaths.back().lineTo(50 * SK_Scalar1, 0);
+ fPaths.back().quadTo(50 * SK_Scalar1, SkFloatToScalar(49.95f),
+ 50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // triangle where one edge is a cubic with a 3x nearly repeated point
+ fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
+ fPaths.back().lineTo(50 * SK_Scalar1, 0);
+ fPaths.back().cubicTo(50 * SK_Scalar1, SkFloatToScalar(49.95f),
+ 50 * SK_Scalar1, SkFloatToScalar(49.97f),
+ 50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // triangle where there is a point degenerate cubic at one corner
+ fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
+ fPaths.back().lineTo(50 * SK_Scalar1, 0);
+ fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+ fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
+ 50 * SK_Scalar1, 50 * SK_Scalar1,
+ 50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // point line
+ fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+ fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // point quad
+ fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+ fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
+ 50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // point cubic
+ fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
+ fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
+ 50 * SK_Scalar1, 50 * SK_Scalar1,
+ 50 * SK_Scalar1, 50 * SK_Scalar1);
+
+ // moveTo only paths
+ fPaths.push_back().moveTo(0, 0);
+ fPaths.back().moveTo(0, 0);
+ fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
+ fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
+ fPaths.back().moveTo(10 * SK_Scalar1, 10 * SK_Scalar1);
+
+ fPaths.push_back().moveTo(0, 0);
+ fPaths.back().moveTo(0, 0);
+
+ // line degenerate
+ fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
+ fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0);
+ fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1,
+ 50 * SK_Scalar1, 50 * SK_Scalar1);
+ fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
+ 100 * SK_Scalar1, 100 * SK_Scalar1);
+ fPaths.push_back().cubicTo(0, 0,
+ 0, 0,
+ 100 * SK_Scalar1, 100 * SK_Scalar1);
+
+ // small circle. This is listed last so that it has device coords far
+ // from the origin (small area relative to x,y values).
+ fPaths.push_back().addCircle(0, 0, SkFloatToScalar(1.2f));
+ }
+
+ virtual void onDraw(SkCanvas* canvas) {
+ this->makePaths();
+
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ SkLCGRandom rand;
+ canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
+
+ // As we've added more paths this has gotten pretty big. Scale the whole thing down.
+ canvas->scale(2 * SK_Scalar1 / 3, 2 * SK_Scalar1 / 3);
+
+ for (int i = 0; i < fPaths.count(); ++i) {
+ canvas->save();
+ // position the path, and make it at off-integer coords.
+ canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 10,
+ SK_Scalar1 * 200 * (i / 5) + 9 * SK_Scalar1 / 10);
+ SkColor color = rand.nextU();
+ color |= 0xff000000;
+ paint.setColor(color);
+#if 0 // This hitting on 32bit Linux builds for some paths. Temporarily disabling while it is
+ // debugged.
+ SkASSERT(fPaths[i].isConvex());
+#endif
+ canvas->drawPath(fPaths[i], paint);
+ canvas->restore();
+ }
+ }
+
+private:
+ typedef GM INHERITED;
+ SkTArray<SkPath> fPaths;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+static GM* MyFactory(void*) { return new ConvexPathsGM; }
+static GMRegistry reg(MyFactory);
+
+}
« no previous file with comments | « gm/complexclip2.cpp ('k') | gm/cubicpaths.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698