diff options
author | reed <reed@google.com> | 2016-02-22 12:50:25 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-22 12:50:26 -0800 |
commit | ca726abe1e4a2522b24e5143c5faf0e594a4802a (patch) | |
tree | 82aeae3da478bb96e94d8c152ec9646baa799ba9 /src | |
parent | d49a86ade0bab1fc3048d6ba5d8536abf25ed77c (diff) |
fix misc asserts and checks found by fuzzer
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1719993002
Review URL: https://codereview.chromium.org/1719993002
Diffstat (limited to 'src')
-rw-r--r-- | src/effects/Sk1DPathEffect.cpp | 60 | ||||
-rw-r--r-- | src/effects/SkAlphaThresholdFilter.cpp | 9 | ||||
-rw-r--r-- | src/effects/SkDashPathEffect.cpp | 14 |
3 files changed, 54 insertions, 29 deletions
diff --git a/src/effects/Sk1DPathEffect.cpp b/src/effects/Sk1DPathEffect.cpp index 041886e1db..4be6f975d3 100644 --- a/src/effects/Sk1DPathEffect.cpp +++ b/src/effects/Sk1DPathEffect.cpp @@ -35,39 +35,33 @@ bool Sk1DPathEffect::filterPath(SkPath* dst, const SkPath& src, SkPath1DPathEffect::SkPath1DPathEffect(const SkPath& path, SkScalar advance, SkScalar phase, Style style) : fPath(path) { - if (advance <= 0 || path.isEmpty()) { - SkDEBUGF(("SkPath1DPathEffect can't use advance <= 0\n")); - fAdvance = 0; // signals we can't draw anything - fInitialOffset = 0; - fStyle = kStyleCount; - } else { - // cleanup their phase parameter, inverting it so that it becomes an - // offset along the path (to match the interpretation in PostScript) - if (phase < 0) { - phase = -phase; - if (phase > advance) { - phase = SkScalarMod(phase, advance); - } - } else { - if (phase > advance) { - phase = SkScalarMod(phase, advance); - } - phase = advance - phase; + SkASSERT(advance > 0 && !path.isEmpty()); + // cleanup their phase parameter, inverting it so that it becomes an + // offset along the path (to match the interpretation in PostScript) + if (phase < 0) { + phase = -phase; + if (phase > advance) { + phase = SkScalarMod(phase, advance); } - // now catch the edge case where phase == advance (within epsilon) - if (phase >= advance) { - phase = 0; + } else { + if (phase > advance) { + phase = SkScalarMod(phase, advance); } - SkASSERT(phase >= 0); + phase = advance - phase; + } + // now catch the edge case where phase == advance (within epsilon) + if (phase >= advance) { + phase = 0; + } + SkASSERT(phase >= 0); - fAdvance = advance; - fInitialOffset = phase; + fAdvance = advance; + fInitialOffset = phase; - if ((unsigned)style >= kStyleCount) { - SkDEBUGF(("SkPath1DPathEffect style enum out of range %d\n", style)); - } - fStyle = style; + if ((unsigned)style > kMorph_Style) { + SkDEBUGF(("SkPath1DPathEffect style enum out of range %d\n", style)); } + fStyle = style; } bool SkPath1DPathEffect::filterPath(SkPath* dst, const SkPath& src, @@ -207,3 +201,13 @@ void SkPath1DPathEffect::toString(SkString* str) const { str->appendf(")"); } #endif + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +SkPathEffect* SkPath1DPathEffect::Create(const SkPath& path, SkScalar advance, SkScalar phase, + Style style) { + if (advance <= 0 || path.isEmpty()) { + return nullptr; + } + return new SkPath1DPathEffect(path, advance, phase, style); +} diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp index 79520602b7..d3d36f7630 100644 --- a/src/effects/SkAlphaThresholdFilter.cpp +++ b/src/effects/SkAlphaThresholdFilter.cpp @@ -45,11 +45,19 @@ SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkAlphaThresholdFilter) SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkAlphaThresholdFilterImpl) SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END +static SkScalar pin_0_1(SkScalar x) { + return SkMinScalar(SkMaxScalar(x, 0), 1); +} SkImageFilter* SkAlphaThresholdFilter::Create(const SkRegion& region, SkScalar innerThreshold, SkScalar outerThreshold, SkImageFilter* input) { + innerThreshold = pin_0_1(innerThreshold); + outerThreshold = pin_0_1(outerThreshold); + if (!SkScalarIsFinite(innerThreshold) || !SkScalarIsFinite(outerThreshold)) { + return nullptr; + } return new SkAlphaThresholdFilterImpl(region, innerThreshold, outerThreshold, input); } @@ -334,7 +342,6 @@ void SkAlphaThresholdFilterImpl::flatten(SkWriteBuffer& buffer) const { bool SkAlphaThresholdFilterImpl::onFilterImageDeprecated(Proxy* proxy, const SkBitmap& src, const Context& ctx, SkBitmap* dst, SkIPoint* offset) const { - SkASSERT(src.colorType() == kN32_SkColorType); if (src.colorType() != kN32_SkColorType) { return false; diff --git a/src/effects/SkDashPathEffect.cpp b/src/effects/SkDashPathEffect.cpp index 6e10e5466d..ced0aab69a 100644 --- a/src/effects/SkDashPathEffect.cpp +++ b/src/effects/SkDashPathEffect.cpp @@ -384,3 +384,17 @@ void SkDashPathEffect::toString(SkString* str) const { str->appendf("))"); } #endif + +////////////////////////////////////////////////////////////////////////////////////////////////// + +SkPathEffect* SkDashPathEffect::Create(const SkScalar intervals[], int count, SkScalar phase) { + if ((count < 2) || !SkIsAlign2(count)) { + return nullptr; + } + for (int i = 0; i < count; i++) { + if (intervals[i] < 0) { + return nullptr; + } + } + return new SkDashPathEffect(intervals, count, phase); +} |