Chromium Code Reviews| 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); |
| } |