Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Unified Diff: src/core/SkCanvas.cpp

Issue 2296703003: test dont-clip-layer (Closed)
Patch Set: allow feature to be tested all the time Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« gm/aaclip.cpp ('K') | « gm/aaclip.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« gm/aaclip.cpp ('K') | « gm/aaclip.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698