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>
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 @@
     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 d21d678..7b3eaf6 100644
--- a/include/utils/SkNoDrawCanvas.h
+++ b/include/utils/SkNoDrawCanvas.h
@@ -28,6 +28,11 @@
     // 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 @@
     , 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 @@
     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 @@
     }
     fRecs.reset();
     if (canvas) {
-        this->resetForNextPicture(SkIRect::MakeSize(canvas->getBaseLayerSize()));
+        this->resetCanvas(canvas->getBaseLayerSize().width(),
+                          canvas->getBaseLayerSize().height());
         fCanvas = canvas;
     }
 }