| 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;
|
|
|