SkNoDrawCanvas - a public non-drawing canvas base class

TODO:

  - convert SkDeferredCanvas, SkLiteRecorder, etc. to the new base
  - remove unused SkNoSaveLayerCanvas

BUG=chromium:668925
R=reed@google.com,mtklein@google.com

Change-Id: Ie9af577477a6b9eaa5ef55523287ad1635dca116
Reviewed-on: https://skia-review.googlesource.com/5349
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/gn/utils.gni b/gn/utils.gni
index a08e60b..b99e670 100644
--- a/gn/utils.gni
+++ b/gn/utils.gni
@@ -17,6 +17,7 @@
   "$_include/utils/SkInterpolator.h",
   "$_include/utils/SkLayer.h",
   "$_include/utils/SkMeshUtils.h",
+  "$_include/utils/SkNoDrawCanvas.h",
   "$_include/utils/SkNoSaveLayerCanvas.h",
   "$_include/utils/SkNWayCanvas.h",
   "$_include/utils/SkNullCanvas.h",
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index 23e1c9f..fdea19f 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -1622,6 +1622,7 @@
     friend class SkSurface_Raster;  // needs getDevice()
     friend class SkRecorder;        // InitFlags
     friend class SkLiteRecorder;        // InitFlags
+    friend class SkNoDrawCanvas;        // InitFlags
     friend class SkNoSaveLayerCanvas;   // InitFlags
     friend class SkNWayCanvas;          // InitFlags
     friend class SkPictureImageFilter;  // SkCanvas(SkBaseDevice*, SkSurfaceProps*, InitFlags)
diff --git a/include/utils/SkNoDrawCanvas.h b/include/utils/SkNoDrawCanvas.h
new file mode 100644
index 0000000..376fa7c
--- /dev/null
+++ b/include/utils/SkNoDrawCanvas.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkNoDrawCanvas_DEFINED
+#define SkNoDrawCanvas_DEFINED
+
+#include "SkCanvas.h"
+
+// SkNoDrawCanvas is a helper for SkCanvas subclasses which do not need to
+// actually rasterize (e.g., analysis of the draw calls).
+//
+// It provides the following simplifications:
+//
+//   * not backed by any device/pixels
+//   * conservative clipping (clipping calls only use rectangles)
+//
+class SK_API SkNoDrawCanvas : public SkCanvas {
+public:
+    SkNoDrawCanvas(int width, int height);
+
+protected:
+    SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec& rec) override;
+
+private:
+    typedef SkCanvas INHERITED;
+};
+
+#endif // SkNoSaveLayerCanvas_DEFINED
diff --git a/include/utils/SkNoSaveLayerCanvas.h b/include/utils/SkNoSaveLayerCanvas.h
index 3d786c5..3d15cf9 100644
--- a/include/utils/SkNoSaveLayerCanvas.h
+++ b/include/utils/SkNoSaveLayerCanvas.h
@@ -14,6 +14,8 @@
 // The NoSaveLayerCanvas is used to play back SkPictures when the saveLayer
 // functionality isn't required (e.g., during analysis of the draw calls).
 // It also simplifies the clipping calls to only use rectangles.
+//
+// DEPRECATED: use SkNoDrawCanvas instead.
 class SK_API SkNoSaveLayerCanvas : public SkCanvas {
 public:
     SkNoSaveLayerCanvas(SkBaseDevice* device)
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index aa74a64..25f83de 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -22,6 +22,7 @@
 #include "SkMakeUnique.h"
 #include "SkMatrixUtils.h"
 #include "SkMetaData.h"
+#include "SkNoDrawCanvas.h"
 #include "SkNx.h"
 #include "SkPaintPriv.h"
 #include "SkPatchUtils.h"
@@ -3367,7 +3368,17 @@
     fCanvas->restoreToCount(fSaveCount);
 }
 
-/////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+
+SkNoDrawCanvas::SkNoDrawCanvas(int width, int height)
+    : INHERITED(SkIRect::MakeWH(width, height), kConservativeRasterClip_InitFlag) {}
+
+SkCanvas::SaveLayerStrategy SkNoDrawCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) {
+    (void)this->INHERITED::getSaveLayerStrategy(rec);
+    return kNoLayer_SaveLayerStrategy;
+}
+
+///////////////////////////////////////////////////////////////////////////////
 
 const SkCanvas::ClipOp SkCanvas::kDifference_Op;
 const SkCanvas::ClipOp SkCanvas::kIntersect_Op;