Can't correctly call computeFastBounds on maskfilter w/ device geo

maskfilter's computeFastBounds assumes the passed-in geometry bounds is
in src space, but in drawDevPath the bounds is in device space, so this
call can return meaningless answers. Skip this whole block of code, since
filterPath itself performs culling.

Bug: skia:
Change-Id: Ia668d8b692ce77332fa16908e9b0cf774c189e11
Reviewed-on: https://skia-review.googlesource.com/104520
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
Mike Reed 2018-02-06 14:59:38 -05:00 committed by Skia Commit-Bot
parent 703d9c47a8
commit 953c194038

View File

@ -952,27 +952,6 @@ SkScalar SkDraw::ComputeResScaleForStroking(const SkMatrix& matrix) {
void SkDraw::drawDevPath(const SkPath& devPath, const SkPaint& paint, bool drawCoverage,
SkBlitter* customBlitter, bool doFill) const {
// Do a conservative quick-reject test, since a looper or other modifier may have moved us
// out of range.
if (!devPath.isInverseFillType()) {
// If we're a H or V line, our bounds will be empty. So we bloat here just so we don't
// appear empty to the intersects call. This also gives us slop in case we're antialiasing
SkRect pathBounds = devPath.getBounds().makeOutset(1, 1);
if (paint.getMaskFilter()) {
as_MFB(paint.getMaskFilter())->computeFastBounds(pathBounds, &pathBounds);
// Need to outset the path to work-around a bug in blurmaskfilter. When that is fixed
// we can remove this hack. See skbug.com/5542
pathBounds.outset(7, 7);
}
// Now compare against the clip's bounds
if (!SkRect::Make(fRC->getBounds()).intersects(pathBounds)) {
return;
}
}
SkBlitter* blitter = nullptr;
SkAutoBlitterChoose blitterStorage;
if (nullptr == customBlitter) {