add setter on SkPaint that takes sk_sp

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1769803002

TBR=

Review URL: https://codereview.chromium.org/1769803002
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index 7090f3e..39ee1e0 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -476,7 +476,7 @@
       The shader's reference count is not affected.
         @return the paint's shader (or NULL)
     */
-    SkShader* getShader() const { return fShader; }
+    SkShader* getShader() const { return fShader.get(); }
 
     /** Set or clear the shader object.
      *  Shaders specify the source color(s) for what is being drawn. If a paint
@@ -500,12 +500,13 @@
      *  @return         shader
      */
     SkShader* setShader(SkShader* shader);
+    void setShader(sk_sp<SkShader>);
 
     /** Get the paint's colorfilter. If there is a colorfilter, its reference
         count is not changed.
         @return the paint's colorfilter (or NULL)
     */
-    SkColorFilter* getColorFilter() const { return fColorFilter; }
+    SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
 
     /** Set or clear the paint's colorfilter, returning the parameter.
         <p />
@@ -515,13 +516,14 @@
         @return         filter
     */
     SkColorFilter* setColorFilter(SkColorFilter* filter);
+    void setColorFilter(sk_sp<SkColorFilter>);
 
     /** Get the paint's xfermode object.
         <p />
       The xfermode's reference count is not affected.
         @return the paint's xfermode (or NULL)
     */
-    SkXfermode* getXfermode() const { return fXfermode; }
+    SkXfermode* getXfermode() const { return fXfermode.get(); }
 
     /** Set or clear the xfermode object.
         <p />
@@ -534,6 +536,7 @@
         @return         xfermode
     */
     SkXfermode* setXfermode(SkXfermode* xfermode);
+    void setXfermode(sk_sp<SkXfermode>);
 
     /** Create an xfermode based on the specified Mode, and assign it into the
         paint, returning the mode that was set. If the Mode is SrcOver, then
@@ -546,7 +549,7 @@
       The patheffect reference count is not affected.
         @return the paint's patheffect (or NULL)
     */
-    SkPathEffect* getPathEffect() const { return fPathEffect; }
+    SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
 
     /** Set or clear the patheffect object.
         <p />
@@ -559,13 +562,14 @@
         @return         effect
     */
     SkPathEffect* setPathEffect(SkPathEffect* effect);
+    void setPathEffect(sk_sp<SkPathEffect>);
 
     /** Get the paint's maskfilter object.
         <p />
       The maskfilter reference count is not affected.
         @return the paint's maskfilter (or NULL)
     */
-    SkMaskFilter* getMaskFilter() const { return fMaskFilter; }
+    SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
 
     /** Set or clear the maskfilter object.
         <p />
@@ -578,6 +582,7 @@
         @return             maskfilter
     */
     SkMaskFilter* setMaskFilter(SkMaskFilter* maskfilter);
+    void setMaskFilter(sk_sp<SkMaskFilter>);
 
     // These attributes are for text/fonts
 
@@ -587,7 +592,7 @@
         measuring text. The typeface reference count is not affected.
         @return the paint's typeface (or NULL)
     */
-    SkTypeface* getTypeface() const { return fTypeface; }
+    SkTypeface* getTypeface() const { return fTypeface.get(); }
 
     /** Set or clear the typeface object.
         <p />
@@ -600,13 +605,14 @@
         @return         typeface
     */
     SkTypeface* setTypeface(SkTypeface* typeface);
+    void setTypeface(sk_sp<SkTypeface>);
 
     /** Get the paint's rasterizer (or NULL).
         <p />
         The raster controls how paths/text are turned into alpha masks.
         @return the paint's rasterizer (or NULL)
     */
-    SkRasterizer* getRasterizer() const { return fRasterizer; }
+    SkRasterizer* getRasterizer() const { return fRasterizer.get(); }
 
     /** Set or clear the rasterizer object.
         <p />
@@ -620,15 +626,17 @@
         @return           rasterizer
     */
     SkRasterizer* setRasterizer(SkRasterizer* rasterizer);
+    void setRasterizer(sk_sp<SkRasterizer>);
 
-    SkImageFilter* getImageFilter() const { return fImageFilter; }
+    SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
     SkImageFilter* setImageFilter(SkImageFilter*);
+    void setImageFilter(sk_sp<SkImageFilter>);
 
     /**
      *  Return the paint's SkDrawLooper (if any). Does not affect the looper's
      *  reference count.
      */
-    SkDrawLooper* getLooper() const { return fLooper; }
+    SkDrawLooper* getLooper() const { return fLooper.get(); }
 
     /**
      *  Set or clear the looper object.
@@ -642,6 +650,7 @@
      *  @return looper
      */
     SkDrawLooper* setLooper(SkDrawLooper* looper);
+    void setLooper(sk_sp<SkDrawLooper>);
 
     enum Align {
         kLeft_Align,
@@ -1026,15 +1035,15 @@
     SK_TO_STRING_NONVIRT()
 
 private:
-    SkTypeface*     fTypeface;
-    SkPathEffect*   fPathEffect;
-    SkShader*       fShader;
-    SkXfermode*     fXfermode;
-    SkMaskFilter*   fMaskFilter;
-    SkColorFilter*  fColorFilter;
-    SkRasterizer*   fRasterizer;
-    SkDrawLooper*   fLooper;
-    SkImageFilter*  fImageFilter;
+    sk_sp<SkTypeface>     fTypeface;
+    sk_sp<SkPathEffect>   fPathEffect;
+    sk_sp<SkShader>       fShader;
+    sk_sp<SkXfermode>     fXfermode;
+    sk_sp<SkMaskFilter>   fMaskFilter;
+    sk_sp<SkColorFilter>  fColorFilter;
+    sk_sp<SkRasterizer>   fRasterizer;
+    sk_sp<SkDrawLooper>   fLooper;
+    sk_sp<SkImageFilter>  fImageFilter;
 
     SkScalar        fTextSize;
     SkScalar        fTextScaleX;
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index cdfb110..6b20629 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -44,16 +44,6 @@
 //#define SK_REPORT_API_RANGE_CHECK
 
 SkPaint::SkPaint() {
-    fTypeface    = nullptr;
-    fPathEffect  = nullptr;
-    fShader      = nullptr;
-    fXfermode    = nullptr;
-    fMaskFilter  = nullptr;
-    fColorFilter = nullptr;
-    fRasterizer  = nullptr;
-    fLooper      = nullptr;
-    fImageFilter = nullptr;
-
     fTextSize   = SkPaintDefaults_TextSize;
     fTextScaleX = SK_Scalar1;
     fTextSkewX  = 0;
@@ -72,20 +62,19 @@
     fBitfields.fHinting      = SkPaintDefaults_Hinting;
 }
 
-SkPaint::SkPaint(const SkPaint& src) {
+SkPaint::SkPaint(const SkPaint& src)
+#define COPY_CTR(field) field(src.field)
+    : COPY_CTR(fTypeface)
+    , COPY_CTR(fPathEffect)
+    , COPY_CTR(fShader)
+    , COPY_CTR(fXfermode)
+    , COPY_CTR(fMaskFilter)
+    , COPY_CTR(fColorFilter)
+    , COPY_CTR(fRasterizer)
+    , COPY_CTR(fLooper)
+    , COPY_CTR(fImageFilter)
+{
 #define COPY(field) field = src.field
-#define REF_COPY(field) field = SkSafeRef(src.field)
-
-    REF_COPY(fTypeface);
-    REF_COPY(fPathEffect);
-    REF_COPY(fShader);
-    REF_COPY(fXfermode);
-    REF_COPY(fMaskFilter);
-    REF_COPY(fColorFilter);
-    REF_COPY(fRasterizer);
-    REF_COPY(fLooper);
-    REF_COPY(fImageFilter);
-
     COPY(fTextSize);
     COPY(fTextScaleX);
     COPY(fTextSkewX);
@@ -95,7 +84,7 @@
     COPY(fBitfields);
 
 #undef COPY
-#undef REF_COPY
+#undef COPY_CTR
 }
 
 SkPaint::SkPaint(SkPaint&& src) {
@@ -124,17 +113,7 @@
 #undef REF_MOVE
 }
 
-SkPaint::~SkPaint() {
-    SkSafeUnref(fTypeface);
-    SkSafeUnref(fPathEffect);
-    SkSafeUnref(fShader);
-    SkSafeUnref(fXfermode);
-    SkSafeUnref(fMaskFilter);
-    SkSafeUnref(fColorFilter);
-    SkSafeUnref(fRasterizer);
-    SkSafeUnref(fLooper);
-    SkSafeUnref(fImageFilter);
-}
+SkPaint::~SkPaint() {}
 
 SkPaint& SkPaint::operator=(const SkPaint& src) {
     if (this == &src) {
@@ -142,18 +121,16 @@
     }
 
 #define COPY(field) field = src.field
-#define REF_COPY(field) SkSafeUnref(field); field = SkSafeRef(src.field)
 
-    REF_COPY(fTypeface);
-    REF_COPY(fPathEffect);
-    REF_COPY(fShader);
-    REF_COPY(fXfermode);
-    REF_COPY(fMaskFilter);
-    REF_COPY(fColorFilter);
-    REF_COPY(fRasterizer);
-    REF_COPY(fLooper);
-    REF_COPY(fImageFilter);
-
+    COPY(fTypeface);
+    COPY(fPathEffect);
+    COPY(fShader);
+    COPY(fXfermode);
+    COPY(fMaskFilter);
+    COPY(fColorFilter);
+    COPY(fRasterizer);
+    COPY(fLooper);
+    COPY(fImageFilter);
     COPY(fTextSize);
     COPY(fTextScaleX);
     COPY(fTextSkewX);
@@ -165,7 +142,6 @@
     return *this;
 
 #undef COPY
-#undef REF_COPY
 }
 
 SkPaint& SkPaint::operator=(SkPaint&& src) {
@@ -174,18 +150,16 @@
     }
 
 #define MOVE(field) field = std::move(src.field)
-#define REF_MOVE(field) SkSafeUnref(field); field = src.field; src.field = nullptr
 
-    REF_MOVE(fTypeface);
-    REF_MOVE(fPathEffect);
-    REF_MOVE(fShader);
-    REF_MOVE(fXfermode);
-    REF_MOVE(fMaskFilter);
-    REF_MOVE(fColorFilter);
-    REF_MOVE(fRasterizer);
-    REF_MOVE(fLooper);
-    REF_MOVE(fImageFilter);
-
+    MOVE(fTypeface);
+    MOVE(fPathEffect);
+    MOVE(fShader);
+    MOVE(fXfermode);
+    MOVE(fMaskFilter);
+    MOVE(fColorFilter);
+    MOVE(fRasterizer);
+    MOVE(fLooper);
+    MOVE(fImageFilter);
     MOVE(fTextSize);
     MOVE(fTextScaleX);
     MOVE(fTextSkewX);
@@ -197,7 +171,6 @@
     return *this;
 
 #undef MOVE
-#undef REF_MOVE
 }
 
 bool operator==(const SkPaint& a, const SkPaint& b) {
@@ -392,24 +365,41 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-SkTypeface* SkPaint::setTypeface(SkTypeface* font) {
-    SkRefCnt_SafeAssign(fTypeface, font);
-    return font;
-}
+#define MOVE_FIELD(Field) void SkPaint::set##Field(sk_sp<Sk##Field> f) { f##Field = std::move(f); }
+MOVE_FIELD(Typeface)
+MOVE_FIELD(Rasterizer)
+MOVE_FIELD(ImageFilter)
+MOVE_FIELD(Shader)
+MOVE_FIELD(ColorFilter)
+MOVE_FIELD(Xfermode)
+MOVE_FIELD(PathEffect)
+MOVE_FIELD(MaskFilter)
+#undef MOVE_FIELD
+void SkPaint::setLooper(sk_sp<SkDrawLooper> looper) { fLooper = std::move(looper); }
 
-SkRasterizer* SkPaint::setRasterizer(SkRasterizer* r) {
-    SkRefCnt_SafeAssign(fRasterizer, r);
-    return r;
-}
+#define SET_PTR(Field)                              \
+    Sk##Field* SkPaint::set##Field(Sk##Field* f) {  \
+        this->f##Field.reset(SkSafeRef(f));         \
+        return f;                                   \
+    }
+SET_PTR(Typeface)
+SET_PTR(Rasterizer)
+SET_PTR(ImageFilter)
+SET_PTR(Shader)
+SET_PTR(ColorFilter)
+SET_PTR(Xfermode)
+SET_PTR(PathEffect)
+SET_PTR(MaskFilter)
+#undef SET_PTR
 
 SkDrawLooper* SkPaint::setLooper(SkDrawLooper* looper) {
-    SkRefCnt_SafeAssign(fLooper, looper);
+    fLooper.reset(SkSafeRef(looper));
     return looper;
 }
 
-SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imageFilter) {
-    SkRefCnt_SafeAssign(fImageFilter, imageFilter);
-    return imageFilter;
+SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) {
+    fXfermode.reset(SkXfermode::Create(mode));
+    return fXfermode.get();
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -1726,7 +1716,7 @@
     test_desc(rec, pe, &peBuffer, mf, &mfBuffer, ra, &raBuffer, desc, descSize);
 #endif
 
-    proc(fTypeface, desc, context);
+    proc(fTypeface.get(), desc, context);
 }
 
 SkGlyphCache* SkPaint::detachCache(const SkSurfaceProps* surfaceProps,
@@ -1983,39 +1973,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-SkShader* SkPaint::setShader(SkShader* shader) {
-    SkRefCnt_SafeAssign(fShader, shader);
-    return shader;
-}
-
-SkColorFilter* SkPaint::setColorFilter(SkColorFilter* filter) {
-    SkRefCnt_SafeAssign(fColorFilter, filter);
-    return filter;
-}
-
-SkXfermode* SkPaint::setXfermode(SkXfermode* mode) {
-    SkRefCnt_SafeAssign(fXfermode, mode);
-    return mode;
-}
-
-SkXfermode* SkPaint::setXfermodeMode(SkXfermode::Mode mode) {
-    SkSafeUnref(fXfermode);
-    fXfermode = SkXfermode::Create(mode);
-    return fXfermode;
-}
-
-SkPathEffect* SkPaint::setPathEffect(SkPathEffect* effect) {
-    SkRefCnt_SafeAssign(fPathEffect, effect);
-    return effect;
-}
-
-SkMaskFilter* SkPaint::setMaskFilter(SkMaskFilter* filter) {
-    SkRefCnt_SafeAssign(fMaskFilter, filter);
-    return filter;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
 bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect,
                           SkScalar resScale) const {
     SkStrokeRec rec(*this, resScale);
@@ -2393,7 +2350,7 @@
         return false;
     }
     SkXfermode::Mode mode;
-    if (SkXfermode::AsMode(fXfermode, &mode)) {
+    if (SkXfermode::AsMode(fXfermode.get(), &mode)) {
         switch (mode) {
             case SkXfermode::kSrcOver_Mode:
             case SkXfermode::kSrcATop_Mode:
@@ -2401,7 +2358,7 @@
             case SkXfermode::kDstOver_Mode:
             case SkXfermode::kPlus_Mode:
                 if (0 == this->getAlpha()) {
-                    return !affects_alpha(fColorFilter) && !affects_alpha(fImageFilter);
+                    return !affects_alpha(fColorFilter.get()) && !affects_alpha(fImageFilter.get());
                 }
                 break;
             case SkXfermode::kDst_Mode: