Merge SkiaCanvas changes from master-skia to master branch.
Most changes are taken from ag/1407698, ag/1336660, ag/1488900.

Test: Built and run manually on angler-eng.
Change-Id: Id4e464b9a83c62b6bc7ea31a30e5ca6cd53b659d
diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h
index 40772dd..d1edff9 100644
--- a/libs/hwui/SkiaCanvas.h
+++ b/libs/hwui/SkiaCanvas.h
@@ -22,8 +22,7 @@
 #include "VectorDrawable.h"
 
 #include <SkCanvas.h>
-#include <SkClipStack.h>
-#include <SkTArray.h>
+#include <SkTLazy.h>
 
 namespace android {
 
@@ -39,10 +38,7 @@
      *      not be NULL. This constructor will ref() the SkCanvas, and unref()
      *      it in its destructor.
      */
-    explicit SkiaCanvas(SkCanvas* canvas) : mCanvas(canvas) {
-        SkASSERT(canvas);
-        canvas->ref();
-    }
+    explicit SkiaCanvas(SkCanvas* canvas);
 
     virtual SkCanvas* asSkCanvas() override {
         return mCanvas.get();
@@ -152,7 +148,7 @@
             uirenderer::GlFunctorLifecycleListener* listener) override;
 
 protected:
-    explicit SkiaCanvas() {}
+    SkiaCanvas();
     void reset(SkCanvas* skiaCanvas);
     void drawDrawable(SkDrawable* drawable) { mCanvas->drawDrawable(drawable); }
 
@@ -167,19 +163,26 @@
     struct SaveRec {
         int              saveCount;
         SaveFlags::Flags saveFlags;
+        size_t           clipIndex;
     };
 
     bool mHighContrastText = false;
 
+    const SaveRec* currentSaveRec() const;
     void recordPartialSave(SaveFlags::Flags flags);
-    void saveClipsForFrame(SkTArray<SkClipStack::Element>& clips, int frameSaveCount);
-    void applyClips(const SkTArray<SkClipStack::Element>& clips);
+
+    template<typename T>
+    void recordClip(const T&, SkRegion::Op);
+    void applyPersistentClips(size_t clipStartIndex);
 
     void drawPoints(const float* points, int count, const SkPaint& paint,
             SkCanvas::PointMode mode);
 
-    sk_sp<SkCanvas> mCanvas;
+    class Clip;
+
+    sk_sp<SkCanvas>          mCanvas;
     std::unique_ptr<SkDeque> mSaveStack; // lazily allocated, tracks partial saves.
+    std::vector<Clip>        mClipStack; // tracks persistent clips.
 };
 
 } // namespace android