allow one zero length dash

If the constructed stroke that represents a dash has a
single dash of length zero, and the end cap is square or
round, draw the cap.

The old code initialized the initial dash length to zero,
making it ambiguous whether the first length is zero or
not.

R=robertphillips@google.com
BUG=583299
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1805963002

Committed: https://skia.googlesource.com/skia/+/5e1a24808415df2748822e8082e21a361362cdfe

Review URL: https://codereview.chromium.org/1805963002
diff --git a/src/effects/SkDashPathEffect.cpp b/src/effects/SkDashPathEffect.cpp
index ced0aab..3816499 100644
--- a/src/effects/SkDashPathEffect.cpp
+++ b/src/effects/SkDashPathEffect.cpp
@@ -14,7 +14,7 @@
 
 SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count, SkScalar phase)
         : fPhase(0)
-        , fInitialDashLength(0)
+        , fInitialDashLength(-1)
         , fInitialDashIndex(0)
         , fIntervalLength(0) {
     SkASSERT(intervals);
@@ -23,7 +23,6 @@
     fIntervals = (SkScalar*)sk_malloc_throw(sizeof(SkScalar) * count);
     fCount = count;
     for (int i = 0; i < count; i++) {
-        SkASSERT(intervals[i] >= 0);
         fIntervals[i] = intervals[i];
     }
 
@@ -38,7 +37,7 @@
 
 bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src,
                               SkStrokeRec* rec, const SkRect* cullRect) const {
-    return SkDashPath::FilterDashPath(dst, src, rec, cullRect, fIntervals, fCount,
+    return SkDashPath::InternalFilter(dst, src, rec, cullRect, fIntervals, fCount,
                                       fInitialDashLength, fInitialDashIndex, fIntervalLength);
 }
 
@@ -162,7 +161,7 @@
                                 const SkMatrix& matrix,
                                 const SkRect* cullRect) const {
     // width < 0 -> fill && width == 0 -> hairline so requiring width > 0 rules both out
-    if (fInitialDashLength < 0 || 0 >= rec.getWidth()) {
+    if (0 >= rec.getWidth()) {
         return false;
     }
 
@@ -388,13 +387,8 @@
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
 SkPathEffect* SkDashPathEffect::Create(const SkScalar intervals[], int count, SkScalar phase) {
-    if ((count < 2) || !SkIsAlign2(count)) {
+    if (!SkDashPath::ValidDashPath(phase, intervals, count)) {
         return nullptr;
     }
-    for (int i = 0; i < count; i++) {
-        if (intervals[i] < 0) {
-            return nullptr;
-        }
-    }
     return new SkDashPathEffect(intervals, count, phase);
 }