diff options
Diffstat (limited to 'src/core/SkCanvas.cpp')
-rw-r--r-- | src/core/SkCanvas.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index ec21955235..63a9241f60 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -135,6 +135,13 @@ struct DeviceCM { SkDELETE(fPaint); } + void reset(const SkIRect& bounds) { + SkASSERT(!fPaint); + SkASSERT(!fNext); + SkASSERT(fDevice); + fClip.setRect(bounds); + } + void updateMC(const SkMatrix& totalMatrix, const SkRasterClip& totalClip, const SkClipStack& clipStack, SkRasterClip* updateClip) { int x = fDevice->getOrigin().x(); @@ -224,6 +231,15 @@ public: SkDELETE(fLayer); dec_rec(); } + + void reset(const SkIRect& bounds) { + SkASSERT(fLayer); + SkASSERT(fDeferredSaveCount == 0); + + fMatrix.reset(); + fRasterClip.setRect(bounds); + fLayer->reset(bounds); + } }; class SkDrawIter : public SkDraw { @@ -425,6 +441,18 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { //////////////////////////////////////////////////////////////////////////// +void SkCanvas::resetForNextPicture(const SkIRect& bounds) { + this->restoreToCount(1); + fCachedLocalClipBounds.setEmpty(); + fCachedLocalClipBoundsDirty = true; + fClipStack->reset(); + fMCRec->reset(bounds); + + // We're peering through a lot of structs here. Only at this scope do we + // know that the device is an SkBitmapDevice (really an SkNoPixelsBitmapDevice). + static_cast<SkBitmapDevice*>(fMCRec->fLayer->fDevice)->setNewSize(bounds.size()); +} + SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag); fCachedLocalClipBounds.setEmpty(); |