| 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);
|
| +
|
| +}
|
|
|