Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index e4fe63992c4f081dd015d07a32f7258333dffad0..51e668d95b132e045da068df2512142f4f88f214 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -1600,12 +1600,26 @@ void SkCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle |
void SkCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { |
this->checkForDeferredSave(); |
ClipEdgeStyle edgeStyle = doAA ? kSoft_ClipEdgeStyle : kHard_ClipEdgeStyle; |
- SkRect r; |
- if (!path.isInverseFillType() && path.isRect(&r)) { |
- this->onClipRect(r, op, edgeStyle); |
- } else { |
- this->onClipPath(path, op, edgeStyle); |
+ |
+ if (!path.isInverseFillType() && fMCRec->fMatrix.rectStaysRect()) { |
+ SkRect r; |
+ if (path.isRect(&r)) { |
+ this->onClipRect(r, op, edgeStyle); |
+ return; |
+ } |
+ SkRRect rrect; |
+ if (path.isOval(&r)) { |
+ rrect.setOval(r); |
+ this->onClipRRect(rrect, op, edgeStyle); |
+ return; |
+ } |
+ if (path.isRRect(&rrect)) { |
+ this->onClipRRect(rrect, op, edgeStyle); |
+ return; |
+ } |
} |
+ |
+ this->onClipPath(path, op, edgeStyle); |
} |
void SkCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) { |