| Index: gm/degeneratesegments.cpp
|
| diff --git a/gm/degeneratesegments.cpp b/gm/degeneratesegments.cpp
|
| index 2e19d05f7db4c1d109b17492bd309a2f4bc70e3a..219505192c097a7c5a4eac1804c96229ce4c3968 100644
|
| --- a/gm/degeneratesegments.cpp
|
| +++ b/gm/degeneratesegments.cpp
|
| @@ -1,400 +1,400 @@
|
| -/*
|
| - * 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 "SkCanvas.h"
|
| -#include "SkPaint.h"
|
| -#include "SkRandom.h"
|
| -
|
| -namespace skiagm {
|
| -
|
| -class DegenerateSegmentsGM : public GM {
|
| -public:
|
| - DegenerateSegmentsGM() {}
|
| -
|
| -protected:
|
| - struct PathAndName {
|
| - SkPath fPath;
|
| - const char* fName1;
|
| - const char* fName2;
|
| - };
|
| -
|
| - SkString onShortName() {
|
| - return SkString("degeneratesegments");
|
| - }
|
| -
|
| - SkISize onISize() { return make_isize(896, 930); }
|
| -
|
| - typedef SkPoint (*AddSegmentFunc)(SkPath&, SkPoint&);
|
| -
|
| - // We need to use explicit commands here, instead of addPath, because we
|
| - // do not want the moveTo that is added at the beginning of a path to
|
| - // appear in the appended path.
|
| - static SkPoint AddMove(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveClose(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - path.close();
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddDegenLine(SkPath& path, SkPoint& startPt) {
|
| - path.lineTo(startPt);
|
| - return startPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveDegenLine(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - path.lineTo(moveToPt);
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveDegenLineClose(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - path.lineTo(moveToPt);
|
| - path.close();
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddDegenQuad(SkPath& path, SkPoint& startPt) {
|
| - path.quadTo(startPt, startPt);
|
| - return startPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveDegenQuad(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - path.quadTo(moveToPt, moveToPt);
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveDegenQuadClose(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - path.quadTo(moveToPt, moveToPt);
|
| - path.close();
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddDegenCubic(SkPath& path, SkPoint& startPt) {
|
| - path.cubicTo(startPt, startPt, startPt);
|
| - return startPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveDegenCubic(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - path.cubicTo(moveToPt, moveToPt, moveToPt);
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveDegenCubicClose(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - path.moveTo(moveToPt);
|
| - path.cubicTo(moveToPt, moveToPt, moveToPt);
|
| - path.close();
|
| - return moveToPt;
|
| - }
|
| -
|
| - static SkPoint AddClose(SkPath& path, SkPoint& startPt) {
|
| - path.close();
|
| - return startPt;
|
| - }
|
| -
|
| - static SkPoint AddLine(SkPath& path, SkPoint& startPt) {
|
| - SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.lineTo(endPt);
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveLine(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.moveTo(moveToPt);
|
| - path.lineTo(endPt);
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveLineClose(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.moveTo(moveToPt);
|
| - path.lineTo(endPt);
|
| - path.close();
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddQuad(SkPath& path, SkPoint& startPt) {
|
| - SkPoint midPt = startPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.quadTo(midPt, endPt);
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveQuad(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.moveTo(moveToPt);
|
| - path.quadTo(midPt, endPt);
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveQuadClose(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.moveTo(moveToPt);
|
| - path.quadTo(midPt, endPt);
|
| - path.close();
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddCubic(SkPath& path, SkPoint& startPt) {
|
| - SkPoint t1Pt = startPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint t2Pt = startPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.cubicTo(t1Pt, t2Pt, endPt);
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveCubic(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.moveTo(moveToPt);
|
| - path.cubicTo(t1Pt, t2Pt, endPt);
|
| - return endPt;
|
| - }
|
| -
|
| - static SkPoint AddMoveCubicClose(SkPath& path, SkPoint& startPt) {
|
| - SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| - SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
|
| - SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| - path.moveTo(moveToPt);
|
| - path.cubicTo(t1Pt, t2Pt, endPt);
|
| - path.close();
|
| - return endPt;
|
| - }
|
| -
|
| - void drawPath(SkPath& path, SkCanvas* canvas, SkColor color,
|
| - const SkRect& clip, SkPaint::Cap cap, SkPaint::Join join,
|
| - SkPaint::Style style, SkPath::FillType fill,
|
| - SkScalar strokeWidth) {
|
| - path.setFillType(fill);
|
| - SkPaint paint;
|
| - paint.setStrokeCap(cap);
|
| - paint.setStrokeWidth(strokeWidth);
|
| - paint.setStrokeJoin(join);
|
| - paint.setColor(color);
|
| - paint.setStyle(style);
|
| - canvas->save();
|
| - canvas->clipRect(clip);
|
| - canvas->drawPath(path, paint);
|
| - canvas->restore();
|
| - }
|
| -
|
| - virtual void onDraw(SkCanvas* canvas) {
|
| - static const AddSegmentFunc gSegmentFunctions[] = {
|
| - AddMove,
|
| - AddMoveClose,
|
| - AddDegenLine,
|
| - AddMoveDegenLine,
|
| - AddMoveDegenLineClose,
|
| - AddDegenQuad,
|
| - AddMoveDegenQuad,
|
| - AddMoveDegenQuadClose,
|
| - AddDegenCubic,
|
| - AddMoveDegenCubic,
|
| - AddMoveDegenCubicClose,
|
| - AddClose,
|
| - AddLine,
|
| - AddMoveLine,
|
| - AddMoveLineClose,
|
| - AddQuad,
|
| - AddMoveQuad,
|
| - AddMoveQuadClose,
|
| - AddCubic,
|
| - AddMoveCubic,
|
| - AddMoveCubicClose
|
| - };
|
| - static const char* gSegmentNames[] = {
|
| - "Move",
|
| - "MoveClose",
|
| - "DegenLine",
|
| - "MoveDegenLine",
|
| - "MoveDegenLineClose",
|
| - "DegenQuad",
|
| - "MoveDegenQuad",
|
| - "MoveDegenQuadClose",
|
| - "DegenCubic",
|
| - "MoveDegenCubic",
|
| - "MoveDegenCubicClose",
|
| - "Close",
|
| - "Line",
|
| - "MoveLine",
|
| - "MoveLineClose",
|
| - "Quad",
|
| - "MoveQuad",
|
| - "MoveQuadClose",
|
| - "Cubic",
|
| - "MoveCubic",
|
| - "MoveCubicClose"
|
| - };
|
| -
|
| - struct FillAndName {
|
| - SkPath::FillType fFill;
|
| - const char* fName;
|
| - };
|
| - static const FillAndName gFills[] = {
|
| - {SkPath::kWinding_FillType, "Winding"},
|
| - {SkPath::kEvenOdd_FillType, "Even / Odd"},
|
| - {SkPath::kInverseWinding_FillType, "Inverse Winding"},
|
| - {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}
|
| - };
|
| - struct StyleAndName {
|
| - SkPaint::Style fStyle;
|
| - const char* fName;
|
| - };
|
| - static const StyleAndName gStyles[] = {
|
| - {SkPaint::kFill_Style, "Fill"},
|
| - {SkPaint::kStroke_Style, "Stroke 10"},
|
| - {SkPaint::kStrokeAndFill_Style, "Stroke 10 And Fill"}
|
| - };
|
| - struct CapAndName {
|
| - SkPaint::Cap fCap;
|
| - SkPaint::Join fJoin;
|
| - const char* fName;
|
| - };
|
| - static const CapAndName gCaps[] = {
|
| - {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
|
| - {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
|
| - {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
|
| - };
|
| -
|
| - SkPaint titlePaint;
|
| - titlePaint.setColor(SK_ColorBLACK);
|
| - titlePaint.setAntiAlias(true);
|
| - titlePaint.setLCDRenderText(true);
|
| - titlePaint.setTextSize(15 * SK_Scalar1);
|
| - const char title[] = "Random Paths Drawn Into Rectangle Clips With "
|
| - "Indicated Style, Fill and Linecaps, "
|
| - "with Stroke width 6";
|
| - canvas->drawText(title, strlen(title),
|
| - 20 * SK_Scalar1,
|
| - 20 * SK_Scalar1,
|
| - titlePaint);
|
| -
|
| - SkRandom rand;
|
| - SkRect rect = SkRect::MakeWH(220*SK_Scalar1, 50*SK_Scalar1);
|
| - canvas->save();
|
| - canvas->translate(2*SK_Scalar1, 30 * SK_Scalar1); // The title
|
| - canvas->save();
|
| - unsigned numSegments = SK_ARRAY_COUNT(gSegmentFunctions);
|
| - unsigned numCaps = SK_ARRAY_COUNT(gCaps);
|
| - unsigned numStyles = SK_ARRAY_COUNT(gStyles);
|
| - unsigned numFills = SK_ARRAY_COUNT(gFills);
|
| - for (size_t row = 0; row < 6; ++row) {
|
| - if (0 < row) {
|
| - canvas->translate(0, rect.height() + 100*SK_Scalar1);
|
| - }
|
| - canvas->save();
|
| - for (size_t column = 0; column < 4; ++column) {
|
| - if (0 < column) {
|
| - canvas->translate(rect.width() + 4*SK_Scalar1, 0);
|
| - }
|
| -
|
| - SkColor color = 0xff007000;
|
| - StyleAndName style = gStyles[(rand.nextU() >> 16) % numStyles];
|
| - CapAndName cap = gCaps[(rand.nextU() >> 16) % numCaps];
|
| - FillAndName fill = gFills[(rand.nextU() >> 16) % numFills];
|
| - SkPath path;
|
| - unsigned s1 = (rand.nextU() >> 16) % numSegments;
|
| - unsigned s2 = (rand.nextU() >> 16) % numSegments;
|
| - unsigned s3 = (rand.nextU() >> 16) % numSegments;
|
| - unsigned s4 = (rand.nextU() >> 16) % numSegments;
|
| - unsigned s5 = (rand.nextU() >> 16) % numSegments;
|
| - SkPoint pt = SkPoint::Make(10*SK_Scalar1, 0);
|
| - pt = gSegmentFunctions[s1](path, pt);
|
| - pt = gSegmentFunctions[s2](path, pt);
|
| - pt = gSegmentFunctions[s3](path, pt);
|
| - pt = gSegmentFunctions[s4](path, pt);
|
| - pt = gSegmentFunctions[s5](path, pt);
|
| -
|
| - this->drawPath(path, canvas, color, rect,
|
| - cap.fCap, cap.fJoin, style.fStyle,
|
| - fill.fFill, SK_Scalar1*6);
|
| -
|
| - SkPaint rectPaint;
|
| - rectPaint.setColor(SK_ColorBLACK);
|
| - rectPaint.setStyle(SkPaint::kStroke_Style);
|
| - rectPaint.setStrokeWidth(-1);
|
| - rectPaint.setAntiAlias(true);
|
| - canvas->drawRect(rect, rectPaint);
|
| -
|
| - SkPaint labelPaint;
|
| - labelPaint.setColor(color);
|
| - labelPaint.setAntiAlias(true);
|
| - labelPaint.setLCDRenderText(true);
|
| - labelPaint.setTextSize(10 * SK_Scalar1);
|
| - canvas->drawText(style.fName,
|
| - strlen(style.fName),
|
| - 0, rect.height() + 12 * SK_Scalar1,
|
| - labelPaint);
|
| - canvas->drawText(fill.fName,
|
| - strlen(fill.fName),
|
| - 0, rect.height() + 24 * SK_Scalar1,
|
| - labelPaint);
|
| - canvas->drawText(cap.fName,
|
| - strlen(cap.fName),
|
| - 0, rect.height() + 36 * SK_Scalar1,
|
| - labelPaint);
|
| - canvas->drawText(gSegmentNames[s1],
|
| - strlen(gSegmentNames[s1]),
|
| - 0, rect.height() + 48 * SK_Scalar1,
|
| - labelPaint);
|
| - canvas->drawText(gSegmentNames[s2],
|
| - strlen(gSegmentNames[s2]),
|
| - 0, rect.height() + 60 * SK_Scalar1,
|
| - labelPaint);
|
| - canvas->drawText(gSegmentNames[s3],
|
| - strlen(gSegmentNames[s3]),
|
| - 0, rect.height() + 72 * SK_Scalar1,
|
| - labelPaint);
|
| - canvas->drawText(gSegmentNames[s4],
|
| - strlen(gSegmentNames[s4]),
|
| - 0, rect.height() + 84 * SK_Scalar1,
|
| - labelPaint);
|
| - canvas->drawText(gSegmentNames[s5],
|
| - strlen(gSegmentNames[s5]),
|
| - 0, rect.height() + 96 * SK_Scalar1,
|
| - labelPaint);
|
| - }
|
| - canvas->restore();
|
| - }
|
| - canvas->restore();
|
| - canvas->restore();
|
| - }
|
| -
|
| -private:
|
| - typedef GM INHERITED;
|
| -};
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| -static GM* MyFactory(void*) { return new DegenerateSegmentsGM; }
|
| -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 "SkCanvas.h"
|
| +#include "SkPaint.h"
|
| +#include "SkRandom.h"
|
| +
|
| +namespace skiagm {
|
| +
|
| +class DegenerateSegmentsGM : public GM {
|
| +public:
|
| + DegenerateSegmentsGM() {}
|
| +
|
| +protected:
|
| + struct PathAndName {
|
| + SkPath fPath;
|
| + const char* fName1;
|
| + const char* fName2;
|
| + };
|
| +
|
| + SkString onShortName() {
|
| + return SkString("degeneratesegments");
|
| + }
|
| +
|
| + SkISize onISize() { return make_isize(896, 930); }
|
| +
|
| + typedef SkPoint (*AddSegmentFunc)(SkPath&, SkPoint&);
|
| +
|
| + // We need to use explicit commands here, instead of addPath, because we
|
| + // do not want the moveTo that is added at the beginning of a path to
|
| + // appear in the appended path.
|
| + static SkPoint AddMove(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveClose(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + path.close();
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddDegenLine(SkPath& path, SkPoint& startPt) {
|
| + path.lineTo(startPt);
|
| + return startPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveDegenLine(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + path.lineTo(moveToPt);
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveDegenLineClose(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + path.lineTo(moveToPt);
|
| + path.close();
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddDegenQuad(SkPath& path, SkPoint& startPt) {
|
| + path.quadTo(startPt, startPt);
|
| + return startPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveDegenQuad(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + path.quadTo(moveToPt, moveToPt);
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveDegenQuadClose(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + path.quadTo(moveToPt, moveToPt);
|
| + path.close();
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddDegenCubic(SkPath& path, SkPoint& startPt) {
|
| + path.cubicTo(startPt, startPt, startPt);
|
| + return startPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveDegenCubic(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + path.cubicTo(moveToPt, moveToPt, moveToPt);
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveDegenCubicClose(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + path.moveTo(moveToPt);
|
| + path.cubicTo(moveToPt, moveToPt, moveToPt);
|
| + path.close();
|
| + return moveToPt;
|
| + }
|
| +
|
| + static SkPoint AddClose(SkPath& path, SkPoint& startPt) {
|
| + path.close();
|
| + return startPt;
|
| + }
|
| +
|
| + static SkPoint AddLine(SkPath& path, SkPoint& startPt) {
|
| + SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.lineTo(endPt);
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveLine(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.moveTo(moveToPt);
|
| + path.lineTo(endPt);
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveLineClose(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.moveTo(moveToPt);
|
| + path.lineTo(endPt);
|
| + path.close();
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddQuad(SkPath& path, SkPoint& startPt) {
|
| + SkPoint midPt = startPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.quadTo(midPt, endPt);
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveQuad(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.moveTo(moveToPt);
|
| + path.quadTo(midPt, endPt);
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveQuadClose(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + SkPoint midPt = moveToPt + SkPoint::Make(20*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.moveTo(moveToPt);
|
| + path.quadTo(midPt, endPt);
|
| + path.close();
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddCubic(SkPath& path, SkPoint& startPt) {
|
| + SkPoint t1Pt = startPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint t2Pt = startPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint endPt = startPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.cubicTo(t1Pt, t2Pt, endPt);
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveCubic(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.moveTo(moveToPt);
|
| + path.cubicTo(t1Pt, t2Pt, endPt);
|
| + return endPt;
|
| + }
|
| +
|
| + static SkPoint AddMoveCubicClose(SkPath& path, SkPoint& startPt) {
|
| + SkPoint moveToPt = startPt + SkPoint::Make(0, 10*SK_Scalar1);
|
| + SkPoint t1Pt = moveToPt + SkPoint::Make(15*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint t2Pt = moveToPt + SkPoint::Make(25*SK_Scalar1, 5*SK_Scalar1);
|
| + SkPoint endPt = moveToPt + SkPoint::Make(40*SK_Scalar1, 0);
|
| + path.moveTo(moveToPt);
|
| + path.cubicTo(t1Pt, t2Pt, endPt);
|
| + path.close();
|
| + return endPt;
|
| + }
|
| +
|
| + void drawPath(SkPath& path, SkCanvas* canvas, SkColor color,
|
| + const SkRect& clip, SkPaint::Cap cap, SkPaint::Join join,
|
| + SkPaint::Style style, SkPath::FillType fill,
|
| + SkScalar strokeWidth) {
|
| + path.setFillType(fill);
|
| + SkPaint paint;
|
| + paint.setStrokeCap(cap);
|
| + paint.setStrokeWidth(strokeWidth);
|
| + paint.setStrokeJoin(join);
|
| + paint.setColor(color);
|
| + paint.setStyle(style);
|
| + canvas->save();
|
| + canvas->clipRect(clip);
|
| + canvas->drawPath(path, paint);
|
| + canvas->restore();
|
| + }
|
| +
|
| + virtual void onDraw(SkCanvas* canvas) {
|
| + static const AddSegmentFunc gSegmentFunctions[] = {
|
| + AddMove,
|
| + AddMoveClose,
|
| + AddDegenLine,
|
| + AddMoveDegenLine,
|
| + AddMoveDegenLineClose,
|
| + AddDegenQuad,
|
| + AddMoveDegenQuad,
|
| + AddMoveDegenQuadClose,
|
| + AddDegenCubic,
|
| + AddMoveDegenCubic,
|
| + AddMoveDegenCubicClose,
|
| + AddClose,
|
| + AddLine,
|
| + AddMoveLine,
|
| + AddMoveLineClose,
|
| + AddQuad,
|
| + AddMoveQuad,
|
| + AddMoveQuadClose,
|
| + AddCubic,
|
| + AddMoveCubic,
|
| + AddMoveCubicClose
|
| + };
|
| + static const char* gSegmentNames[] = {
|
| + "Move",
|
| + "MoveClose",
|
| + "DegenLine",
|
| + "MoveDegenLine",
|
| + "MoveDegenLineClose",
|
| + "DegenQuad",
|
| + "MoveDegenQuad",
|
| + "MoveDegenQuadClose",
|
| + "DegenCubic",
|
| + "MoveDegenCubic",
|
| + "MoveDegenCubicClose",
|
| + "Close",
|
| + "Line",
|
| + "MoveLine",
|
| + "MoveLineClose",
|
| + "Quad",
|
| + "MoveQuad",
|
| + "MoveQuadClose",
|
| + "Cubic",
|
| + "MoveCubic",
|
| + "MoveCubicClose"
|
| + };
|
| +
|
| + struct FillAndName {
|
| + SkPath::FillType fFill;
|
| + const char* fName;
|
| + };
|
| + static const FillAndName gFills[] = {
|
| + {SkPath::kWinding_FillType, "Winding"},
|
| + {SkPath::kEvenOdd_FillType, "Even / Odd"},
|
| + {SkPath::kInverseWinding_FillType, "Inverse Winding"},
|
| + {SkPath::kInverseEvenOdd_FillType, "Inverse Even / Odd"}
|
| + };
|
| + struct StyleAndName {
|
| + SkPaint::Style fStyle;
|
| + const char* fName;
|
| + };
|
| + static const StyleAndName gStyles[] = {
|
| + {SkPaint::kFill_Style, "Fill"},
|
| + {SkPaint::kStroke_Style, "Stroke 10"},
|
| + {SkPaint::kStrokeAndFill_Style, "Stroke 10 And Fill"}
|
| + };
|
| + struct CapAndName {
|
| + SkPaint::Cap fCap;
|
| + SkPaint::Join fJoin;
|
| + const char* fName;
|
| + };
|
| + static const CapAndName gCaps[] = {
|
| + {SkPaint::kButt_Cap, SkPaint::kBevel_Join, "Butt"},
|
| + {SkPaint::kRound_Cap, SkPaint::kRound_Join, "Round"},
|
| + {SkPaint::kSquare_Cap, SkPaint::kBevel_Join, "Square"}
|
| + };
|
| +
|
| + SkPaint titlePaint;
|
| + titlePaint.setColor(SK_ColorBLACK);
|
| + titlePaint.setAntiAlias(true);
|
| + titlePaint.setLCDRenderText(true);
|
| + titlePaint.setTextSize(15 * SK_Scalar1);
|
| + const char title[] = "Random Paths Drawn Into Rectangle Clips With "
|
| + "Indicated Style, Fill and Linecaps, "
|
| + "with Stroke width 6";
|
| + canvas->drawText(title, strlen(title),
|
| + 20 * SK_Scalar1,
|
| + 20 * SK_Scalar1,
|
| + titlePaint);
|
| +
|
| + SkLCGRandom rand;
|
| + SkRect rect = SkRect::MakeWH(220*SK_Scalar1, 50*SK_Scalar1);
|
| + canvas->save();
|
| + canvas->translate(2*SK_Scalar1, 30 * SK_Scalar1); // The title
|
| + canvas->save();
|
| + unsigned numSegments = SK_ARRAY_COUNT(gSegmentFunctions);
|
| + unsigned numCaps = SK_ARRAY_COUNT(gCaps);
|
| + unsigned numStyles = SK_ARRAY_COUNT(gStyles);
|
| + unsigned numFills = SK_ARRAY_COUNT(gFills);
|
| + for (size_t row = 0; row < 6; ++row) {
|
| + if (0 < row) {
|
| + canvas->translate(0, rect.height() + 100*SK_Scalar1);
|
| + }
|
| + canvas->save();
|
| + for (size_t column = 0; column < 4; ++column) {
|
| + if (0 < column) {
|
| + canvas->translate(rect.width() + 4*SK_Scalar1, 0);
|
| + }
|
| +
|
| + SkColor color = 0xff007000;
|
| + StyleAndName style = gStyles[(rand.nextU() >> 16) % numStyles];
|
| + CapAndName cap = gCaps[(rand.nextU() >> 16) % numCaps];
|
| + FillAndName fill = gFills[(rand.nextU() >> 16) % numFills];
|
| + SkPath path;
|
| + unsigned s1 = (rand.nextU() >> 16) % numSegments;
|
| + unsigned s2 = (rand.nextU() >> 16) % numSegments;
|
| + unsigned s3 = (rand.nextU() >> 16) % numSegments;
|
| + unsigned s4 = (rand.nextU() >> 16) % numSegments;
|
| + unsigned s5 = (rand.nextU() >> 16) % numSegments;
|
| + SkPoint pt = SkPoint::Make(10*SK_Scalar1, 0);
|
| + pt = gSegmentFunctions[s1](path, pt);
|
| + pt = gSegmentFunctions[s2](path, pt);
|
| + pt = gSegmentFunctions[s3](path, pt);
|
| + pt = gSegmentFunctions[s4](path, pt);
|
| + pt = gSegmentFunctions[s5](path, pt);
|
| +
|
| + this->drawPath(path, canvas, color, rect,
|
| + cap.fCap, cap.fJoin, style.fStyle,
|
| + fill.fFill, SK_Scalar1*6);
|
| +
|
| + SkPaint rectPaint;
|
| + rectPaint.setColor(SK_ColorBLACK);
|
| + rectPaint.setStyle(SkPaint::kStroke_Style);
|
| + rectPaint.setStrokeWidth(-1);
|
| + rectPaint.setAntiAlias(true);
|
| + canvas->drawRect(rect, rectPaint);
|
| +
|
| + SkPaint labelPaint;
|
| + labelPaint.setColor(color);
|
| + labelPaint.setAntiAlias(true);
|
| + labelPaint.setLCDRenderText(true);
|
| + labelPaint.setTextSize(10 * SK_Scalar1);
|
| + canvas->drawText(style.fName,
|
| + strlen(style.fName),
|
| + 0, rect.height() + 12 * SK_Scalar1,
|
| + labelPaint);
|
| + canvas->drawText(fill.fName,
|
| + strlen(fill.fName),
|
| + 0, rect.height() + 24 * SK_Scalar1,
|
| + labelPaint);
|
| + canvas->drawText(cap.fName,
|
| + strlen(cap.fName),
|
| + 0, rect.height() + 36 * SK_Scalar1,
|
| + labelPaint);
|
| + canvas->drawText(gSegmentNames[s1],
|
| + strlen(gSegmentNames[s1]),
|
| + 0, rect.height() + 48 * SK_Scalar1,
|
| + labelPaint);
|
| + canvas->drawText(gSegmentNames[s2],
|
| + strlen(gSegmentNames[s2]),
|
| + 0, rect.height() + 60 * SK_Scalar1,
|
| + labelPaint);
|
| + canvas->drawText(gSegmentNames[s3],
|
| + strlen(gSegmentNames[s3]),
|
| + 0, rect.height() + 72 * SK_Scalar1,
|
| + labelPaint);
|
| + canvas->drawText(gSegmentNames[s4],
|
| + strlen(gSegmentNames[s4]),
|
| + 0, rect.height() + 84 * SK_Scalar1,
|
| + labelPaint);
|
| + canvas->drawText(gSegmentNames[s5],
|
| + strlen(gSegmentNames[s5]),
|
| + 0, rect.height() + 96 * SK_Scalar1,
|
| + labelPaint);
|
| + }
|
| + canvas->restore();
|
| + }
|
| + canvas->restore();
|
| + canvas->restore();
|
| + }
|
| +
|
| +private:
|
| + typedef GM INHERITED;
|
| +};
|
| +
|
| +//////////////////////////////////////////////////////////////////////////////
|
| +
|
| +static GM* MyFactory(void*) { return new DegenerateSegmentsGM; }
|
| +static GMRegistry reg(MyFactory);
|
| +
|
| +}
|
|
|