diff options
author | reed <reed@google.com> | 2015-11-20 13:42:47 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-20 13:42:47 -0800 |
commit | 90ba095c459e38581353073826785074b5953b8c (patch) | |
tree | c43f38d25c6456d3c9edad823636f7e77ae1d054 | |
parent | 42b73eb00367c8315974b1c374308d20efa78897 (diff) |
option to quick-accept clipRect calls
BUG=skia:
Review URL: https://codereview.chromium.org/1458913005
-rw-r--r-- | src/core/SkCanvas.cpp | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 895d36fe8c..ef7b1e799b 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1508,24 +1508,44 @@ void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg } #endif - AutoValidateClip avc(this); - - fDeviceCMDirty = true; - fCachedLocalClipBoundsDirty = true; if (!fAllowSoftClip) { edgeStyle = kHard_ClipEdgeStyle; } - if (fMCRec->fMatrix.rectStaysRect()) { - // for these simpler matrices, we can stay a rect even after applying - // the matrix. This means we don't have to a) make a path, and b) tell - // the region code to scan-convert the path, only to discover that it - // is really just a rect. - SkRect r; + const bool rectStaysRect = fMCRec->fMatrix.rectStaysRect(); + SkRect devR; + if (rectStaysRect) { + fMCRec->fMatrix.mapRect(&devR, rect); + } + + // Check if we can quick-accept the clip call (and do nothing) + // + // TODO: investigate if a (conservative) version of this could be done in ::clipRect, + // so that subclasses (like PictureRecording) didn't see unnecessary clips, which in turn + // might allow lazy save/restores to eliminate entire save/restore blocks. + // + if (SkRegion::kIntersect_Op == op && + kHard_ClipEdgeStyle == edgeStyle + && rectStaysRect) + { + if (devR.round().contains(fMCRec->fRasterClip.getBounds())) { +#if 0 + SkDebugf("------- ignored clipRect [%g %g %g %g]\n", + rect.left(), rect.top(), rect.right(), rect.bottom()); +#endif + return; + } + } + + AutoValidateClip avc(this); + + fDeviceCMDirty = true; + fCachedLocalClipBoundsDirty = true; - fMCRec->fMatrix.mapRect(&r, rect); - fClipStack->clipDevRect(r, op, kSoft_ClipEdgeStyle == edgeStyle); - fMCRec->fRasterClip.op(r, this->getBaseLayerSize(), op, kSoft_ClipEdgeStyle == edgeStyle); + if (rectStaysRect) { + const bool isAA = kSoft_ClipEdgeStyle == edgeStyle; + fClipStack->clipDevRect(devR, op, isAA); + fMCRec->fRasterClip.op(devR, this->getBaseLayerSize(), 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 |