| Index: src/core/SkStroke.cpp
|
| diff --git a/src/core/SkStroke.cpp b/src/core/SkStroke.cpp
|
| index ede3d21055ee68a68b67775623ec268c71c117ed..2db5bba524abf495a2366c525d4ef4626a732280 100644
|
| --- a/src/core/SkStroke.cpp
|
| +++ b/src/core/SkStroke.cpp
|
| @@ -121,6 +121,9 @@ public:
|
| SkScalar radius, SkScalar miterLimit, SkPaint::Cap,
|
| SkPaint::Join, SkScalar resScale);
|
|
|
| + bool hasOnlyMoveTo() const { return 0 == fSegmentCount; }
|
| + SkPoint moveToPt() const { return fFirstPt; }
|
| +
|
| void moveTo(const SkPoint&);
|
| void lineTo(const SkPoint&);
|
| void quadTo(const SkPoint&, const SkPoint&);
|
| @@ -242,7 +245,14 @@ bool SkPathStroker::preJoinTo(const SkPoint& currPt, SkVector* normal,
|
| SkScalar prevY = fPrevPt.fY;
|
|
|
| if (!set_normal_unitnormal(fPrevPt, currPt, fRadius, normal, unitNormal)) {
|
| - return false;
|
| + if (SkStrokerPriv::CapFactory(SkPaint::kButt_Cap) == fCapper) {
|
| + return false;
|
| + }
|
| + /* Square caps and round caps draw even if the segment length is zero.
|
| + Since the zero length segment has no direction, set the orientation
|
| + to upright as the default orientation */
|
| + normal->set(fRadius, 0);
|
| + unitNormal->set(1, 0);
|
| }
|
|
|
| if (fSegmentCount == 0) {
|
| @@ -356,7 +366,8 @@ void SkPathStroker::line_to(const SkPoint& currPt, const SkVector& normal) {
|
| }
|
|
|
| void SkPathStroker::lineTo(const SkPoint& currPt) {
|
| - if (SkPath::IsLineDegenerate(fPrevPt, currPt, false)) {
|
| + if (SkStrokerPriv::CapFactory(SkPaint::kButt_Cap) == fCapper
|
| + && SkPath::IsLineDegenerate(fPrevPt, currPt, false)) {
|
| return;
|
| }
|
| SkVector normal, unitNormal;
|
| @@ -1334,6 +1345,14 @@ void SkStroke::strokePath(const SkPath& src, SkPath* dst) const {
|
| lastSegment = SkPath::kCubic_Verb;
|
| break;
|
| case SkPath::kClose_Verb:
|
| + if (stroker.hasOnlyMoveTo() && SkPaint::kButt_Cap != this->getCap()) {
|
| + /* If the stroke consists of a moveTo followed by a close, treat it
|
| + as if it were followed by a zero-length line. Lines without length
|
| + can have square and round end caps. */
|
| + stroker.lineTo(stroker.moveToPt());
|
| + lastSegment = SkPath::kLine_Verb;
|
| + break;
|
| + }
|
| stroker.close(lastSegment == SkPath::kLine_Verb);
|
| break;
|
| case SkPath::kDone_Verb:
|
|
|