diff --git a/bench/ColorCodecBench.cpp b/bench/ColorCodecBench.cpp
index 50727c7..06afdc6 100644
--- a/bench/ColorCodecBench.cpp
+++ b/bench/ColorCodecBench.cpp
@@ -95,7 +95,7 @@
 
     if (FLAGS_xform_only) {
         fSrc.reset(fSrcInfo.getSafeSize(fSrcInfo.minRowBytes()));
-        fSrcSpace = sk_ref_sp(codec->getInfo().colorSpace());
+        fSrcSpace = codec->getInfo().refColorSpace();
         codec->getPixels(fSrcInfo, fSrc.get(), fSrcInfo.minRowBytes());
     }
 }
diff --git a/gm/coloremoji.cpp b/gm/coloremoji.cpp
index 371768c..c1ebef6 100644
--- a/gm/coloremoji.cpp
+++ b/gm/coloremoji.cpp
@@ -95,7 +95,7 @@
             for (int makeBlur = 0; makeBlur < 2; makeBlur++) {
                 for (int makeGray = 0; makeGray < 2; makeGray++) {
                     SkPaint shaderPaint;
-                    shaderPaint.setTypeface(sk_ref_sp(paint.getTypeface()));
+                    shaderPaint.setTypeface(paint.refTypeface());
                     if (SkToBool(makeLinear)) {
                         shaderPaint.setShader(MakeLinear());
                     }
diff --git a/gm/dftext.cpp b/gm/dftext.cpp
index f1b9728..6f3be21 100644
--- a/gm/dftext.cpp
+++ b/gm/dftext.cpp
@@ -42,7 +42,7 @@
         GrContext* ctx = inputCanvas->getGrContext();
         SkISize size = onISize();
         SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType,
-                                                sk_ref_sp(inputCanvas->imageInfo().colorSpace()));
+                                                inputCanvas->imageInfo().refColorSpace());
         SkSurfaceProps props(SkSurfaceProps::kUseDeviceIndependentFonts_Flag,
                              SkSurfaceProps::kLegacyFontHost_InitType);
         auto surface(SkSurface::MakeRenderTarget(ctx, SkBudgeted::kNo, info, 0, &props));
diff --git a/gm/imagealphathreshold.cpp b/gm/imagealphathreshold.cpp
index 193423d..547e812 100644
--- a/gm/imagealphathreshold.cpp
+++ b/gm/imagealphathreshold.cpp
@@ -88,7 +88,7 @@
                                                     SkAlphaType alphaType) {
 
     SkColorType ct = canvas->imageInfo().colorType();
-    sk_sp<SkColorSpace> cs(sk_ref_sp(canvas->imageInfo().colorSpace()));
+    sk_sp<SkColorSpace> cs(canvas->imageInfo().refColorSpace());
 
     if (kUnknown_SkColorType == ct) {
         // For backends that aren't yet color-space aware we just fallback to N32.
diff --git a/gm/pictureimagegenerator.cpp b/gm/pictureimagegenerator.cpp
index accf072..3c59f10 100644
--- a/gm/pictureimagegenerator.cpp
+++ b/gm/pictureimagegenerator.cpp
@@ -158,8 +158,7 @@
                                                  p.getAlpha() != 255 ? &p : nullptr,
                                                  SkImage::BitDepth::kU8, srgbColorSpace));
 
-            SkImageInfo bmInfo = gen->getInfo().makeColorSpace(
-                sk_ref_sp(canvas->imageInfo().colorSpace()));
+            SkImageInfo bmInfo = gen->getInfo().makeColorSpace(canvas->imageInfo().refColorSpace());
 
             SkBitmap bm;
             SkAssertResult(gen->tryGenerateBitmap(&bm, bmInfo, nullptr));
diff --git a/gm/recordopts.cpp b/gm/recordopts.cpp
index b98d2cc..341b7ce 100644
--- a/gm/recordopts.cpp
+++ b/gm/recordopts.cpp
@@ -39,11 +39,8 @@
 
 // This detector detects that image filter phase of the pixel pipeline receives the correct value.
 static void install_detector_image_filter(SkPaint* drawPaint) {
-    sk_sp<SkColorFilter> colorFilter(make_detector_color_filter());
-    sk_sp<SkImageFilter> imageFilter(
-        SkColorFilterImageFilter::Make(std::move(colorFilter),
-                                       sk_ref_sp(drawPaint->getImageFilter())));
-    drawPaint->setImageFilter(std::move(imageFilter));
+    drawPaint->setImageFilter(SkColorFilterImageFilter::Make(make_detector_color_filter(),
+                                                             drawPaint->refImageFilter()));
 }
 
 static void no_detector_install(SkPaint*) {
diff --git a/gm/textblobmixedsizes.cpp b/gm/textblobmixedsizes.cpp
index 8c51cae..64cf723 100644
--- a/gm/textblobmixedsizes.cpp
+++ b/gm/textblobmixedsizes.cpp
@@ -103,7 +103,7 @@
             // Create a new Canvas to enable DFT
             GrContext* ctx = inputCanvas->getGrContext();
             SkISize size = onISize();
-            sk_sp<SkColorSpace> colorSpace = sk_ref_sp(inputCanvas->imageInfo().colorSpace());
+            sk_sp<SkColorSpace> colorSpace = inputCanvas->imageInfo().refColorSpace();
             SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(),
                                                     kPremul_SkAlphaType, colorSpace);
             SkSurfaceProps props(SkSurfaceProps::kUseDeviceIndependentFonts_Flag,
diff --git a/gm/textblobrandomfont.cpp b/gm/textblobrandomfont.cpp
index 64e2c67..9185494 100644
--- a/gm/textblobrandomfont.cpp
+++ b/gm/textblobrandomfont.cpp
@@ -99,7 +99,7 @@
 
         SkImageInfo info = SkImageInfo::Make(kWidth, kHeight, canvas->imageInfo().colorType(),
                                              kPremul_SkAlphaType,
-                                             sk_ref_sp(canvas->imageInfo().colorSpace()));
+                                             canvas->imageInfo().refColorSpace());
         SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
         auto surface(canvas->makeSurface(info, &props));
         if (surface) {
diff --git a/gm/xfermodes3.cpp b/gm/xfermodes3.cpp
index e6ee750..c2d4d93 100644
--- a/gm/xfermodes3.cpp
+++ b/gm/xfermodes3.cpp
@@ -126,7 +126,7 @@
         GrContext* context = baseCanvas->getGrContext();
         SkImageInfo baseInfo = baseCanvas->imageInfo();
         SkImageInfo info = SkImageInfo::Make(w, h, baseInfo.colorType(), baseInfo.alphaType(),
-                                             sk_ref_sp(baseInfo.colorSpace()));
+                                             baseInfo.refColorSpace());
         SkSurfaceProps canvasProps(SkSurfaceProps::kLegacyFontHost_InitType);
         baseCanvas->getProps(&canvasProps);
         return SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info, 0, &canvasProps);
diff --git a/include/core/SkImageInfo.h b/include/core/SkImageInfo.h
index f8582d6..4a8c286 100644
--- a/include/core/SkImageInfo.h
+++ b/include/core/SkImageInfo.h
@@ -234,6 +234,7 @@
     SkColorType colorType() const { return fColorType; }
     SkAlphaType alphaType() const { return fAlphaType; }
     SkColorSpace* colorSpace() const { return fColorSpace.get(); }
+    sk_sp<SkColorSpace> refColorSpace() const { return fColorSpace; }
 
     bool isEmpty() const { return fWidth <= 0 || fHeight <= 0; }
 
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index de3b479..f19edf7 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -481,6 +481,7 @@
         @return the paint's shader (or NULL)
     */
     SkShader* getShader() const { return fShader.get(); }
+    sk_sp<SkShader> refShader() const;
 
     /** Set or clear the shader object.
      *  Shaders specify the source color(s) for what is being drawn. If a paint
@@ -509,6 +510,7 @@
         @return the paint's colorfilter (or NULL)
     */
     SkColorFilter* getColorFilter() const { return fColorFilter.get(); }
+    sk_sp<SkColorFilter> refColorFilter() const;
 
     /** Set or clear the paint's colorfilter.
         <p />
@@ -528,6 +530,7 @@
         @return the paint's patheffect (or NULL)
     */
     SkPathEffect* getPathEffect() const { return fPathEffect.get(); }
+    sk_sp<SkPathEffect> refPathEffect() const;
 
     /** Set or clear the patheffect object.
         <p />
@@ -547,6 +550,7 @@
         @return the paint's maskfilter (or NULL)
     */
     SkMaskFilter* getMaskFilter() const { return fMaskFilter.get(); }
+    sk_sp<SkMaskFilter> refMaskFilter() const;
 
     /** Set or clear the maskfilter object.
         <p />
@@ -569,6 +573,7 @@
         @return the paint's typeface (or NULL)
     */
     SkTypeface* getTypeface() const { return fTypeface.get(); }
+    sk_sp<SkTypeface> refTypeface() const;
 
     /** Set or clear the typeface object.
         <p />
@@ -588,6 +593,7 @@
         @return the paint's rasterizer (or NULL)
     */
     SkRasterizer* getRasterizer() const { return fRasterizer.get(); }
+    sk_sp<SkRasterizer> refRasterizer() const;
 
     /** Set or clear the rasterizer object.
         <p />
@@ -603,6 +609,7 @@
     void setRasterizer(sk_sp<SkRasterizer>);
 
     SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
+    sk_sp<SkImageFilter> refImageFilter() const;
     void setImageFilter(sk_sp<SkImageFilter>);
 
     /**
@@ -610,6 +617,8 @@
      *  reference count.
      */
     SkDrawLooper* getDrawLooper() const { return fDrawLooper.get(); }
+    sk_sp<SkDrawLooper> refDrawLooper() const;
+
     SkDrawLooper* getLooper() const { return fDrawLooper.get(); }
     /**
      *  Set or clear the looper object.
diff --git a/src/animator/SkDrawPaint.cpp b/src/animator/SkDrawPaint.cpp
index 1026630..bbd0222 100644
--- a/src/animator/SkDrawPaint.cpp
+++ b/src/animator/SkDrawPaint.cpp
@@ -233,11 +233,11 @@
     if (pathEffect == nullptr)
         paint->setPathEffect(nullptr);
     else if (pathEffect != (SkDrawPathEffect*) -1)
-        paint->setPathEffect(sk_ref_sp(pathEffect->getPathEffect()));
+        paint->setPathEffect(pathEffect->refPathEffect());
     if (shader == nullptr)
         paint->setShader(nullptr);
     else if (shader != (SkDrawShader*) -1)
-        paint->setShader(sk_ref_sp(shader->getShader()));
+        paint->setShader(shader->refShader());
     if (strikeThru != -1)
         paint->setStrikeThruText(SkToBool(strikeThru));
     if (strokeCap != -1)
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 4716053..8bcc421 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -485,7 +485,7 @@
              *      draw onto the previous layer using the xfermode from the original paint.
              */
             SkPaint tmp;
-            tmp.setImageFilter(sk_ref_sp(fPaint->getImageFilter()));
+            tmp.setImageFilter(fPaint->refImageFilter());
             tmp.setBlendMode(fPaint->getBlendMode());
             SkRect storage;
             if (rawBounds) {
@@ -1180,7 +1180,7 @@
         return SkImageInfo::MakeN32(w, h, alphaType);
     } else {
         // keep the same characteristics as the prev
-        return SkImageInfo::Make(w, h, prev.colorType(), alphaType, sk_ref_sp(prev.colorSpace()));
+        return SkImageInfo::Make(w, h, prev.colorType(), alphaType, prev.refColorSpace());
     }
 }
 
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index 2f3dd3e..f9f9a28 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -1648,7 +1648,7 @@
 
     // Now restore the original settings, so we "draw" with whatever style/stroking.
     paint.setStyle(origPaint.getStyle());
-    paint.setPathEffect(sk_ref_sp(origPaint.getPathEffect()));
+    paint.setPathEffect(origPaint.refPathEffect());
 
     while (text < stop) {
         const SkGlyph& glyph = glyphCacheProc(cache.get(), &text);
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index fb89a67..ea33d5b 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -184,6 +184,17 @@
 #undef EQUAL
 }
 
+#define DEFINE_REF_FOO(type)    sk_sp<Sk##type> SkPaint::ref##type() const { return f##type; }
+DEFINE_REF_FOO(ColorFilter)
+DEFINE_REF_FOO(DrawLooper)
+DEFINE_REF_FOO(ImageFilter)
+DEFINE_REF_FOO(MaskFilter)
+DEFINE_REF_FOO(PathEffect)
+DEFINE_REF_FOO(Rasterizer)
+DEFINE_REF_FOO(Shader)
+DEFINE_REF_FOO(Typeface)
+#undef DEFINE_REF_FOO
+
 void SkPaint::reset() {
     SkPaint init;
     *this = init;
@@ -2244,12 +2255,12 @@
     sk_sp<SkPathEffect> pe;
 
     if (!applyStrokeAndPathEffects) {
-        style = paint.getStyle();   // restore
-        pe = sk_ref_sp(paint.getPathEffect());     // restore
+        style = paint.getStyle();       // restore
+        pe = paint.refPathEffect();     // restore
     }
     fPaint.setStyle(style);
     fPaint.setPathEffect(pe);
-    fPaint.setMaskFilter(sk_ref_sp(paint.getMaskFilter()));    // restore
+    fPaint.setMaskFilter(paint.refMaskFilter());    // restore
 
     // now compute fXOffset if needed
 
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp
index e72d137..737cdf6 100644
--- a/src/effects/SkLayerDrawLooper.cpp
+++ b/src/effects/SkLayerDrawLooper.cpp
@@ -92,16 +92,16 @@
     }
 
     if (bits & kPathEffect_Bit) {
-        dst->setPathEffect(sk_ref_sp(src.getPathEffect()));
+        dst->setPathEffect(src.refPathEffect());
     }
     if (bits & kMaskFilter_Bit) {
-        dst->setMaskFilter(sk_ref_sp(src.getMaskFilter()));
+        dst->setMaskFilter(src.refMaskFilter());
     }
     if (bits & kShader_Bit) {
-        dst->setShader(sk_ref_sp(src.getShader()));
+        dst->setShader(src.refShader());
     }
     if (bits & kColorFilter_Bit) {
-        dst->setColorFilter(sk_ref_sp(src.getColorFilter()));
+        dst->setColorFilter(src.refColorFilter());
     }
     if (bits & kXfermode_Bit) {
         dst->setBlendMode(src.getBlendMode());
diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp
index 5793ade..548d4aa 100644
--- a/src/gpu/text/GrTextUtils.cpp
+++ b/src/gpu/text/GrTextUtils.cpp
@@ -524,7 +524,7 @@
 
     // Now restore the original settings, so we "draw" with whatever style/stroking.
     paint.setStyle(origPaint.getStyle());
-    paint.setPathEffect(sk_ref_sp(origPaint.getPathEffect()));
+    paint.setPathEffect(origPaint.refPathEffect());
 
     while (text < stop) {
         const SkGlyph& glyph = glyphCacheProc(cache, &text);
diff --git a/src/svg/SkSVGDevice.cpp b/src/svg/SkSVGDevice.cpp
index 09bd09b..06679da 100644
--- a/src/svg/SkSVGDevice.cpp
+++ b/src/svg/SkSVGDevice.cpp
@@ -535,8 +535,7 @@
 
     SkString familyName;
     SkTHashSet<SkString> familySet;
-    sk_sp<const SkTypeface> tface(paint.getTypeface() ?
-        sk_ref_sp(paint.getTypeface()) : SkTypeface::MakeDefault());
+    sk_sp<SkTypeface> tface(paint.getTypeface() ? paint.refTypeface() : SkTypeface::MakeDefault());
 
     SkASSERT(tface);
     SkTypeface::Style style = tface->style();
diff --git a/tests/FontHostStreamTest.cpp b/tests/FontHostStreamTest.cpp
index efb1453..7c4cb67 100644
--- a/tests/FontHostStreamTest.cpp
+++ b/tests/FontHostStreamTest.cpp
@@ -87,8 +87,8 @@
         drawBG(&origCanvas);
         origCanvas.drawText("A", 1, point.fX, point.fY, paint);
 
-        sk_sp<SkTypeface> typeface(SkToBool(paint.getTypeface()) ? sk_ref_sp(paint.getTypeface())
-                                                                 : SkTypeface::MakeDefault());
+        sk_sp<SkTypeface> typeface(paint.getTypeface() ? paint.refTypeface()
+                                                       : SkTypeface::MakeDefault());
         int ttcIndex;
         std::unique_ptr<SkStreamAsset> fontData(typeface->openStream(&ttcIndex));
         sk_sp<SkTypeface> streamTypeface(SkTypeface::MakeFromStream(fontData.release()));
