Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index 0313ed16113ae2c6d9c538f7412cd2eadd843f43..e96658ef2f09a33c987ccd683fc1d392125c15f2 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -46,6 +46,8 @@ |
#define RETURN_ON_NULL(ptr) do { if (nullptr == (ptr)) return; } while (0) |
+//#define SK_SUPPORT_PRECHECK_CLIPRECT |
+ |
/* |
* Return true if the drawing this rect would hit every pixels in the canvas. |
* |
@@ -1522,6 +1524,34 @@ void SkCanvas::resetMatrix() { |
////////////////////////////////////////////////////////////////////////////// |
void SkCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) { |
+ if (!fAllowSoftClip) { |
+ doAA = false; |
+ } |
+ |
+#ifdef SK_SUPPORT_PRECHECK_CLIPRECT |
+ const bool rectStaysRect = fMCRec->fMatrix.rectStaysRect(); |
+ SkRect devR; |
+ if (rectStaysRect) { |
+ fMCRec->fMatrix.mapRect(&devR, rect); |
f(malita)
2016/06/29 20:55:52
Can we move all this under the top-level condition
reed1
2016/06/29 21:07:17
Done.
|
+ } |
+ |
+ // 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, |
f(malita)
2016/06/29 20:55:52
Nit: TODO solved :)
reed1
2016/06/29 21:07:18
Done.
|
+ // 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 && !doAA && rectStaysRect) { |
+ if (devR.round().contains(fMCRec->fRasterClip.getBounds())) { |
f(malita)
2016/06/29 20:55:52
Maybe add a comment about round() vs. unknown reso
reed1
2016/06/29 21:07:17
Done.
|
+#if 0 |
+ SkDebugf("ignored clipRect [%g %g %g %g]\n", |
+ rect.left(), rect.top(), rect.right(), rect.bottom()); |
+#endif |
+ return; |
+ } |
+ } |
+#endif |
+ |
this->checkForDeferredSave(); |
ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; |
this->onClipRect(rect, op, edgeStyle); |
@@ -1531,7 +1561,7 @@ void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg |
#ifdef SK_ENABLE_CLIP_QUICKREJECT |
if (SkRegion::kIntersect_Op == op) { |
if (fMCRec->fRasterClip.isEmpty()) { |
- return false; |
+ return; |
} |
if (this->quickReject(rect)) { |
@@ -1539,27 +1569,19 @@ void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg |
fCachedLocalClipBoundsDirty = true; |
fClipStack->clipEmpty(); |
- return fMCRec->fRasterClip.setEmpty(); |
+ (void)fMCRec->fRasterClip.setEmpty(); |
+ return; |
} |
} |
#endif |
- if (!fAllowSoftClip) { |
- edgeStyle = kHard_ClipEdgeStyle; |
- } |
- |
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. |
- // |
+#ifndef SK_SUPPORT_PRECHECK_CLIPRECT |
if (SkRegion::kIntersect_Op == op && |
kHard_ClipEdgeStyle == edgeStyle |
&& rectStaysRect) |
@@ -1572,6 +1594,7 @@ void SkCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edg |
return; |
} |
} |
+#endif |
AutoValidateClip avc(this); |
@@ -1657,7 +1680,7 @@ void SkCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edg |
#ifdef SK_ENABLE_CLIP_QUICKREJECT |
if (SkRegion::kIntersect_Op == op && !path.isInverseFillType()) { |
if (fMCRec->fRasterClip.isEmpty()) { |
- return false; |
+ return; |
} |
if (this->quickReject(path.getBounds())) { |
@@ -1665,7 +1688,8 @@ void SkCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edg |
fCachedLocalClipBoundsDirty = true; |
fClipStack->clipEmpty(); |
- return fMCRec->fRasterClip.setEmpty(); |
+ (void)fMCRec->fRasterClip.setEmpty(); |
+ return; |
} |
} |
#endif |