Index: src/utils/SkDashPath.cpp |
diff --git a/src/utils/SkDashPath.cpp b/src/utils/SkDashPath.cpp |
index cd01a9972b94695e1a4b27e1e819bb675fcb56e0..28bb5d8fa002b64d314540d9b65608b111e9b0b3 100644 |
--- a/src/utils/SkDashPath.cpp |
+++ b/src/utils/SkDashPath.cpp |
@@ -31,7 +31,7 @@ static SkScalar find_first_interval(const SkScalar intervals[], SkScalar phase, |
return intervals[0]; |
} |
-void SkDashPath::CalcDashParameters(SkScalar phase, const SkScalar intervals[], int32_t count, |
+bool SkDashPath::CalcDashParameters(SkScalar phase, const SkScalar intervals[], int32_t count, |
SkScalar* initialDashLength, int32_t* initialDashIndex, |
SkScalar* intervalLength, SkScalar* adjustedPhase) { |
SkScalar len = 0; |
@@ -41,40 +41,40 @@ void SkDashPath::CalcDashParameters(SkScalar phase, const SkScalar intervals[], |
*intervalLength = len; |
// watch out for values that might make us go out of bounds |
- if ((len > 0) && SkScalarIsFinite(phase) && SkScalarIsFinite(len)) { |
- |
- // Adjust phase to be between 0 and len, "flipping" phase if negative. |
- // e.g., if len is 100, then phase of -20 (or -120) is equivalent to 80 |
- if (adjustedPhase) { |
- if (phase < 0) { |
- phase = -phase; |
- if (phase > len) { |
- phase = SkScalarMod(phase, len); |
- } |
- phase = len - phase; |
- |
- // Due to finite precision, it's possible that phase == len, |
- // even after the subtract (if len >>> phase), so fix that here. |
- // This fixes http://crbug.com/124652 . |
- SkASSERT(phase <= len); |
- if (phase == len) { |
- phase = 0; |
- } |
- } else if (phase >= len) { |
+ if ((len <= 0) || !SkScalarIsFinite(phase) || !SkScalarIsFinite(len)) { |
+ return false; |
+ } |
+ |
+ // Adjust phase to be between 0 and len, "flipping" phase if negative. |
+ // e.g., if len is 100, then phase of -20 (or -120) is equivalent to 80 |
+ if (adjustedPhase) { |
+ if (phase < 0) { |
+ phase = -phase; |
+ if (phase > len) { |
phase = SkScalarMod(phase, len); |
} |
- *adjustedPhase = phase; |
+ phase = len - phase; |
+ |
+ // Due to finite precision, it's possible that phase == len, |
+ // even after the subtract (if len >>> phase), so fix that here. |
+ // This fixes http://crbug.com/124652 . |
+ SkASSERT(phase <= len); |
+ if (phase == len) { |
+ phase = 0; |
+ } |
+ } else if (phase >= len) { |
+ phase = SkScalarMod(phase, len); |
} |
- SkASSERT(phase >= 0 && phase < len); |
+ *adjustedPhase = phase; |
+ } |
+ SkASSERT(phase >= 0 && phase < len); |
- *initialDashLength = find_first_interval(intervals, phase, |
- initialDashIndex, count); |
+ *initialDashLength = find_first_interval(intervals, phase, |
+ initialDashIndex, count); |
- SkASSERT(*initialDashLength >= 0); |
- SkASSERT(*initialDashIndex >= 0 && *initialDashIndex < count); |
- } else { |
- *initialDashLength = -1; // signal bad dash intervals |
- } |
+ SkASSERT(*initialDashLength >= 0); |
+ SkASSERT(*initialDashIndex >= 0 && *initialDashIndex < count); |
+ return true; |
} |
static void outset_for_stroke(SkRect* rect, const SkStrokeRec& rec) { |
@@ -225,7 +225,7 @@ bool SkDashPath::FilterDashPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec |
SkScalar intervalLength) { |
robertphillips
2016/03/16 19:00:52
Is this comment right - was it ever right?
caryclark
2016/03/16 19:19:19
Done.
|
// we do nothing if the src wants to be filled, or if our dashlength is 0 |
- if (rec->isFillStyle() || initialDashLength < 0) { |
+ if (rec->isFillStyle()) { |
return false; |
} |
@@ -305,7 +305,7 @@ bool SkDashPath::FilterDashPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec |
// extend if we ended on a segment and we need to join up with the (skipped) initial segment |
if (meas.isClosed() && is_even(initialDashIndex) && |
- initialDashLength > 0) { |
+ initialDashLength >= 0) { |
meas.getSegment(0, initialDashLength, dst, !addedSegment); |
++segCount; |
} |
@@ -323,8 +323,10 @@ bool SkDashPath::FilterDashPath(SkPath* dst, const SkPath& src, SkStrokeRec* rec |
SkScalar initialDashLength = 0; |
int32_t initialDashIndex = 0; |
SkScalar intervalLength = 0; |
- CalcDashParameters(info.fPhase, info.fIntervals, info.fCount, |
- &initialDashLength, &initialDashIndex, &intervalLength); |
+ if (!CalcDashParameters(info.fPhase, info.fIntervals, info.fCount, |
+ &initialDashLength, &initialDashIndex, &intervalLength)) { |
+ return false; |
+ } |
return FilterDashPath(dst, src, rec, cullRect, info.fIntervals, info.fCount, initialDashLength, |
initialDashIndex, intervalLength); |
} |