aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Jim Van Verth <jvanverth@google.com>2018-02-26 13:54:34 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-02-26 20:02:38 +0000
commita947e29bfda69618723341f3487076c3256cfffc (patch)
tree65117ad34586c4e246ccc65dd7c7aa37ac7a9b06 /src
parent1693d43f37ee17d647eccc3533ceb695aef1e338 (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-xsrc/utils/SkShadowTessellator.cpp8
-rw-r--r--src/utils/SkShadowUtils.cpp9
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());