From 6a280a50eddc30c6b2a090d9e8e7df78afe7a457 Mon Sep 17 00:00:00 2001 From: Adrienne Walker Date: Mon, 1 May 2017 13:45:01 -0700 Subject: [PATCH] Expose resetForNextPicture in SkNoDrawCanvas SkRecorder has some private Skia behavior with the way it handles an SkNoDrawCanvas that is not exposed. In particular, it's able to create an arbitrary SkIRect device clip at construction time. This is a performance optimization when reusing SkNoDrawCanvas across multiple recordings instead of reconstructing a new canvas every time. https://codereview.chromium.org/2768143002 is trying to implement another version of SkPictureBuilder/SkRecorder and so wants to be able to use similar SkNoDrawCanvas behavior. Change-Id: I0ac5f0eef8f0548cefd7354062311667cf448b07 Reviewed-on: https://skia-review.googlesource.com/11320 Reviewed-by: Mike Reed Reviewed-by: Mike Klein Commit-Queue: Mike Klein --- include/core/SkCanvas.h | 3 --- include/utils/SkNoDrawCanvas.h | 5 +++++ src/core/SkLiteRecorder.cpp | 2 +- src/core/SkRecorder.cpp | 3 ++- src/utils/SkDeferredCanvas.cpp | 3 ++- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h index 06e2620..837b2ff 100644 --- a/include/core/SkCanvas.h +++ b/include/core/SkCanvas.h @@ -1530,13 +1530,10 @@ private: friend class AutoDrawLooper; friend class SkDebugCanvas; // needs experimental fAllowSimplifyClip friend class SkSurface_Raster; // needs getDevice() - friend class SkRecorder; // resetForNextPicture - friend class SkLiteRecorder; // resetForNextPicture friend class SkNoDrawCanvas; // InitFlags friend class SkPictureImageFilter; // SkCanvas(SkBaseDevice*, SkSurfaceProps*, InitFlags) friend class SkPictureRecord; // predrawNotify (why does it need it? ) friend class SkPicturePlayback; // SaveFlagsToSaveLayerFlags - friend class SkDeferredCanvas; // For use of resetForNextPicture friend class SkOverdrawCanvas; friend class SkRasterHandleAllocator; diff --git a/include/utils/SkNoDrawCanvas.h b/include/utils/SkNoDrawCanvas.h index d21d678..7b3eaf6 100644 --- a/include/utils/SkNoDrawCanvas.h +++ b/include/utils/SkNoDrawCanvas.h @@ -28,6 +28,11 @@ public: // TODO: investigate the users of this ctor. SkNoDrawCanvas(const SkIRect&); + // Optimization to reset state to be the same as after construction. + void resetCanvas(int width, int height) { + resetForNextPicture(SkIRect::MakeWH(width, height)); + } + protected: SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec& rec) override; diff --git a/src/core/SkLiteRecorder.cpp b/src/core/SkLiteRecorder.cpp index c58355b..29de29a 100644 --- a/src/core/SkLiteRecorder.cpp +++ b/src/core/SkLiteRecorder.cpp @@ -14,7 +14,7 @@ SkLiteRecorder::SkLiteRecorder() , fDL(nullptr) {} void SkLiteRecorder::reset(SkLiteDL* dl, const SkIRect& bounds) { - this->resetForNextPicture(bounds); + this->resetCanvas(bounds.right(), bounds.bottom()); fDL = dl; } diff --git a/src/core/SkRecorder.cpp b/src/core/SkRecorder.cpp index 3fdc17d..47e4d74 100644 --- a/src/core/SkRecorder.cpp +++ b/src/core/SkRecorder.cpp @@ -54,7 +54,8 @@ void SkRecorder::reset(SkRecord* record, const SkRect& bounds, this->forgetRecord(); fDrawPictureMode = dpm; fRecord = record; - this->resetForNextPicture(bounds.roundOut()); + SkIRect rounded = bounds.roundOut(); + this->resetCanvas(rounded.right(), rounded.bottom()); fMiniRecorder = mr; } diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index 975f496..a98d4b7 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -63,7 +63,8 @@ void SkDeferredCanvas::reset(SkCanvas* canvas) { } fRecs.reset(); if (canvas) { - this->resetForNextPicture(SkIRect::MakeSize(canvas->getBaseLayerSize())); + this->resetCanvas(canvas->getBaseLayerSize().width(), + canvas->getBaseLayerSize().height()); fCanvas = canvas; } } -- 2.7.4