diff options
author | Adrienne Walker <enne@chromium.org> | 2017-05-01 13:45:01 -0700 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-02 13:52:09 +0000 |
commit | 6a280a50eddc30c6b2a090d9e8e7df78afe7a457 (patch) | |
tree | 8b239c8a431ac716d1fdacc7c7e75e41e0f344e9 | |
parent | 687cc6c033506c767a960eb57b4d703a76424bfd (diff) |
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 <reed@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
-rw-r--r-- | include/core/SkCanvas.h | 3 | ||||
-rw-r--r-- | include/utils/SkNoDrawCanvas.h | 5 | ||||
-rw-r--r-- | src/core/SkLiteRecorder.cpp | 2 | ||||
-rw-r--r-- | src/core/SkRecorder.cpp | 3 | ||||
-rw-r--r-- | 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 06e26208ab..837b2ff92a 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? <reed>) 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 d21d678f16..7b3eaf6b18 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 c58355bea3..29de29ac5a 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 3fdc17dfbf..47e4d74909 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 975f496d3b..a98d4b7387 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; } } |