| 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: | 
|  |