aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Adrienne Walker <enne@chromium.org>2017-05-01 13:45:01 -0700
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-02 13:52:09 +0000
commit6a280a50eddc30c6b2a090d9e8e7df78afe7a457 (patch)
tree8b239c8a431ac716d1fdacc7c7e75e41e0f344e9
parent687cc6c033506c767a960eb57b4d703a76424bfd (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.h3
-rw-r--r--include/utils/SkNoDrawCanvas.h5
-rw-r--r--src/core/SkLiteRecorder.cpp2
-rw-r--r--src/core/SkRecorder.cpp3
-rw-r--r--src/utils/SkDeferredCanvas.cpp3
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;
}
}