re-guard against negative dimensions on no-draw canvas

We used to (incidentally) guard for this when we used bitmapdevice as our backnig.
Now that we have a (faster) nodrawdevice, we need to explicitly guard for it.

BUG=skia:

Change-Id: I9cbbf064cbfced78f0004a2e5aff60aa3ded6215
Reviewed-on: https://skia-review.googlesource.com/9530
Reviewed-by: Derek Sollenberger <djsollen@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/include/core/SkSize.h b/include/core/SkSize.h
index 2efcfb5..153335d 100644
--- a/include/core/SkSize.h
+++ b/include/core/SkSize.h
@@ -21,6 +21,10 @@
         return s;
     }
 
+    static SkTSize MakeEmpty() {
+        return {0, 0};
+    }
+
     void set(T w, T h) {
         fWidth = w;
         fHeight = h;
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 6140bcc..6ce38ea 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -57,9 +57,12 @@
 public:
     SkNoPixelsDevice(const SkIRect& bounds, const SkSurfaceProps& props)
         : SkBaseDevice(SkImageInfo::MakeUnknown(bounds.width(), bounds.height()), props)
-    {}
+    {
+        SkASSERT(bounds.width() >= 0 && bounds.height() >= 0);
+    }
 
     void resetForNextPicture(const SkIRect& bounds) {
+        SkASSERT(bounds.width() >= 0 && bounds.height() >= 0);
         this->privateResize(bounds.width(), bounds.height());
     }
 
@@ -688,7 +691,7 @@
 {
     inc_canvas();
 
-    this->init(new SkNoPixelsDevice(SkIRect::MakeWH(width, height), fProps),
+    this->init(new SkNoPixelsDevice(SkIRect::MakeWH(SkTMax(width, 0), SkTMax(height, 0)), fProps),
                kDefault_InitFlags)->unref();
 }
 
@@ -698,7 +701,8 @@
 {
     inc_canvas();
 
-    this->init(new SkNoPixelsDevice(bounds, fProps), flags)->unref();
+    SkIRect r = bounds.isEmpty() ? SkIRect::MakeEmpty() : bounds;
+    this->init(new SkNoPixelsDevice(r, fProps), flags)->unref();
 }
 
 SkCanvas::SkCanvas(SkBaseDevice* device)
diff --git a/tests/CanvasTest.cpp b/tests/CanvasTest.cpp
index e84b7ba..c35e7b0 100644
--- a/tests/CanvasTest.cpp
+++ b/tests/CanvasTest.cpp
@@ -93,6 +93,12 @@
     REPORTER_ASSERT(reporter, rect == SkRect::MakeEmpty());
     REPORTER_ASSERT(reporter, !canvas.getLocalClipBounds(&rect2));
     REPORTER_ASSERT(reporter, rect == rect2);
+
+    // Test for wacky sizes that we (historically) have guarded against
+    {
+        SkCanvas c(-10, -20);
+        REPORTER_ASSERT(reporter, c.getBaseLayerSize() == SkISize::MakeEmpty());
+    }
 }
 
 static const int kWidth = 2, kHeight = 2;