Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index c4ce75c6c0f881e96701a8f92a132c6338be6cd9..a543a5cc5b667ada6e2241e58d49dead7b97ca51 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -215,7 +215,7 @@ struct DeviceCM { |
} |
void updateMC(const SkMatrix& totalMatrix, const SkRasterClip& totalClip, |
- const SkClipStack& clipStack, SkRasterClip* updateClip) { |
+ SkRasterClip* updateClip) { |
int x = fDevice->getOrigin().x(); |
int y = fDevice->getOrigin().y(); |
int width = fDevice->width(); |
@@ -242,8 +242,6 @@ struct DeviceCM { |
SkRegion::kDifference_Op); |
} |
- fDevice->setMatrixClip(*fMatrix, fClip.forceGetBW(), clipStack); |
- |
#ifdef SK_DEBUG |
if (!fClip.isEmpty()) { |
SkIRect deviceR; |
@@ -316,6 +314,11 @@ public: |
} |
}; |
+static SkIRect compute_device_bounds(SkBaseDevice* device) { |
+ return SkIRect::MakeXYWH(device->getOrigin().x(), device->getOrigin().y(), |
+ device->width(), device->height()); |
+} |
+ |
class SkDrawIter : public SkDraw { |
public: |
SkDrawIter(SkCanvas* canvas) { |
@@ -324,9 +327,27 @@ public: |
fClipStack = canvas->fClipStack; |
fCurrLayer = canvas->fMCRec->fTopLayer; |
+ |
+ fMultiDeviceCS = nullptr; |
+ if (fCurrLayer->fNext) { |
+ fMultiDeviceCS = canvas->fClipStack; |
+ fMultiDeviceCS->save(); |
+ } |
+ } |
+ |
+ ~SkDrawIter() { |
+ if (fMultiDeviceCS) { |
+ fMultiDeviceCS->restore(); |
+ } |
} |
bool next() { |
+ if (fMultiDeviceCS && fDevice) { |
+ // remove the previous device's bounds |
+ fMultiDeviceCS->clipDevRect(compute_device_bounds(fDevice), |
+ SkRegion::kDifference_Op); |
+ } |
+ |
// skip over recs with empty clips |
while (fCurrLayer && fCurrLayer->fClip.isEmpty()) { |
fCurrLayer = fCurrLayer->fNext; |
@@ -362,6 +383,7 @@ public: |
private: |
const DeviceCM* fCurrLayer; |
const SkPaint* fPaint; // May be null. |
+ SkClipStack* fMultiDeviceCS; |
typedef SkDraw INHERITED; |
}; |
@@ -962,11 +984,11 @@ void SkCanvas::updateDeviceCMCache() { |
DeviceCM* layer = fMCRec->fTopLayer; |
if (nullptr == layer->fNext) { // only one layer |
- layer->updateMC(totalMatrix, totalClip, *fClipStack, nullptr); |
+ layer->updateMC(totalMatrix, totalClip, nullptr); |
} else { |
SkRasterClip clip(totalClip); |
do { |
- layer->updateMC(totalMatrix, clip, *fClipStack, &clip); |
+ layer->updateMC(totalMatrix, clip, &clip); |
} while ((layer = layer->fNext) != nullptr); |
} |
fDeviceCMDirty = false; |
@@ -1049,11 +1071,7 @@ void SkCanvas::internalSave() { |
} |
bool SkCanvas::BoundsAffectsClip(SaveLayerFlags saveLayerFlags) { |
-#ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
return !(saveLayerFlags & SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag); |
-#else |
- return true; |
-#endif |
} |
bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveLayerFlags saveLayerFlags, |
@@ -1170,10 +1188,6 @@ void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra |
const SkPaint* paint = rec.fPaint; |
SaveLayerFlags saveLayerFlags = rec.fSaveLayerFlags; |
-#ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
- saveLayerFlags &= ~kDontClipToLayer_PrivateSaveLayerFlag; |
-#endif |
- |
SkLazyPaint lazyP; |
SkImageFilter* imageFilter = paint ? paint->getImageFilter() : NULL; |
SkMatrix stashedMatrix = fMCRec->fMatrix; |