From afc7cce5d68663934128d76963cd501f771d71de Mon Sep 17 00:00:00 2001 From: senorblanco Date: Tue, 2 Feb 2016 18:44:15 -0800 Subject: Fix for rounded-rect clips with filters. Don't use the base canvas size to limit raster of complex clips, since the top canvas size may actually be larger (e.g., a blur filter which expands the clip bounds to accommodate filter margins). Use the top canvas bounds instead. BUG=skia:4879,471212 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1657333002 Review URL: https://codereview.chromium.org/1657333002 --- src/core/SkCanvas.cpp | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) (limited to 'src/core/SkCanvas.cpp') diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index ce08d41a1f..c8c4b8749b 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -812,19 +812,17 @@ void SkCanvas::flush() { } } -SkISize SkCanvas::getTopLayerSize() const { - SkBaseDevice* d = this->getTopDevice(); +SkISize SkCanvas::getBaseLayerSize() const { + SkBaseDevice* d = this->getDevice(); return d ? SkISize::Make(d->width(), d->height()) : SkISize::Make(0, 0); } -SkIPoint SkCanvas::getTopLayerOrigin() const { +SkIRect SkCanvas::getTopLayerBounds() const { SkBaseDevice* d = this->getTopDevice(); - return d ? d->getOrigin() : SkIPoint::Make(0, 0); -} - -SkISize SkCanvas::getBaseLayerSize() const { - SkBaseDevice* d = this->getDevice(); - return d ? SkISize::Make(d->width(), d->height()) : SkISize::Make(0, 0); + if (!d) { + return SkIRect::MakeEmpty(); + } + return SkIRect::MakeXYWH(d->getOrigin().x(), d->getOrigin().y(), d->width(), d->height()); } SkBaseDevice* SkCanvas::getDevice() const { @@ -1516,7 +1514,7 @@ void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg if (rectStaysRect) { const bool isAA = kSoft_ClipEdgeStyle == edgeStyle; fClipStack->clipDevRect(devR, op, isAA); - fMCRec->fRasterClip.op(devR, this->getBaseLayerSize(), op, isAA); + fMCRec->fRasterClip.op(devR, this->getTopLayerBounds(), op, isAA); } else { // since we're rotated or some such thing, we convert the rect to a path // and clip against that, since it can handle any matrix. However, to @@ -1529,11 +1527,6 @@ void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg } } -static void rasterclip_path(SkRasterClip* rc, const SkCanvas* canvas, const SkPath& devPath, - SkRegion::Op op, bool doAA) { - rc->op(devPath, canvas->getBaseLayerSize(), op, doAA); -} - void SkCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) { this->checkForDeferredSave(); ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; @@ -1557,7 +1550,7 @@ void SkCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle fClipStack->clipDevRRect(transformedRRect, op, kSoft_ClipEdgeStyle == edgeStyle); - fMCRec->fRasterClip.op(transformedRRect, this->getBaseLayerSize(), op, + fMCRec->fRasterClip.op(transformedRRect, this->getTopLayerBounds(), op, kSoft_ClipEdgeStyle == edgeStyle); return; } @@ -1643,7 +1636,7 @@ void SkCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edg op = SkRegion::kReplace_Op; } - rasterclip_path(&fMCRec->fRasterClip, this, devPath, op, edgeStyle); + fMCRec->fRasterClip.op(devPath, this->getTopLayerBounds(), op, edgeStyle); } void SkCanvas::clipRegion(const SkRegion& rgn, SkRegion::Op op) { @@ -1691,7 +1684,7 @@ void SkCanvas::validateClip() const { default: { SkPath path; element->asPath(&path); - rasterclip_path(&tmpClip, this, path, element->getOp(), element->isAA()); + tmpClip.op(path, this->getTopLayerBounds(), element->getOp(), element->isAA()); break; } } -- cgit v1.2.3