Fixes for saveBehind/drawBehind

- fixes bug in device restore (was passing the wrong matrix)
- use drawbehind for the clear, to avoid rounding differences between canvas and gpu

Change-Id: I9c130e38437d8d34242620750f11a6ae7e62ff97
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/209801
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Derek Sollenberger <djsollen@google.com>
(cherry picked from commit 9adc82c73df0ef25b708cae8aa48ef9c39ed4c67)
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/211642
Auto-Submit: Derek Sollenberger <djsollen@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Derek Sollenberger <djsollen@google.com>
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index f46575b..8e84c32 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -1145,11 +1145,7 @@
 
     SkPaint paint;
     paint.setBlendMode(SkBlendMode::kClear);
-    if (localBounds) {
-        this->drawRect(*localBounds, paint);
-    } else {
-        this->drawPaint(paint);
-    }
+    this->drawClippedToSaveBehind(paint);
 }
 
 void SkCanvas::internalRestore() {
@@ -2153,7 +2149,6 @@
     while (iter.next()) {
         SkBaseDevice* dev = iter.fDevice;
 
-        SkMatrix ctm = dev->ctm();
         dev->save();
         // We use clipRegion because it is already defined to operate in dev-space
         // (i.e. ignores the ctm). However, it is going to first translate by -origin,
@@ -2161,7 +2156,7 @@
         SkRegion rgn(bounds.makeOffset(dev->fOrigin.fX, dev->fOrigin.fY));
         dev->clipRegion(rgn, SkClipOp::kIntersect);
         dev->drawPaint(looper.paint());
-        dev->restore(ctm);
+        dev->restore(fMCRec->fMatrix);
     }
 
     LOOPER_END