diff options
author | Jim Van Verth <jvanverth@google.com> | 2018-02-26 13:54:34 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-02-26 20:02:38 +0000 |
commit | a947e29bfda69618723341f3487076c3256cfffc (patch) | |
tree | 65117ad34586c4e246ccc65dd7c7aa37ac7a9b06 /src | |
parent | 1693d43f37ee17d647eccc3533ceb695aef1e338 (diff) |
Add some additional checks for shadow generation
Change-Id: I4dae4173ad879827e4e1fa3ad12aa0447d1df252
Reviewed-on: https://skia-review.googlesource.com/110360
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Diffstat (limited to 'src')
-rwxr-xr-x | src/utils/SkShadowTessellator.cpp | 8 | ||||
-rw-r--r-- | src/utils/SkShadowUtils.cpp | 9 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/utils/SkShadowTessellator.cpp b/src/utils/SkShadowTessellator.cpp index 11e8f2d5c6..57bf5851fa 100755 --- a/src/utils/SkShadowTessellator.cpp +++ b/src/utils/SkShadowTessellator.cpp @@ -177,6 +177,12 @@ void SkBaseShadowTessellator::handleLine(const SkMatrix& m, SkPoint* p) { void SkBaseShadowTessellator::handleQuad(const SkPoint pts[3]) { #if SK_SUPPORT_GPU + // check for degeneracy + SkVector v0 = pts[1] - pts[0]; + SkVector v1 = pts[2] - pts[0]; + if (SkScalarNearlyZero(v0.cross(v1))) { + return; + } // TODO: Pull PathUtils out of Ganesh? int maxCount = GrPathUtils::quadraticPointCount(pts, kQuadTolerance); fPointBuffer.setReserve(maxCount); @@ -277,7 +283,7 @@ bool SkBaseShadowTessellator::setTransformedHeightFunc(const SkMatrix& ctm) { }; } else { SkMatrix ctmInverse; - if (!ctm.invert(&ctmInverse)) { + if (!ctm.invert(&ctmInverse) || !ctmInverse.isFinite()) { return false; } // multiply by transpose diff --git a/src/utils/SkShadowUtils.cpp b/src/utils/SkShadowUtils.cpp index fcb3432450..b2f50ad40d 100644 --- a/src/utils/SkShadowUtils.cpp +++ b/src/utils/SkShadowUtils.cpp @@ -535,6 +535,11 @@ void SkShadowUtils::DrawShadow(SkCanvas* canvas, const SkPath& path, const SkPoi canvas->private_draw_shadow_rec(path, rec); } +static bool validate_rec(const SkDrawShadowRec& rec) { + return rec.fLightPos.isFinite() && rec.fZPlaneParams.isFinite() && + SkScalarIsFinite(rec.fLightRadius); +} + void SkBaseDevice::drawShadow(const SkPath& path, const SkDrawShadowRec& rec) { auto drawVertsProc = [this](const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint, SkScalar tx, SkScalar ty) { @@ -543,6 +548,10 @@ void SkBaseDevice::drawShadow(const SkPath& path, const SkDrawShadowRec& rec) { this->drawVertices(vertices, mode, paint); }; + if (!validate_rec(rec)) { + return; + } + SkMatrix viewMatrix = this->ctm(); SkAutoDeviceCTMRestore adr(this, SkMatrix::I()); |