rebase

This reverts commit 32a4910e57b1fdd3c8671de1ee85e05ca21d079f.

Reason for revert: SkMatrix::toString use has been removed from flutter
and has been picked up in fuchsia

Additionally some bookmaker changes take into account recent
additions of typedef comments and the generated header comment.

Original change's description:
> Revert "remove toString"
>
> This reverts commit 5191880cbf3ee4d122b0d11b4945fbab0784fda7.
>
> Reason for revert: broke flutter
>
> Original change's description:
> > remove toString
> >
> > toString may have been used by obsolete debugger only
> > find out if that is so
> >
> > R=​brianosman@google.com,bsalomon@google.com
> >
> > Docs-Preview: https://skia.org/?cl=119894
> > Bug:830651
> > Change-Id: I737f19b7d3fbc869bea2f443fa3b5ed7c1393ffd
> > Reviewed-on: https://skia-review.googlesource.com/119894
> > Commit-Queue: Cary Clark <caryclark@google.com>
> > Reviewed-by: Brian Salomon <bsalomon@google.com>
>
> TBR=bsalomon@google.com,brianosman@google.com,caryclark@google.com,caryclark@skia.org
>
> Change-Id: I9f81de6c3615ee0608bcea9081b77239b4b8816c

TBR=bsalomon@google.com,brianosman@google.com

# Not skipping CQ checks because original CL landed > 1 day ago.

Reviewed-on: https://skia-review.googlesource.com/129623
Reviewed-by: Cary Clark <caryclark@skia.org>
Commit-Queue: Cary Clark <caryclark@google.com>
Docs-Preview: https://skia.org/?cl=133583
Bug: 830651
Change-Id: If8499e796be63580ad419e150e94d43e8b89de1b
Reviewed-on: https://skia-review.googlesource.com/133583
Commit-Queue: Cary Clark <caryclark@skia.org>
Auto-Submit: Cary Clark <caryclark@skia.org>
diff --git a/docs/SkBitmap_Reference.bmh b/docs/SkBitmap_Reference.bmh
index 8f241e3..a7cfb1d 100644
--- a/docs/SkBitmap_Reference.bmh
+++ b/docs/SkBitmap_Reference.bmh
@@ -3438,38 +3438,6 @@
 
 # ------------------------------------------------------------------------------
 
-#Method void toString(SkString* str) const;
-#In Utility
-#Line # converts Bitmap to machine readable form ##
-
-Creates string representation of Bitmap. The representation is read by
-internal debugging tools.
-
-#Param str  storage for string representation ##
-
-#Example
-    SkBitmap bitmap;
-    int width = 6;
-    int height = 11;
-    bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height));
-    SkString string;
-    bitmap.toString(&string);
-    SkString match;
-    match.printf("(%d, %d)", width, height);
-    int start = string.find(match.c_str());
-    if (start >= 0) {
-        SkString whStr(&string.c_str()[start], match.size());
-        SkDebugf("bitmap dimensions %s\n", whStr.c_str());
-    }
-    #StdOut
-    bitmap dimensions (6, 11)
-    ##
-##
-
-#SeeAlso SkPaint::toString
-
-##
-
 #Class SkBitmap ##
 
 #Topic Bitmap ##
diff --git a/docs/SkImage_Reference.bmh b/docs/SkImage_Reference.bmh
index ce42a15..687447a 100644
--- a/docs/SkImage_Reference.bmh
+++ b/docs/SkImage_Reference.bmh
@@ -1742,41 +1742,6 @@
 #Line # rarely called management functions ##
 ##
 
-#Method const char* toString(SkString* string) const
-#In Utility
-#Line # converts Image to machine readable form ##
-Appends Image description to string, including unique ID, width, height, and
-whether the image is opaque.
-
-#Param string  storage for description; existing content is preserved ##
-
-#Return string appended with Image description ##
-
-#Example
-#Image 4
-    struct {
-        const char* name;
-        sk_sp<SkImage> image;
-    } tests[] = { { "image", image }, { "bitmap", SkImage::MakeFromBitmap(source) },
-          { "texture", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
-                            kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
-                            kOpaque_SkAlphaType, nullptr) } };
-    SkString string;
-    SkPaint paint;
-    for (const auto& test : tests ) {
-        string.printf("%s: ", test.name);
-        test.image ? (void) test.image->toString(&string) : string.append("no image");
-        canvas->drawString(string, 10, 20, paint);
-        canvas->translate(0, 20);
-    }
-##
-
-#SeeAlso SkPaint::toString
-
-#Method ##
-
-# ------------------------------------------------------------------------------
-
 #Method sk_sp<SkImage> makeSubset(const SkIRect& subset) const
 #In Constructor
 #Line # creates Image containing part of original ##
diff --git a/docs/SkMatrix_Reference.bmh b/docs/SkMatrix_Reference.bmh
index 4ab498a..1211588 100644
--- a/docs/SkMatrix_Reference.bmh
+++ b/docs/SkMatrix_Reference.bmh
@@ -4103,40 +4103,7 @@
 ##
 ##
 
-#SeeAlso toString
-
-##
-
-# ------------------------------------------------------------------------------
-
-#Method void toString(SkString* str) const
-#In Utility
-#Line # converts Matrix to machine readable form ##
-Creates string representation of Matrix. Floating point values
-are written with limited precision; it may not be possible to reconstruct
-original Matrix from output.
-
-#Param str  storage for string representation of Matrix ##
-
-#Example
-    SkMatrix matrix;
-    matrix.setRotate(45);
-    SkString mStr, neStr;
-    matrix.toString(&mStr);
-    SkMatrix nearlyEqual;
-    nearlyEqual.setAll(0.7071f, -0.7071f, 0,   0.7071f, 0.7071f, 0,   0, 0, 1);
-    nearlyEqual.toString(&neStr);
-    SkDebugf("mStr  %s\n", mStr.c_str());
-    SkDebugf("neStr %s\n", neStr.c_str());
-    SkDebugf("matrix %c= nearlyEqual\n", matrix == nearlyEqual ? '=' : '!');
-#StdOut
-mStr  [  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
-neStr [  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
-matrix != nearlyEqual
-##
-##
-
-#SeeAlso dump
+#SeeAlso SkPath::dump
 
 ##
 
diff --git a/docs/SkPaint_Reference.bmh b/docs/SkPaint_Reference.bmh
index d773858..e715853 100644
--- a/docs/SkPaint_Reference.bmh
+++ b/docs/SkPaint_Reference.bmh
@@ -5113,36 +5113,6 @@
 #Line # rarely called management functions ##
 ##
 
-#Method void toString(SkString* str) const
-#In Utility
-#Line # converts Paint to machine readable form ##
-
-Creates string representation of Paint. The representation is read by
-internal debugging tools.
-
-#Param str  storage for string representation of Paint ##
-
-#Example
-    SkPaint paint;
-    SkString str;
-    paint.toString(&str);
-    const char textSize[] = "TextSize:";
-    const int trailerSize = strlen("</dd><dt>");
-    int textSizeLoc = str.find(textSize) + strlen(textSize) + trailerSize;
-    const char* sizeStart = &str.c_str()[textSizeLoc];
-    int textSizeEnd = SkStrFind(sizeStart, "</dd>");
-    SkDebugf("text size = %.*s\n", textSizeEnd, sizeStart);
-
-    #StdOut
-    text size = 12
-    ##
-
-##
-
-#SeeAlso SkPathEffect::toString SkMaskFilter::toString SkColorFilter::toString SkImageFilter::toString
-
-##
-
 # ------------------------------------------------------------------------------
 
 #Class SkPaint ##
diff --git a/docs/undocumented.bmh b/docs/undocumented.bmh
index 9e982e5..9b89832 100644
--- a/docs/undocumented.bmh
+++ b/docs/undocumented.bmh
@@ -126,8 +126,6 @@
 
 #Topic Color_Filter
 #Class SkColorFilter
-#Method void toString(SkString* str) const
-##
 #Class ##
 ##
 
@@ -320,8 +318,6 @@
 
 #Topic Image_Filter
 #Class SkImageFilter
-#Method void toString(SkString* str) const
-##
 #Class ##
 #Topic ##
 
@@ -360,8 +356,6 @@
 
 #Topic Mask_Filter
 #Class SkMaskFilter
-#Method void toString(SkString* str) const
-##
 #Class ##
 #Topic ##
 
@@ -471,8 +465,6 @@
 
 #Topic Path_Effect
     #Class SkPathEffect
-    #Method void toString(SkString* str) const
-    ##
     #Class ##
 #Topic ##
 
diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp
index fc550fb..32a5642 100644
--- a/gm/imagefiltersbase.cpp
+++ b/gm/imagefiltersbase.cpp
@@ -33,7 +33,6 @@
         return sk_sp<SkImageFilter>(new FailImageFilter);
     }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter)
 
 protected:
@@ -58,11 +57,6 @@
     return FailImageFilter::Make();
 }
 
-void FailImageFilter::toString(SkString* str) const {
-    str->appendf("FailImageFilter: (");
-    str->append(")");
-}
-
 class IdentityImageFilter : public SkImageFilter {
 public:
     class Registrar {
@@ -77,7 +71,6 @@
         return sk_sp<SkImageFilter>(new IdentityImageFilter(std::move(input)));
     }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(IdentityImageFilter)
 
 protected:
@@ -103,11 +96,6 @@
     return IdentityImageFilter::Make(common.getInput(0));
 }
 
-void IdentityImageFilter::toString(SkString* str) const {
-    str->appendf("IdentityImageFilter: (");
-    str->append(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 static void draw_paint(SkCanvas* canvas, const SkRect& r, sk_sp<SkImageFilter> imf) {
diff --git a/include/core/SkBitmap.h b/include/core/SkBitmap.h
index 5affa34..758881a 100644
--- a/include/core/SkBitmap.h
+++ b/include/core/SkBitmap.h
@@ -1255,13 +1255,6 @@
         bool allocPixelRef(SkBitmap* bitmap) override;
     };
 
-    /** Creates string representation of SkBitmap. The representation is read by
-        internal debugging tools.
-
-        @param str  storage for string representation
-    */
-    void toString(SkString* str) const;
-
 private:
     enum Flags {
         kImageIsVolatile_Flag   = 0x02,
diff --git a/include/core/SkColorFilter.h b/include/core/SkColorFilter.h
index 8d86ce2..4a92913 100644
--- a/include/core/SkColorFilter.h
+++ b/include/core/SkColorFilter.h
@@ -138,8 +138,6 @@
         return this->filterColor(SK_ColorTRANSPARENT) != SK_ColorTRANSPARENT;
     }
 
-    virtual void toString(SkString* str) const = 0;
-
     static void InitializeFlattenables();
 
     static SkFlattenable::Type GetFlattenableType() {
diff --git a/include/core/SkDrawLooper.h b/include/core/SkDrawLooper.h
index 5a4fe78..fb7def7 100644
--- a/include/core/SkDrawLooper.h
+++ b/include/core/SkDrawLooper.h
@@ -96,8 +96,6 @@
      */
     virtual bool asABlurShadow(BlurShadowRec*) const;
 
-    virtual void toString(SkString* str) const = 0;
-
     static SkFlattenable::Type GetFlattenableType() {
         return kSkDrawLooper_Type;
     }
diff --git a/include/core/SkImage.h b/include/core/SkImage.h
index 828d70d..5aba243 100644
--- a/include/core/SkImage.h
+++ b/include/core/SkImage.h
@@ -728,14 +728,6 @@
     */
     sk_sp<SkData> refEncodedData() const;
 
-    /** Appends SkImage description to string, including unique ID, width, height, and
-        whether the image is opaque.
-
-        @param string  storage for description; existing content is preserved
-        @return        string appended with SkImage description
-    */
-    const char* toString(SkString* string) const;
-
     /** Returns subset of SkImage. subset must be fully contained by SkImage dimensions().
         The implementation may share pixels, or may copy them.
 
diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h
index c95fc43..f0ab160 100644
--- a/include/core/SkImageFilter.h
+++ b/include/core/SkImageFilter.h
@@ -97,7 +97,6 @@
             : fRect(rect), fFlags(flags) {}
         uint32_t flags() const { return fFlags; }
         const SkRect& rect() const { return fRect; }
-        void toString(SkString* str) const;
 
         /**
          *  Apply this cropRect to the imageBounds. If a given edge of the cropRect is not
@@ -249,8 +248,6 @@
                                                  SkFilterQuality quality,
                                                  sk_sp<SkImageFilter> input);
 
-    virtual void toString(SkString* str) const = 0;
-
     static void InitializeFlattenables();
 
     static SkFlattenable::Type GetFlattenableType() {
diff --git a/include/core/SkMaskFilter.h b/include/core/SkMaskFilter.h
index 8158e7a..fbcbc0f 100644
--- a/include/core/SkMaskFilter.h
+++ b/include/core/SkMaskFilter.h
@@ -59,8 +59,6 @@
      */
     sk_sp<SkMaskFilter> makeWithMatrix(const SkMatrix&) const;
 
-    virtual void toString(SkString* str) const = 0;
-
     static SkFlattenable::Type GetFlattenableType() {
         return kSkMaskFilter_Type;
     }
diff --git a/include/core/SkMatrix.h b/include/core/SkMatrix.h
index 688bfc0..a201468 100644
--- a/include/core/SkMatrix.h
+++ b/include/core/SkMatrix.h
@@ -1567,14 +1567,6 @@
     */
     void dump() const;
 
-    /** Creates string representation of SkMatrix. Floating point values
-        are written with limited precision; it may not be possible to reconstruct
-        original SkMatrix from output.
-
-        @param str  storage for string representation of SkMatrix
-    */
-    void toString(SkString* str) const;
-
     /** Returns the minimum scaling factor of SkMatrix by decomposing the scaling and
         skewing elements.
         Returns -1 if scale factor overflows or SkMatrix contains perspective.
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index 21d6139..4c82e50 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -1452,13 +1452,6 @@
     const SkRect& doComputeFastBounds(const SkRect& orig, SkRect* storage,
                                       Style style) const;
 
-    /** Creates string representation of SkPaint. The representation is read by
-        internal debugging tools.
-
-        @param str  storage for string representation of SkPaint
-    */
-    void toString(SkString* str) const;
-
 private:
     typedef const SkGlyph& (*GlyphCacheProc)(SkGlyphCache*, const char**);
 
diff --git a/include/core/SkPathEffect.h b/include/core/SkPathEffect.h
index b734575..f60dd86 100644
--- a/include/core/SkPathEffect.h
+++ b/include/core/SkPathEffect.h
@@ -145,8 +145,6 @@
 
     virtual DashType asADash(DashInfo* info) const;
 
-    virtual void toString(SkString* str) const = 0;
-
     static void InitializeFlattenables();
 
     static SkFlattenable::Type GetFlattenableType() {
diff --git a/include/effects/Sk1DPathEffect.h b/include/effects/Sk1DPathEffect.h
index a78aded..022505f 100644
--- a/include/effects/Sk1DPathEffect.h
+++ b/include/effects/Sk1DPathEffect.h
@@ -62,8 +62,6 @@
     virtual bool filterPath(SkPath*, const SkPath&,
                             SkStrokeRec*, const SkRect*) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/Sk2DPathEffect.h b/include/effects/Sk2DPathEffect.h
index 841e5b8..3bdf5de 100644
--- a/include/effects/Sk2DPathEffect.h
+++ b/include/effects/Sk2DPathEffect.h
@@ -40,8 +40,6 @@
     explicit Sk2DPathEffect(const SkMatrix& mat);
     void flatten(SkWriteBuffer&) const override;
 
-    void toString(SkString* str) const override;
-
 private:
     SkMatrix    fMatrix, fInverse;
     bool        fMatrixIsInvertible;
@@ -66,8 +64,6 @@
     virtual bool filterPath(SkPath* dst, const SkPath& src,
                             SkStrokeRec*, const SkRect*) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
@@ -98,8 +94,6 @@
         return sk_sp<SkPathEffect>(new SkPath2DPathEffect(matrix, path));
     }
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkColorFilterImageFilter.h b/include/effects/SkColorFilterImageFilter.h
index f422b09..a664490 100644
--- a/include/effects/SkColorFilterImageFilter.h
+++ b/include/effects/SkColorFilterImageFilter.h
@@ -19,8 +19,6 @@
                                      sk_sp<SkImageFilter> input,
                                      const CropRect* cropRect = nullptr);
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkComposeImageFilter.h b/include/effects/SkComposeImageFilter.h
index 7c86126..acde1d6 100644
--- a/include/effects/SkComposeImageFilter.h
+++ b/include/effects/SkComposeImageFilter.h
@@ -17,8 +17,6 @@
 
     SkRect computeFastBounds(const SkRect& src) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkCornerPathEffect.h b/include/effects/SkCornerPathEffect.h
index 0f052b8..e1c57e7 100644
--- a/include/effects/SkCornerPathEffect.h
+++ b/include/effects/SkCornerPathEffect.h
@@ -28,8 +28,6 @@
     virtual bool filterPath(SkPath* dst, const SkPath& src,
                             SkStrokeRec*, const SkRect*) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
diff --git a/include/effects/SkDiscretePathEffect.h b/include/effects/SkDiscretePathEffect.h
index 252e6de..fc53f2a 100644
--- a/include/effects/SkDiscretePathEffect.h
+++ b/include/effects/SkDiscretePathEffect.h
@@ -35,8 +35,6 @@
     virtual bool filterPath(SkPath* dst, const SkPath& src,
                             SkStrokeRec*, const SkRect*) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
diff --git a/include/effects/SkDisplacementMapEffect.h b/include/effects/SkDisplacementMapEffect.h
index 929086c..1790e47 100644
--- a/include/effects/SkDisplacementMapEffect.h
+++ b/include/effects/SkDisplacementMapEffect.h
@@ -39,8 +39,6 @@
     SkIRect onFilterNodeBounds(const SkIRect&, const SkMatrix& ctm,
                                MapDirection, const SkIRect* inputRect) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkDropShadowImageFilter.h b/include/effects/SkDropShadowImageFilter.h
index e8c5740..c86550d 100644
--- a/include/effects/SkDropShadowImageFilter.h
+++ b/include/effects/SkDropShadowImageFilter.h
@@ -30,7 +30,6 @@
                                      const CropRect* cropRect = nullptr);
 
     SkRect computeFastBounds(const SkRect&) const override;
-    void toString(SkString* str) const override;
 
     Factory getFactory() const override { return CreateProc; }
 
diff --git a/include/effects/SkImageSource.h b/include/effects/SkImageSource.h
index d25cb6d..11bc7ed 100644
--- a/include/effects/SkImageSource.h
+++ b/include/effects/SkImageSource.h
@@ -22,8 +22,6 @@
 
     SkRect computeFastBounds(const SkRect& src) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkLayerDrawLooper.h b/include/effects/SkLayerDrawLooper.h
index 10a7274..18a9b93 100644
--- a/include/effects/SkLayerDrawLooper.h
+++ b/include/effects/SkLayerDrawLooper.h
@@ -75,8 +75,6 @@
 
     bool asABlurShadow(BlurShadowRec* rec) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
     static sk_sp<SkFlattenable> CreateProc(SkReadBuffer& buffer);
 
diff --git a/include/effects/SkLumaColorFilter.h b/include/effects/SkLumaColorFilter.h
index 14f2d4f..38886f8 100644
--- a/include/effects/SkLumaColorFilter.h
+++ b/include/effects/SkLumaColorFilter.h
@@ -36,8 +36,6 @@
             GrContext*, const GrColorSpaceInfo&) const override;
 #endif
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkMagnifierImageFilter.h b/include/effects/SkMagnifierImageFilter.h
index 382f62b..5a383dc 100644
--- a/include/effects/SkMagnifierImageFilter.h
+++ b/include/effects/SkMagnifierImageFilter.h
@@ -18,8 +18,6 @@
                                      sk_sp<SkImageFilter> input,
                                      const CropRect* cropRect = nullptr);
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkMatrixConvolutionImageFilter.h b/include/effects/SkMatrixConvolutionImageFilter.h
index cb4f087..ccee2fd 100644
--- a/include/effects/SkMatrixConvolutionImageFilter.h
+++ b/include/effects/SkMatrixConvolutionImageFilter.h
@@ -68,8 +68,6 @@
                                      sk_sp<SkImageFilter> input,
                                      const CropRect* cropRect = nullptr);
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkMergeImageFilter.h b/include/effects/SkMergeImageFilter.h
index 5fc6bcb..978c07e 100644
--- a/include/effects/SkMergeImageFilter.h
+++ b/include/effects/SkMergeImageFilter.h
@@ -25,8 +25,6 @@
         return Make(array, 2, cropRect);
     }
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkMorphologyImageFilter.h b/include/effects/SkMorphologyImageFilter.h
index ceb4867..aa9edfd 100644
--- a/include/effects/SkMorphologyImageFilter.h
+++ b/include/effects/SkMorphologyImageFilter.h
@@ -62,8 +62,6 @@
                                      sk_sp<SkImageFilter> input,
                                      const CropRect* cropRect = nullptr);
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
@@ -87,8 +85,6 @@
                                      sk_sp<SkImageFilter> input,
                                      const CropRect* cropRect = nullptr);
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkOffsetImageFilter.h b/include/effects/SkOffsetImageFilter.h
index f352a76..bbf19a9 100644
--- a/include/effects/SkOffsetImageFilter.h
+++ b/include/effects/SkOffsetImageFilter.h
@@ -20,8 +20,6 @@
 
     SkRect computeFastBounds(const SkRect& src) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkOverdrawColorFilter.h b/include/effects/SkOverdrawColorFilter.h
index 33eb27f..37aa813 100644
--- a/include/effects/SkOverdrawColorFilter.h
+++ b/include/effects/SkOverdrawColorFilter.h
@@ -32,8 +32,6 @@
             GrContext*, const GrColorSpaceInfo&) const override;
 #endif
 
-    void toString(SkString* str) const override;
-
     static sk_sp<SkFlattenable> CreateProc(SkReadBuffer& buffer);
     Factory getFactory() const override { return CreateProc; }
     static void InitializeFlattenables();
diff --git a/include/effects/SkPaintImageFilter.h b/include/effects/SkPaintImageFilter.h
index bf7c51b..8765665 100644
--- a/include/effects/SkPaintImageFilter.h
+++ b/include/effects/SkPaintImageFilter.h
@@ -27,8 +27,6 @@
 
     bool affectsTransparentBlack() const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkPictureImageFilter.h b/include/effects/SkPictureImageFilter.h
index 0cde398..f3011ad 100644
--- a/include/effects/SkPictureImageFilter.h
+++ b/include/effects/SkPictureImageFilter.h
@@ -25,7 +25,6 @@
      */
     static sk_sp<SkImageFilter> Make(sk_sp<SkPicture> picture, const SkRect& cropRect);
 
-    void toString(SkString* str) const override;
 
     Factory getFactory() const override { return CreateProc; }
 
diff --git a/include/effects/SkTileImageFilter.h b/include/effects/SkTileImageFilter.h
index c2e3882..2310da3 100644
--- a/include/effects/SkTileImageFilter.h
+++ b/include/effects/SkTileImageFilter.h
@@ -28,8 +28,6 @@
                                MapDirection, const SkIRect* inputRect) const override;
     SkRect computeFastBounds(const SkRect& src) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/include/effects/SkToSRGBColorFilter.h b/include/effects/SkToSRGBColorFilter.h
index 797e9d8..20264aa 100644
--- a/include/effects/SkToSRGBColorFilter.h
+++ b/include/effects/SkToSRGBColorFilter.h
@@ -27,8 +27,6 @@
             GrContext*, const GrColorSpaceInfo&) const override;
 #endif
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 private:
diff --git a/samplecode/ClockFaceView.cpp b/samplecode/ClockFaceView.cpp
index 6041e3f..0b1d293 100644
--- a/samplecode/ClockFaceView.cpp
+++ b/samplecode/ClockFaceView.cpp
@@ -85,10 +85,6 @@
         return true;
     }
 
-    void toString(SkString* str) const override {
-        str->appendf("InverseFillPE: ()");
-    }
-
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(InverseFillPE)
 
 private:
diff --git a/site/user/api/SkBitmap_Reference.md b/site/user/api/SkBitmap_Reference.md
index 3f82cd7..eafec8d 100644
--- a/site/user/api/SkBitmap_Reference.md
+++ b/site/user/api/SkBitmap_Reference.md
@@ -434,30 +434,26 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>exchanges <a href='#Bitmap'>Bitmap</a> pair</td>
   </tr>
   <tr>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Bitmap'>Bitmap</a> to machine readable form</td>
-  </tr>
-  <tr style='background-color: #f0f0f0; '>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_tryAllocN32Pixels'>tryAllocN32Pixels</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>allocates compatible ARGB pixels if possible</td>
   </tr>
-  <tr>
+  <tr style='background-color: #f0f0f0; '>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_tryAllocPixels'>tryAllocPixels</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>allocates pixels from <a href='SkImageInfo_Reference#Image_Info'>Image Info</a> if possible</td>
   </tr>
-  <tr style='background-color: #f0f0f0; '>
+  <tr>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_tryAllocPixelsFlags'>tryAllocPixelsFlags</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>allocates pixels from <a href='SkImageInfo_Reference#Image_Info'>Image Info</a> with options if possible</td>
   </tr>
-  <tr>
+  <tr style='background-color: #f0f0f0; '>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_validate'>validate</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>asserts if <a href='#Bitmap'>Bitmap</a> is invalid (debug only)</td>
   </tr>
-  <tr style='background-color: #f0f0f0; '>
+  <tr>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_width'>width</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>returns pixel column count</td>
   </tr>
-  <tr>
+  <tr style='background-color: #f0f0f0; '>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_writePixels'>writePixels</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>copies and converts pixels</td>
   </tr>
@@ -4301,10 +4297,6 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>exchanges <a href='#Bitmap'>Bitmap</a> pair</td>
   </tr>
   <tr>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Bitmap'>Bitmap</a> to machine readable form</td>
-  </tr>
-  <tr style='background-color: #f0f0f0; '>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkBitmap_validate'>validate</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>asserts if <a href='#Bitmap'>Bitmap</a> is invalid (debug only)</td>
   </tr>
@@ -4327,38 +4319,3 @@
 
 ---
 
-<a name='SkBitmap_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-void <a href='#SkBitmap_toString'>toString</a>(<a href='undocumented#SkString'>SkString</a>* str) const;
-</pre>
-
-Creates string representation of <a href='#Bitmap'>Bitmap</a>. The representation is read by
-internal debugging tools.
-
-### Parameters
-
-<table>  <tr>    <td><a name='SkBitmap_toString_str'><code><strong>str</strong></code></a></td>
-    <td>storage for string representation</td>
-  </tr>
-</table>
-
-### Example
-
-<div><fiddle-embed name="6018d98695245510839a318caabba9c9">
-
-#### Example Output
-
-~~~~
-bitmap dimensions (6, 11)
-~~~~
-
-</fiddle-embed></div>
-
-### See Also
-
-<a href='SkPaint_Reference#SkPaint_toString'>SkPaint::toString</a>
-
----
-
diff --git a/site/user/api/SkImage_Reference.md b/site/user/api/SkImage_Reference.md
index 31828c3..d1763ea 100644
--- a/site/user/api/SkImage_Reference.md
+++ b/site/user/api/SkImage_Reference.md
@@ -453,14 +453,10 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>scales and converts one <a href='#Image'>Image</a> to another</td>
   </tr>
   <tr>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkImage_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Image'>Image</a> to machine readable form</td>
-  </tr>
-  <tr style='background-color: #f0f0f0; '>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkImage_uniqueID'>uniqueID</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>returns identifier for <a href='#Image'>Image</a></td>
   </tr>
-  <tr>
+  <tr style='background-color: #f0f0f0; '>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkImage_width'>width</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>returns pixel column count</td>
   </tr>
@@ -2281,44 +2277,9 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkImage_refEncodedData'>refEncodedData</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>returns <a href='#Image'>Image</a> encoded in <a href='undocumented#SkData'>SkData</a> if present</td>
   </tr>
-  <tr style='background-color: #f0f0f0; '>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkImage_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Image'>Image</a> to machine readable form</td>
-  </tr>
 </table>
 
 
-<a name='SkImage_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-const char* <a href='#SkImage_toString'>toString</a>(<a href='undocumented#SkString'>SkString</a>* string) const
-</pre>
-
-Appends <a href='#Image'>Image</a> description to <a href='#SkImage_toString_string'>string</a>, including unique ID, width, height, and
-whether the image is opaque.
-
-### Parameters
-
-<table>  <tr>    <td><a name='SkImage_toString_string'><code><strong>string</strong></code></a></td>
-    <td>storage for description; existing content is preserved</td>
-  </tr>
-</table>
-
-### Return Value
-
-<a href='#SkImage_toString_string'>string</a> appended with <a href='#Image'>Image</a> description
-
-### Example
-
-<div><fiddle-embed name="b112d69ab4eb00ea38a2e01a7d7e740b"></fiddle-embed></div>
-
-### See Also
-
-<a href='SkPaint_Reference#SkPaint_toString'>SkPaint::toString</a>
-
----
-
 <a name='SkImage_makeSubset'></a>
 ## makeSubset
 
diff --git a/site/user/api/SkMatrix_Reference.md b/site/user/api/SkMatrix_Reference.md
index 6815e93..33ad804 100644
--- a/site/user/api/SkMatrix_Reference.md
+++ b/site/user/api/SkMatrix_Reference.md
@@ -496,10 +496,6 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkMatrix_setTranslateY'>setTranslateY</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>sets vertical translation</td>
   </tr>
-  <tr>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkMatrix_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Matrix'>Matrix</a> to machine readable form</td>
-  </tr>
 </table>
 
 
@@ -5341,10 +5337,6 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkMatrix_dump'>dump</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>sends text representation using floats to standard output</td>
   </tr>
-  <tr style='background-color: #f0f0f0; '>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkMatrix_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Matrix'>Matrix</a> to machine readable form</td>
-  </tr>
 </table>
 
 
@@ -5375,45 +5367,7 @@
 
 ### See Also
 
-<a href='#SkMatrix_toString'>toString</a>
-
----
-
-<a name='SkMatrix_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-void <a href='#SkMatrix_toString'>toString</a>(<a href='undocumented#SkString'>SkString</a>* str) const
-</pre>
-
-Creates string representation of <a href='#Matrix'>Matrix</a>. Floating point values
-are written with limited precision; it may not be possible to reconstruct
-original <a href='#Matrix'>Matrix</a> from output.
-
-### Parameters
-
-<table>  <tr>    <td><a name='SkMatrix_toString_str'><code><strong>str</strong></code></a></td>
-    <td>storage for string representation of <a href='#Matrix'>Matrix</a></td>
-  </tr>
-</table>
-
-### Example
-
-<div><fiddle-embed name="1d86e43958e42b8eaaa9b16df1baa4c8">
-
-#### Example Output
-
-~~~~
-mStr  [  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
-neStr [  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]
-matrix != nearlyEqual
-~~~~
-
-</fiddle-embed></div>
-
-### See Also
-
-<a href='#SkMatrix_dump'>dump</a>
+<a href='SkPath_Reference#SkPath_dump'>SkPath::dump</a><sup><a href='SkPath_Reference#SkPath_dump_2'>[2]</a></sup>
 
 ---
 
diff --git a/site/user/api/SkPaint_Reference.md b/site/user/api/SkPaint_Reference.md
index 725281a..8a07616 100644
--- a/site/user/api/SkPaint_Reference.md
+++ b/site/user/api/SkPaint_Reference.md
@@ -907,10 +907,6 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkPaint_textToGlyphs'>textToGlyphs</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts text into glyph indices</td>
   </tr>
-  <tr>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkPaint_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Paint'>Paint</a> to machine readable form</td>
-  </tr>
 </table>
 
 
@@ -6175,45 +6171,4 @@
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkPaint_textToGlyphs'>textToGlyphs</a></td>
     <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts text into glyph indices</td>
   </tr>
-  <tr>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '><a href='#SkPaint_toString'>toString</a></td>
-    <td style='text-align: left; border: 2px solid #dddddd; padding: 8px; '>converts <a href='#Paint'>Paint</a> to machine readable form</td>
-  </tr>
 </table>
-
-
-<a name='SkPaint_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-void <a href='#SkPaint_toString'>toString</a>(<a href='undocumented#SkString'>SkString</a>* str) const
-</pre>
-
-Creates string representation of <a href='#Paint'>Paint</a>. The representation is read by
-internal debugging tools.
-
-### Parameters
-
-<table>  <tr>    <td><a name='SkPaint_toString_str'><code><strong>str</strong></code></a></td>
-    <td>storage for string representation of <a href='#Paint'>Paint</a></td>
-  </tr>
-</table>
-
-### Example
-
-<div><fiddle-embed name="5670c04b4562908169a776c48c92d104">
-
-#### Example Output
-
-~~~~
-text size = 12
-~~~~
-
-</fiddle-embed></div>
-
-### See Also
-
-<a href='undocumented#SkPathEffect_toString'>SkPathEffect::toString</a> <a href='undocumented#SkMaskFilter_toString'>SkMaskFilter::toString</a> <a href='undocumented#SkColorFilter_toString'>SkColorFilter::toString</a> <a href='undocumented#SkImageFilter_toString'>SkImageFilter::toString</a>
-
----
-
diff --git a/site/user/api/catalog.htm b/site/user/api/catalog.htm
index c60c419..6850383 100644
--- a/site/user/api/catalog.htm
+++ b/site/user/api/catalog.htm
@@ -336,13 +336,6 @@
     "name": "SkBitmap::swap()",
         "stdout": "one width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType\\ntwo width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType\\none width:2 height:2 colorType:kBGRA_8888_SkColorType alphaType:kPremul_SkAlphaType\\ntwo width:1 height:1 colorType:kRGBA_8888_SkColorType alphaType:kOpaque_SkAlphaType\\n"
     },
-        "SkBitmap_toString": {
-    "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    int width = 6;\n    int height = 11;\n    bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height));\n    SkString string;\n    bitmap.toString(&string);\n    SkString match;\n    match.printf(\"(%d, %d)\", width, height);\n    int start = string.find(match.c_str());\n    if (start >= 0) {\n        SkString whStr(&string.c_str()[start], match.size());\n        SkDebugf(\"bitmap dimensions %s\\n\", whStr.c_str());\n    }\n}",
-    "hash": "6018d98695245510839a318caabba9c9",
-    "file": "SkBitmap_Reference",
-    "name": "SkBitmap::toString",
-        "stdout": "bitmap dimensions (6, 11)\\n"
-    },
         "SkBitmap_tryAllocPixelsFlags": {
     "code": "void draw(SkCanvas* canvas) {\n    SkBitmap bitmap;\n    if (!bitmap.tryAllocPixelsFlags(SkImageInfo::MakeN32(10000, 10000, kOpaque_SkAlphaType),\n                                    SkBitmap::kZeroPixels_AllocFlag)) {\n        SkDebugf(\"bitmap allocation failed!\\n\");\n    } else {\n        SkDebugf(\"bitmap allocation succeeded!\\n\");\n    }\n}",
     "hash": "f1d1880d38e0aea4cefd3e11745e8a09",
@@ -1442,13 +1435,6 @@
     "name": "SkMatrix::setScaleTranslate",
         "stdout": "[  1.0000   0.0000   3.0000][  0.0000   2.0000   4.0000][  0.0000   0.0000   1.0000]\\n"
     },
-        "SkMatrix_toString": {
-    "code": "void draw(SkCanvas* canvas) {\n    SkMatrix matrix;\n    matrix.setRotate(45);\n    SkString mStr, neStr;\n    matrix.toString(&mStr);\n    SkMatrix nearlyEqual;\n    nearlyEqual.setAll(0.7071f, -0.7071f, 0,   0.7071f, 0.7071f, 0,   0, 0, 1);\n    nearlyEqual.toString(&neStr);\n    SkDebugf(\"mStr  %s\\n\", mStr.c_str());\n    SkDebugf(\"neStr %s\\n\", neStr.c_str());\n    SkDebugf(\"matrix %c= nearlyEqual\\n\", matrix == nearlyEqual ? '=' : '!');\n}",
-    "hash": "1d86e43958e42b8eaaa9b16df1baa4c8",
-    "file": "SkMatrix_Reference",
-    "name": "SkMatrix::toString",
-        "stdout": "mStr  [  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]\\nneStr [  0.7071  -0.7071   0.0000][  0.7071   0.7071   0.0000][  0.0000   0.0000   1.0000]\\nmatrix != nearlyEqual\\n"
-    },
         "SkPaint_containsText": {
     "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    const uint16_t goodChar = 0x00B0;  // degree symbol\n    const uint16_t badChar = 0xD800;   // Unicode surrogate\n    paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);\n    SkDebugf(\"0x%04x %c= has char\\n\", goodChar,\n            paint.containsText(&goodChar, 2) ? '=' : '!');\n    SkDebugf(\"0x%04x %c= has char\\n\", badChar,\n            paint.containsText(&badChar, 2) ? '=' : '!');\n}",
     "hash": "71b417d6651cbcecae1a05067c94ab3e",
@@ -1981,13 +1967,6 @@
     "name": "SkPaint::setVerticalText",
         "stdout": "paint1 == paint2\\n"
     },
-        "SkPaint_toString": {
-    "code": "void draw(SkCanvas* canvas) {\n    SkPaint paint;\n    SkString str;\n    paint.toString(&str);\n    const char textSize[] = \"TextSize:\";\n    const int trailerSize = strlen(\"</dd><dt>\");\n    int textSizeLoc = str.find(textSize) + strlen(textSize) + trailerSize;\n    const char* sizeStart = &str.c_str()[textSizeLoc];\n    int textSizeEnd = SkStrFind(sizeStart, \"</dd>\");\n    SkDebugf(\"text size = %.*s\\n\", textSizeEnd, sizeStart);\n}",
-    "hash": "5670c04b4562908169a776c48c92d104",
-    "file": "SkPaint_Reference",
-    "name": "SkPaint::toString",
-        "stdout": "text size = 12\\n"
-    },
         "SkPath_ConvertToNonInverseFillType": {
     "code": "#define nameValue(fill) { SkPath::fill, #fill }\n\nvoid draw(SkCanvas* canvas) {\n    struct {\n        SkPath::FillType fill;\n        const char* name;\n    } fills[] = {\n        nameValue(kWinding_FillType),\n        nameValue(kEvenOdd_FillType),\n        nameValue(kInverseWinding_FillType),\n        nameValue(kInverseEvenOdd_FillType),\n    };\n    for (unsigned i = 0; i < SK_ARRAY_COUNT(fills); ++i) {\n        if (fills[i].fill != (SkPath::FillType) i) {\n            SkDebugf(\"fills array order does not match FillType enum order\");\n            break;\n        }\n        SkDebugf(\"ConvertToNonInverseFillType(%s) == %s\\n\", fills[i].name,\n                fills[(int) SkPath::ConvertToNonInverseFillType(fills[i].fill)].name);\n    }\n}\n",
     "hash": "319f6b124458dcc0f9ce4d7bbde65810",
@@ -5541,14 +5520,6 @@
     "file": "SkImage_Reference",
     "name": "SkImage::scalePixels"
 },
-    "SkImage_toString": {
-    "code": "void draw(SkCanvas* canvas) {\n    struct {\n        const char* name;\n        sk_sp<SkImage> image;\n    } tests[] = { { \"image\", image }, { \"bitmap\", SkImage::MakeFromBitmap(source) },\n          { \"texture\", SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,\n                            kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,\n                            kOpaque_SkAlphaType, nullptr) } };\n    SkString string;\n    SkPaint paint;\n    for (const auto& test : tests ) {\n        string.printf(\"%s: \", test.name);\n        test.image ? (void) test.image->toString(&string) : string.append(\"no image\");\n        canvas->drawString(string, 10, 20, paint);\n        canvas->translate(0, 20);\n    }\n}",
-    "width": 256,
-    "height": 256,
-    "hash": "b112d69ab4eb00ea38a2e01a7d7e740b",
-    "file": "SkImage_Reference",
-    "name": "SkImage::toString"
-},
     "SkImage_uniqueID": {
     "code": "void draw(SkCanvas* canvas) {\n    sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});\n    canvas->drawImage(image, 0, 0);\n    canvas->drawImage(subset, 128, 0);\n    SkPaint paint;\n    SkString s;\n    s.printf(\"original id: %d\", image->uniqueID());\n    canvas->drawString(s, 20, image->height() + 20, paint);\n    s.printf(\"subset id: %d\", subset->uniqueID());\n    canvas->drawString(s, 148, subset->height() + 20, paint);\n}",
     "width": 256,
diff --git a/site/user/api/undocumented.md b/site/user/api/undocumented.md
index e1ae55b..4a98ee8 100644
--- a/site/user/api/undocumented.md
+++ b/site/user/api/undocumented.md
@@ -73,15 +73,6 @@
 
 # <a name='SkColorFilter'>Class SkColorFilter</a>
 
-<a name='SkColorFilter_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-void <a href='#SkColorFilter_toString'>toString</a>(<a href='#SkString'>SkString</a>* str) const
-</pre>
-
----
-
 # <a name='Color_Space'>Color Space</a>
 
 # <a name='SkColorSpace'>Class SkColorSpace</a>
@@ -311,15 +302,6 @@
 
 # <a name='SkImageFilter'>Class SkImageFilter</a>
 
-<a name='SkImageFilter_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-void <a href='#SkImageFilter_toString'>toString</a>(<a href='#SkString'>SkString</a>* str) const
-</pre>
-
----
-
 # <a name='Image_Scaling'>Image Scaling</a>
 
 # <a name='Kerning'>Kerning</a>
@@ -334,15 +316,6 @@
 
 # <a name='SkMaskFilter'>Class SkMaskFilter</a>
 
-<a name='SkMaskFilter_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-void <a href='#SkMaskFilter_toString'>toString</a>(<a href='#SkString'>SkString</a>* str) const
-</pre>
-
----
-
 # <a name='Meta_Data'>Meta Data</a>
 
 # <a name='SkMetaData'>Class SkMetaData</a>
@@ -410,15 +383,6 @@
 
 # <a name='SkPathEffect'>Class SkPathEffect</a>
 
-<a name='SkPathEffect_toString'></a>
-## toString
-
-<pre style="padding: 1em 1em 1em 1em; width: 62.5em;background-color: #f0f0f0">
-void <a href='#SkPathEffect_toString'>toString</a>(<a href='#SkString'>SkString</a>* str) const
-</pre>
-
----
-
 # <a name='Picture'>Picture</a>
 
 # <a name='SkPicture'>Class SkPicture</a>
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 1b6b6b2..29a1a56 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -632,33 +632,6 @@
 }
 #endif
 
-#include "SkString.h"
-void SkBitmap::toString(SkString* str) const {
-
-    static const char* gColorTypeNames[kLastEnum_SkColorType + 1] = {
-        "UNKNOWN", "A8", "565", "4444", "RGBA", "BGRA", "INDEX8",
-    };
-
-    str->appendf("bitmap: ((%d, %d) %s", this->width(), this->height(),
-                 gColorTypeNames[this->colorType()]);
-
-    str->append(" (");
-    if (this->isOpaque()) {
-        str->append("opaque");
-    } else {
-        str->append("transparent");
-    }
-    if (this->isImmutable()) {
-        str->append(", immutable");
-    } else {
-        str->append(", not-immutable");
-    }
-    str->append(")");
-
-    str->appendf(" pixelref:%p", this->pixelRef());
-    str->append(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 bool SkBitmap::peekPixels(SkPixmap* pmap) const {
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp
index 9c72302..ee6100a 100644
--- a/src/core/SkBlitter.cpp
+++ b/src/core/SkBlitter.cpp
@@ -861,19 +861,6 @@
         typedef Context INHERITED;
     };
 
-    void toString(SkString* str) const override {
-        str->append("Sk3DShader: (");
-
-        if (fProxy) {
-            str->append("Proxy: ");
-            as_SB(fProxy)->toString(str);
-        }
-
-        this->INHERITED::toString(str);
-
-        str->append(")");
-    }
-
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(Sk3DShader)
 
 protected:
diff --git a/src/core/SkBlurImageFilter.cpp b/src/core/SkBlurImageFilter.cpp
index a53d061..8186448 100644
--- a/src/core/SkBlurImageFilter.cpp
+++ b/src/core/SkBlurImageFilter.cpp
@@ -41,7 +41,6 @@
 
     SkRect computeFastBounds(const SkRect&) const override;
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurImageFilterImpl)
 
 protected:
@@ -697,15 +696,3 @@
     SkVector sigma = map_sigma(fSigma, ctm);
     return src.makeOutset(SkScalarCeilToInt(sigma.x() * 3), SkScalarCeilToInt(sigma.y() * 3));
 }
-
-void SkBlurImageFilterImpl::toString(SkString* str) const {
-    str->appendf("SkBlurImageFilterImpl: (");
-    str->appendf("sigma: (%f, %f) tileMode: %d input (", fSigma.fWidth, fSigma.fHeight,
-                 static_cast<int>(fTileMode));
-
-    if (this->getInput(0)) {
-        this->getInput(0)->toString(str);
-    }
-
-    str->append("))");
-}
diff --git a/src/core/SkBlurMF.cpp b/src/core/SkBlurMF.cpp
index d716c33..23cca83 100644
--- a/src/core/SkBlurMF.cpp
+++ b/src/core/SkBlurMF.cpp
@@ -77,7 +77,6 @@
     void computeFastBounds(const SkRect&, SkRect*) const override;
     bool asABlur(BlurRec*) const override;
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl)
 
 protected:
@@ -992,23 +991,6 @@
 
 #endif // SK_SUPPORT_GPU
 
-
-void SkBlurMaskFilterImpl::toString(SkString* str) const {
-    str->append("SkBlurMaskFilterImpl: (");
-
-    str->append("sigma: ");
-    str->appendScalar(fSigma);
-    str->append(" ");
-
-    static const char* gStyleName[kLastEnum_SkBlurStyle + 1] = {
-        "normal", "solid", "outer", "inner"
-    };
-
-    str->appendf("style: %s ", gStyleName[fBlurStyle]);
-    str->appendf("respectCTM: %s ", fRespectCTM ? "true" : "false");
-    str->append(")");
-}
-
 void sk_register_blur_maskfilter_createproc() {
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
 }
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index 5362c1a..41ebb42 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -98,15 +98,6 @@
         return fOuter->getFlags() & fInner->getFlags();
     }
 
-    void toString(SkString* str) const override {
-        SkString outerS, innerS;
-        fOuter->toString(&outerS);
-        fInner->toString(&innerS);
-        // These strings can be long.  SkString::appendf has limitations.
-        str->append(SkStringPrintf("SkComposeColorFilter: outer(%s) inner(%s)", outerS.c_str(),
-                                   innerS.c_str()));
-    }
-
     void onAppendStages(SkRasterPipeline* p, SkColorSpace* dst, SkArenaAlloc* scratch,
                         bool shaderIsOpaque) const override {
         bool innerIsOpaque = shaderIsOpaque;
@@ -225,8 +216,6 @@
     }
 #endif
 
-    void toString(SkString* str) const override;
-
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSRGBGammaColorFilter)
 
     void onAppendStages(SkRasterPipeline* p, SkColorSpace*, SkArenaAlloc* alloc,
@@ -267,10 +256,6 @@
     return sk_sp<SkFlattenable>(new SkSRGBGammaColorFilter(static_cast<Direction>(dir)));
 }
 
-void SkSRGBGammaColorFilter::toString(SkString* str) const {
-    str->append("srgbgamma");
-}
-
 template <SkSRGBGammaColorFilter::Direction dir>
 sk_sp<SkColorFilter> MakeSRGBGammaCF() {
     static SkColorFilter* gSingleton = new SkSRGBGammaColorFilter(dir);
diff --git a/src/core/SkColorMatrixFilterRowMajor255.cpp b/src/core/SkColorMatrixFilterRowMajor255.cpp
index 6134785..9a8256e 100644
--- a/src/core/SkColorMatrixFilterRowMajor255.cpp
+++ b/src/core/SkColorMatrixFilterRowMajor255.cpp
@@ -299,19 +299,6 @@
 
 #endif
 
-void SkColorMatrixFilterRowMajor255::toString(SkString* str) const {
-    str->append("SkColorMatrixFilterRowMajor255: ");
-
-    str->append("matrix: (");
-    for (int i = 0; i < 20; ++i) {
-        str->appendScalar(fMatrix[i]);
-        if (i < 19) {
-            str->append(", ");
-        }
-    }
-    str->append(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 sk_sp<SkColorFilter> SkColorFilter::MakeMatrixFilterRowMajor255(const SkScalar array[20]) {
diff --git a/src/core/SkColorMatrixFilterRowMajor255.h b/src/core/SkColorMatrixFilterRowMajor255.h
index 8c77450..968c4c8 100644
--- a/src/core/SkColorMatrixFilterRowMajor255.h
+++ b/src/core/SkColorMatrixFilterRowMajor255.h
@@ -28,8 +28,6 @@
             GrContext*, const GrColorSpaceInfo&) const override;
 #endif
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index 000be07..de6eaea 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -77,8 +77,6 @@
 
     bool isOpaque() const override { return fIsOpaque; }
 
-    void toString(SkString* str) const override;
-
     // For serialization.  This will never be called.
     Factory getFactory() const override { SK_ABORT("not reached"); return nullptr; }
 
@@ -99,14 +97,6 @@
     typedef SkShaderBase INHERITED;
 };
 
-void SkTriColorShader::toString(SkString* str) const {
-    str->append("SkTriColorShader: (");
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
-
 static bool SK_WARN_UNUSED_RESULT
 update_tricolor_matrix(const SkMatrix& ctmInv, const SkPoint pts[], const SkPM4f colors[],
                        int index0, int index1, int index2, Matrix43* result) {
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index fe97d24..9996c5f 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -28,35 +28,6 @@
 #include "SkGr.h"
 #endif
 
-void SkImageFilter::CropRect::toString(SkString* str) const {
-    if (!fFlags) {
-        return;
-    }
-
-    str->appendf("cropRect (");
-    if (fFlags & CropRect::kHasLeft_CropEdge) {
-        str->appendf("%.2f, ", fRect.fLeft);
-    } else {
-        str->appendf("X, ");
-    }
-    if (fFlags & CropRect::kHasTop_CropEdge) {
-        str->appendf("%.2f, ", fRect.fTop);
-    } else {
-        str->appendf("X, ");
-    }
-    if (fFlags & CropRect::kHasWidth_CropEdge) {
-        str->appendf("%.2f, ", fRect.width());
-    } else {
-        str->appendf("X, ");
-    }
-    if (fFlags & CropRect::kHasHeight_CropEdge) {
-        str->appendf("%.2f", fRect.height());
-    } else {
-        str->appendf("X");
-    }
-    str->appendf(") ");
-}
-
 void SkImageFilter::CropRect::applyTo(const SkIRect& imageBounds,
                                       const SkMatrix& ctm,
                                       bool embiggen,
diff --git a/src/core/SkLocalMatrixImageFilter.cpp b/src/core/SkLocalMatrixImageFilter.cpp
index 07db7af..fb484c9 100644
--- a/src/core/SkLocalMatrixImageFilter.cpp
+++ b/src/core/SkLocalMatrixImageFilter.cpp
@@ -67,8 +67,3 @@
     }
     return this->refMe();
 }
-
-void SkLocalMatrixImageFilter::toString(SkString* str) const {
-    str->append("SkLocalMatrixImageFilter: (");
-    str->append(")");
-}
diff --git a/src/core/SkLocalMatrixImageFilter.h b/src/core/SkLocalMatrixImageFilter.h
index f4ca73c..8a3ee2c 100644
--- a/src/core/SkLocalMatrixImageFilter.h
+++ b/src/core/SkLocalMatrixImageFilter.h
@@ -19,8 +19,6 @@
 public:
     static sk_sp<SkImageFilter> Make(const SkMatrix& localM, sk_sp<SkImageFilter> input);
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
index 52cdc3c..3ff4f93 100644
--- a/src/core/SkMaskFilter.cpp
+++ b/src/core/SkMaskFilter.cpp
@@ -405,7 +405,6 @@
     }
 
     SkMask::Format getFormat() const override { return SkMask::kA8_Format; }
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeMF)
 
 protected:
@@ -470,10 +469,6 @@
     return SkMaskFilter::MakeCompose(std::move(outer), std::move(inner));
 }
 
-void SkComposeMF::toString(SkString* str) const {
-    str->set("SkComposeMF:");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class SkCombineMF : public SkMaskFilterBase {
@@ -498,7 +493,6 @@
 
     SkMask::Format getFormat() const override { return SkMask::kA8_Format; }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkCombineMF)
 
 protected:
@@ -625,10 +619,6 @@
     return SkMaskFilter::MakeCombine(std::move(dst), std::move(src), mode);
 }
 
-void SkCombineMF::toString(SkString* str) const {
-    str->set("SkCombineMF:");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class SkMatrixMF : public SkMaskFilterBase {
@@ -652,10 +642,6 @@
 
     SkMask::Format getFormat() const override { return as_MFB(fFilter)->getFormat(); }
 
-    void toString(SkString* str) const override {
-        str->set("SkMatrixMF:");
-    }
-
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixMF)
 
 protected:
diff --git a/src/core/SkMatrix.cpp b/src/core/SkMatrix.cpp
index 990f5b4..d3bdb38 100644
--- a/src/core/SkMatrix.cpp
+++ b/src/core/SkMatrix.cpp
@@ -1659,14 +1659,10 @@
 
 void SkMatrix::dump() const {
     SkString str;
-    this->toString(&str);
-    SkDebugf("%s\n", str.c_str());
-}
-
-void SkMatrix::toString(SkString* str) const {
-    str->appendf("[%8.4f %8.4f %8.4f][%8.4f %8.4f %8.4f][%8.4f %8.4f %8.4f]",
+    str.appendf("[%8.4f %8.4f %8.4f][%8.4f %8.4f %8.4f][%8.4f %8.4f %8.4f]",
              fMat[0], fMat[1], fMat[2], fMat[3], fMat[4], fMat[5],
              fMat[6], fMat[7], fMat[8]);
+    SkDebugf("%s\n", str.c_str());
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkMatrixImageFilter.cpp b/src/core/SkMatrixImageFilter.cpp
index 47b0d42..e56abbc 100644
--- a/src/core/SkMatrixImageFilter.cpp
+++ b/src/core/SkMatrixImageFilter.cpp
@@ -143,25 +143,3 @@
 
     return result;
 }
-
-void SkMatrixImageFilter::toString(SkString* str) const {
-    str->appendf("SkMatrixImageFilter: (");
-
-    str->appendf("transform: (%f %f %f %f %f %f %f %f %f)",
-                 fTransform[SkMatrix::kMScaleX],
-                 fTransform[SkMatrix::kMSkewX],
-                 fTransform[SkMatrix::kMTransX],
-                 fTransform[SkMatrix::kMSkewY],
-                 fTransform[SkMatrix::kMScaleY],
-                 fTransform[SkMatrix::kMTransY],
-                 fTransform[SkMatrix::kMPersp0],
-                 fTransform[SkMatrix::kMPersp1],
-                 fTransform[SkMatrix::kMPersp2]);
-
-    str->append("<dt>FilterLevel:</dt><dd>");
-    static const char* gFilterLevelStrings[] = { "None", "Low", "Medium", "High" };
-    str->append(gFilterLevelStrings[fFilterQuality]);
-    str->append("</dd>");
-
-    str->appendf(")");
-}
diff --git a/src/core/SkMatrixImageFilter.h b/src/core/SkMatrixImageFilter.h
index 32d4adc..a100aec 100644
--- a/src/core/SkMatrixImageFilter.h
+++ b/src/core/SkMatrixImageFilter.h
@@ -32,8 +32,6 @@
 
     SkRect computeFastBounds(const SkRect&) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 protected:
diff --git a/src/core/SkModeColorFilter.cpp b/src/core/SkModeColorFilter.cpp
index b3d6aa2..7e1e26e 100644
--- a/src/core/SkModeColorFilter.cpp
+++ b/src/core/SkModeColorFilter.cpp
@@ -31,13 +31,6 @@
     fPMColor = SkPreMultiplyColor(fColor);
 }
 
-void SkModeColorFilter::toString(SkString* str) const {
-    str->append("SkModeColorFilter: color: 0x");
-    str->appendHex(fColor);
-    str->append(" mode: ");
-    str->append(SkBlendMode_Name(fMode));
-}
-
 bool SkModeColorFilter::asColorMode(SkColor* color, SkBlendMode* mode) const {
     if (color) {
         *color = fColor;
diff --git a/src/core/SkModeColorFilter.h b/src/core/SkModeColorFilter.h
index d2018e5..c78d789 100644
--- a/src/core/SkModeColorFilter.h
+++ b/src/core/SkModeColorFilter.h
@@ -23,8 +23,6 @@
     bool asColorMode(SkColor*, SkBlendMode*) const override;
     uint32_t getFlags() const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 #if SK_SUPPORT_GPU
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 82dec0ea..c76b981 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -1384,155 +1384,6 @@
     return *storage;
 }
 
-void SkPaint::toString(SkString* str) const {
-    str->append("<dl><dt>SkPaint:</dt><dd><dl>");
-
-    SkTypeface* typeface = this->getTypeface();
-    if (typeface) {
-        SkDynamicMemoryWStream ostream;
-        typeface->serialize(&ostream);
-        std::unique_ptr<SkStreamAsset> istream(ostream.detachAsStream());
-
-        SkFontDescriptor descriptor;
-        if (!SkFontDescriptor::Deserialize(istream.get(), &descriptor)) {
-            str->append("<dt>FontDescriptor deserialization failed</dt>");
-        } else {
-            str->append("<dt>Font Family Name:</dt><dd>");
-            str->append(descriptor.getFamilyName());
-            str->append("</dd><dt>Font Full Name:</dt><dd>");
-            str->append(descriptor.getFullName());
-            str->append("</dd><dt>Font PS Name:</dt><dd>");
-            str->append(descriptor.getPostscriptName());
-            str->append("</dd>");
-        }
-    }
-
-    str->append("<dt>TextSize:</dt><dd>");
-    str->appendScalar(this->getTextSize());
-    str->append("</dd>");
-
-    str->append("<dt>TextScaleX:</dt><dd>");
-    str->appendScalar(this->getTextScaleX());
-    str->append("</dd>");
-
-    str->append("<dt>TextSkewX:</dt><dd>");
-    str->appendScalar(this->getTextSkewX());
-    str->append("</dd>");
-
-    SkPathEffect* pathEffect = this->getPathEffect();
-    if (pathEffect) {
-        str->append("<dt>PathEffect:</dt><dd>");
-        pathEffect->toString(str);
-        str->append("</dd>");
-    }
-
-    if (const auto* shader = as_SB(this->getShader())) {
-        str->append("<dt>Shader:</dt><dd>");
-        shader->toString(str);
-        str->append("</dd>");
-    }
-
-    if (!this->isSrcOver()) {
-        str->appendf("<dt>Xfermode:</dt><dd>%d</dd>", fBlendMode);
-    }
-
-    SkMaskFilter* maskFilter = this->getMaskFilter();
-    if (maskFilter) {
-        str->append("<dt>MaskFilter:</dt><dd>");
-        as_MFB(maskFilter)->toString(str);
-        str->append("</dd>");
-    }
-
-    SkColorFilter* colorFilter = this->getColorFilter();
-    if (colorFilter) {
-        str->append("<dt>ColorFilter:</dt><dd>");
-        colorFilter->toString(str);
-        str->append("</dd>");
-    }
-
-    SkDrawLooper* looper = this->getLooper();
-    if (looper) {
-        str->append("<dt>DrawLooper:</dt><dd>");
-        looper->toString(str);
-        str->append("</dd>");
-    }
-
-    SkImageFilter* imageFilter = this->getImageFilter();
-    if (imageFilter) {
-        str->append("<dt>ImageFilter:</dt><dd>");
-        imageFilter->toString(str);
-        str->append("</dd>");
-    }
-
-    str->append("<dt>Color:</dt><dd>0x");
-    SkColor color = this->getColor();
-    str->appendHex(color);
-    str->append("</dd>");
-
-    str->append("<dt>Stroke Width:</dt><dd>");
-    str->appendScalar(this->getStrokeWidth());
-    str->append("</dd>");
-
-    str->append("<dt>Stroke Miter:</dt><dd>");
-    str->appendScalar(this->getStrokeMiter());
-    str->append("</dd>");
-
-    str->append("<dt>Flags:</dt><dd>(");
-    if (this->getFlags()) {
-        bool needSeparator = false;
-        SkAddFlagToString(str, this->isAntiAlias(), "AntiAlias", &needSeparator);
-        SkAddFlagToString(str, this->isDither(), "Dither", &needSeparator);
-        SkAddFlagToString(str, this->isFakeBoldText(), "FakeBoldText", &needSeparator);
-        SkAddFlagToString(str, this->isLinearText(), "LinearText", &needSeparator);
-        SkAddFlagToString(str, this->isSubpixelText(), "SubpixelText", &needSeparator);
-        SkAddFlagToString(str, this->isLCDRenderText(), "LCDRenderText", &needSeparator);
-        SkAddFlagToString(str, this->isEmbeddedBitmapText(),
-                          "EmbeddedBitmapText", &needSeparator);
-        SkAddFlagToString(str, this->isAutohinted(), "Autohinted", &needSeparator);
-        SkAddFlagToString(str, this->isVerticalText(), "VerticalText", &needSeparator);
-    } else {
-        str->append("None");
-    }
-    str->append(")</dd>");
-
-    str->append("<dt>FilterLevel:</dt><dd>");
-    static const char* gFilterQualityStrings[] = { "None", "Low", "Medium", "High" };
-    str->append(gFilterQualityStrings[this->getFilterQuality()]);
-    str->append("</dd>");
-
-    str->append("<dt>TextAlign:</dt><dd>");
-    static const char* gTextAlignStrings[SkPaint::kAlignCount] = { "Left", "Center", "Right" };
-    str->append(gTextAlignStrings[this->getTextAlign()]);
-    str->append("</dd>");
-
-    str->append("<dt>CapType:</dt><dd>");
-    static const char* gStrokeCapStrings[SkPaint::kCapCount] = { "Butt", "Round", "Square" };
-    str->append(gStrokeCapStrings[this->getStrokeCap()]);
-    str->append("</dd>");
-
-    str->append("<dt>JoinType:</dt><dd>");
-    static const char* gJoinStrings[SkPaint::kJoinCount] = { "Miter", "Round", "Bevel" };
-    str->append(gJoinStrings[this->getStrokeJoin()]);
-    str->append("</dd>");
-
-    str->append("<dt>Style:</dt><dd>");
-    static const char* gStyleStrings[SkPaint::kStyleCount] = { "Fill", "Stroke", "StrokeAndFill" };
-    str->append(gStyleStrings[this->getStyle()]);
-    str->append("</dd>");
-
-    str->append("<dt>TextEncoding:</dt><dd>");
-    static const char* gTextEncodingStrings[] = { "UTF8", "UTF16", "UTF32", "GlyphID" };
-    str->append(gTextEncodingStrings[this->getTextEncoding()]);
-    str->append("</dd>");
-
-    str->append("<dt>Hinting:</dt><dd>");
-    static const char* gHintingStrings[] = { "None", "Slight", "Normal", "Full" };
-    str->append(gHintingStrings[this->getHinting()]);
-    str->append("</dd>");
-
-    str->append("</dd></dl></dl>");
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 static bool has_thick_frame(const SkPaint& paint) {
diff --git a/src/core/SkPathEffect.cpp b/src/core/SkPathEffect.cpp
index 09d7e54..e315275 100644
--- a/src/core/SkPathEffect.cpp
+++ b/src/core/SkPathEffect.cpp
@@ -51,23 +51,10 @@
     sk_sp<SkPathEffect> fPE0;
     sk_sp<SkPathEffect> fPE1;
 
-    void toString(SkString* str) const override;
-
 private:
     typedef SkPathEffect INHERITED;
 };
 
-void SkPairPathEffect::toString(SkString* str) const {
-    str->appendf("first: ");
-    if (fPE0) {
-        fPE0->toString(str);
-    }
-    str->appendf(" second: ");
-    if (fPE1) {
-        fPE1->toString(str);
-    }
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 /** \class SkComposePathEffect
@@ -104,7 +91,6 @@
     }
 
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposePathEffect)
 
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
@@ -130,12 +116,6 @@
     return SkComposePathEffect::Make(std::move(pe0), std::move(pe1));
 }
 
-void SkComposePathEffect::toString(SkString* str) const {
-    str->appendf("SkComposePathEffect: (");
-    this->INHERITED::toString(str);
-    str->appendf(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 /** \class SkSumPathEffect
@@ -168,7 +148,6 @@
     }
 
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSumPathEffect)
 
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
@@ -194,12 +173,6 @@
     return SkSumPathEffect::Make(pe0, pe1);
 }
 
-void SkSumPathEffect::toString(SkString* str) const {
-    str->appendf("SkSumPathEffect: (");
-    this->INHERITED::toString(str);
-    str->appendf(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 sk_sp<SkPathEffect> SkPathEffect::MakeSum(sk_sp<SkPathEffect> first, sk_sp<SkPathEffect> second) {
diff --git a/src/core/SkStringUtils.cpp b/src/core/SkStringUtils.cpp
index 9745b23..00d8c87 100644
--- a/src/core/SkStringUtils.cpp
+++ b/src/core/SkStringUtils.cpp
@@ -9,16 +9,6 @@
 #include "SkStringUtils.h"
 #include "SkUtils.h"
 
-void SkAddFlagToString(SkString* string, bool flag, const char* flagStr, bool* needSeparator) {
-    if (flag) {
-        if (*needSeparator) {
-            string->append("|");
-        }
-        string->append(flagStr);
-        *needSeparator = true;
-    }
-}
-
 void SkAppendScalar(SkString* str, SkScalar value, SkScalarAsStringType asType) {
     switch (asType) {
         case kHex_SkScalarAsStringType:
diff --git a/src/core/SkStringUtils.h b/src/core/SkStringUtils.h
index f2a1443..ac587d6 100644
--- a/src/core/SkStringUtils.h
+++ b/src/core/SkStringUtils.h
@@ -12,16 +12,6 @@
 
 class SkString;
 
-/**
- * Add 'flagStr' to 'string' and set 'needSeparator' to true only if 'flag' is
- * true. If 'needSeparator' is true append a '|' before 'flagStr'. This method
- * is used to streamline the creation of ASCII flag strings within the toString
- * methods.
- */
-void SkAddFlagToString(SkString* string, bool flag,
-                       const char* flagStr, bool* needSeparator);
-
-
 enum SkScalarAsStringType {
     kDec_SkScalarAsStringType,
     kHex_SkScalarAsStringType,
diff --git a/src/effects/Sk1DPathEffect.cpp b/src/effects/Sk1DPathEffect.cpp
index 57f2d2b..1837479 100644
--- a/src/effects/Sk1DPathEffect.cpp
+++ b/src/effects/Sk1DPathEffect.cpp
@@ -194,14 +194,6 @@
     return fAdvance;
 }
 
-
-void SkPath1DPathEffect::toString(SkString* str) const {
-    str->appendf("SkPath1DPathEffect: (");
-    // TODO: add path and style
-    str->appendf("advance: %.2f phase %.2f", fAdvance, fInitialOffset);
-    str->appendf(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 sk_sp<SkPathEffect> SkPath1DPathEffect::Make(const SkPath& path, SkScalar advance, SkScalar phase,
diff --git a/src/effects/Sk2DPathEffect.cpp b/src/effects/Sk2DPathEffect.cpp
index a541b91..6c2c4c2 100644
--- a/src/effects/Sk2DPathEffect.cpp
+++ b/src/effects/Sk2DPathEffect.cpp
@@ -74,13 +74,6 @@
     buffer.writeMatrix(fMatrix);
 }
 
-void Sk2DPathEffect::toString(SkString* str) const {
-    str->appendf("(matrix: %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f)",
-            fMatrix[SkMatrix::kMScaleX], fMatrix[SkMatrix::kMSkewX],  fMatrix[SkMatrix::kMTransX],
-            fMatrix[SkMatrix::kMSkewY],  fMatrix[SkMatrix::kMScaleY], fMatrix[SkMatrix::kMTransY],
-            fMatrix[SkMatrix::kMPersp0], fMatrix[SkMatrix::kMPersp1], fMatrix[SkMatrix::kMPersp2]);
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 bool SkLine2DPathEffect::filterPath(SkPath* dst, const SkPath& src,
@@ -117,14 +110,6 @@
     buffer.writeScalar(fWidth);
 }
 
-
-void SkLine2DPathEffect::toString(SkString* str) const {
-    str->appendf("SkLine2DPathEffect: (");
-    this->INHERITED::toString(str);
-    str->appendf("width: %f", fWidth);
-    str->appendf(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 SkPath2DPathEffect::SkPath2DPathEffect(const SkMatrix& m, const SkPath& p)
@@ -148,11 +133,3 @@
                               SkPath* dst) const {
     dst->addPath(fPath, loc.fX, loc.fY);
 }
-
-void SkPath2DPathEffect::toString(SkString* str) const {
-    str->appendf("SkPath2DPathEffect: (");
-    this->INHERITED::toString(str);
-    // TODO: print out path information
-    str->appendf(")");
-}
-
diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp
index f09ec50..5bd2571 100644
--- a/src/effects/SkAlphaThresholdFilter.cpp
+++ b/src/effects/SkAlphaThresholdFilter.cpp
@@ -31,7 +31,6 @@
                                SkScalar outerThreshold, sk_sp<SkImageFilter> input,
                                const CropRect* cropRect = nullptr);
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkAlphaThresholdFilterImpl)
     friend void SkAlphaThresholdFilter::InitializeFlattenables();
 
@@ -281,10 +280,3 @@
     }
     return this->refMe();
 }
-
-void SkAlphaThresholdFilterImpl::toString(SkString* str) const {
-    str->appendf("SkAlphaThresholdImageFilter: (");
-    str->appendf("inner: %f outer: %f", fInnerThreshold, fOuterThreshold);
-    str->append(")");
-}
-
diff --git a/src/effects/SkArithmeticImageFilter.cpp b/src/effects/SkArithmeticImageFilter.cpp
index 9674575..1a16465 100644
--- a/src/effects/SkArithmeticImageFilter.cpp
+++ b/src/effects/SkArithmeticImageFilter.cpp
@@ -37,7 +37,6 @@
                               sk_sp<SkImageFilter> inputs[2], const CropRect* cropRect)
             : INHERITED(inputs, 2, cropRect), fK{k1, k2, k3, k4}, fEnforcePMColor(enforcePMColor) {}
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(ArithmeticImageFilterImpl)
 
 protected:
@@ -431,22 +430,6 @@
     return this->refMe();
 }
 
-void ArithmeticImageFilterImpl::toString(SkString* str) const {
-    str->appendf("SkArithmeticImageFilter: (");
-    str->appendf("K[]: (%f %f %f %f)", fK[0], fK[1], fK[2], fK[3]);
-    if (this->getInput(0)) {
-        str->appendf("foreground: (");
-        this->getInput(0)->toString(str);
-        str->appendf(")");
-    }
-    if (this->getInput(1)) {
-        str->appendf("background: (");
-        this->getInput(1)->toString(str);
-        str->appendf(")");
-    }
-    str->append(")");
-}
-
 sk_sp<SkImageFilter> SkArithmeticImageFilter::Make(float k1, float k2, float k3, float k4,
                                                    bool enforcePMColor,
                                                    sk_sp<SkImageFilter> background,
diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp
index 845a26a..fcbe226 100644
--- a/src/effects/SkColorFilterImageFilter.cpp
+++ b/src/effects/SkColorFilterImageFilter.cpp
@@ -145,18 +145,3 @@
 bool SkColorFilterImageFilter::affectsTransparentBlack() const {
     return fColorFilter->affectsTransparentBlack();
 }
-
-void SkColorFilterImageFilter::toString(SkString* str) const {
-    str->appendf("SkColorFilterImageFilter: (");
-
-    str->appendf("input: (");
-
-    if (this->getInput(0)) {
-        this->getInput(0)->toString(str);
-    }
-
-    str->appendf(") color filter: ");
-    fColorFilter->toString(str);
-
-    str->append(")");
-}
diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp
index 7a562b4..c68c47e 100644
--- a/src/effects/SkColorMatrixFilter.cpp
+++ b/src/effects/SkColorMatrixFilter.cpp
@@ -72,8 +72,6 @@
     }
 #endif
 
-    void toString(SkString* str) const override { fMatrixFilter->toString(str); }
-
 private:
     SkColor              fMul, fAdd;
     sk_sp<SkColorFilter> fMatrixFilter;
diff --git a/src/effects/SkComposeImageFilter.cpp b/src/effects/SkComposeImageFilter.cpp
index 51cec9c..842588d 100644
--- a/src/effects/SkComposeImageFilter.cpp
+++ b/src/effects/SkComposeImageFilter.cpp
@@ -88,17 +88,3 @@
     return SkComposeImageFilter::Make(common.getInput(0), common.getInput(1));
 }
 
-void SkComposeImageFilter::toString(SkString* str) const {
-    SkImageFilter* outer = getInput(0);
-    SkImageFilter* inner = getInput(1);
-
-    str->appendf("SkComposeImageFilter: (");
-
-    str->appendf("outer: ");
-    outer->toString(str);
-
-    str->appendf("inner: ");
-    inner->toString(str);
-
-    str->appendf(")");
-}
diff --git a/src/effects/SkCornerPathEffect.cpp b/src/effects/SkCornerPathEffect.cpp
index ec137b9..a88bc32 100644
--- a/src/effects/SkCornerPathEffect.cpp
+++ b/src/effects/SkCornerPathEffect.cpp
@@ -151,9 +151,3 @@
 void SkCornerPathEffect::flatten(SkWriteBuffer& buffer) const {
     buffer.writeScalar(fRadius);
 }
-
-void SkCornerPathEffect::toString(SkString* str) const {
-    str->appendf("SkCornerPathEffect: (");
-    str->appendf("radius: %.2f", fRadius);
-    str->appendf(")");
-}
diff --git a/src/effects/SkDashImpl.h b/src/effects/SkDashImpl.h
index 13ec155..7f1de77 100644
--- a/src/effects/SkDashImpl.h
+++ b/src/effects/SkDashImpl.h
@@ -21,8 +21,6 @@
 
     DashType asADash(DashInfo* info) const override;
 
-    void toString(SkString* str) const override;
-
     Factory getFactory() const override { return CreateProc; }
 
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
diff --git a/src/effects/SkDashPathEffect.cpp b/src/effects/SkDashPathEffect.cpp
index 1a2c635..c1f5f0a 100644
--- a/src/effects/SkDashPathEffect.cpp
+++ b/src/effects/SkDashPathEffect.cpp
@@ -381,18 +381,6 @@
     return nullptr;
 }
 
-void SkDashImpl::toString(SkString* str) const {
-    str->appendf("SkDashPathEffect: (");
-    str->appendf("count: %d phase %.2f intervals: (", fCount, fPhase);
-    for (int i = 0; i < fCount; ++i) {
-        str->appendf("%.2f", fIntervals[i]);
-        if (i < fCount-1) {
-            str->appendf(", ");
-        }
-    }
-    str->appendf("))");
-}
-
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
 sk_sp<SkPathEffect> SkDashPathEffect::Make(const SkScalar intervals[], int count, SkScalar phase) {
diff --git a/src/effects/SkDiscretePathEffect.cpp b/src/effects/SkDiscretePathEffect.cpp
index 57d8f96..46cd42b 100644
--- a/src/effects/SkDiscretePathEffect.cpp
+++ b/src/effects/SkDiscretePathEffect.cpp
@@ -143,9 +143,3 @@
     buffer.writeScalar(fPerterb);
     buffer.writeUInt(fSeedAssist);
 }
-
-void SkDiscretePathEffect::toString(SkString* str) const {
-    str->appendf("SkDiscretePathEffect: (");
-    str->appendf("segLength: %.2f deviation: %.2f seed %d", fSegLength, fPerterb, fSeedAssist);
-    str->append(")");
-}
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp
index 1d92844..9ac46f1 100644
--- a/src/effects/SkDisplacementMapEffect.cpp
+++ b/src/effects/SkDisplacementMapEffect.cpp
@@ -404,20 +404,6 @@
     return src;
 }
 
-void SkDisplacementMapEffect::toString(SkString* str) const {
-    str->appendf("SkDisplacementMapEffect: (");
-    str->appendf("scale: %f ", fScale);
-    str->appendf("displacement: (");
-    if (this->getDisplacementInput()) {
-        this->getDisplacementInput()->toString(str);
-    }
-    str->appendf(") color: (");
-    if (this->getColorInput()) {
-        this->getColorInput()->toString(str);
-    }
-    str->appendf("))");
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 
 #if SK_SUPPORT_GPU
diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp
index 1a0ce2e..36a9d71 100644
--- a/src/effects/SkDropShadowImageFilter.cpp
+++ b/src/effects/SkDropShadowImageFilter.cpp
@@ -160,24 +160,3 @@
     return dst;
 }
 
-void SkDropShadowImageFilter::toString(SkString* str) const {
-    str->appendf("SkDropShadowImageFilter: (");
-
-    str->appendf("dX: %f ", fDx);
-    str->appendf("dY: %f ", fDy);
-    str->appendf("sigmaX: %f ", fSigmaX);
-    str->appendf("sigmaY: %f ", fSigmaY);
-
-    str->append("Color: ");
-    str->appendHex(fColor);
-
-    static const char* gModeStrings[] = {
-        "kDrawShadowAndForeground", "kDrawShadowOnly"
-    };
-
-    static_assert(kShadowModeCount == SK_ARRAY_COUNT(gModeStrings), "enum_mismatch");
-
-    str->appendf(" mode: %s", gModeStrings[fShadowMode]);
-
-    str->append(")");
-}
diff --git a/src/effects/SkEmbossMaskFilter.cpp b/src/effects/SkEmbossMaskFilter.cpp
index 4a4c8d0..ef26520 100644
--- a/src/effects/SkEmbossMaskFilter.cpp
+++ b/src/effects/SkEmbossMaskFilter.cpp
@@ -140,22 +140,3 @@
     buffer.writeByteArray(&tmpLight, sizeof(tmpLight));
     buffer.writeScalar(fBlurSigma);
 }
-
-void SkEmbossMaskFilter::toString(SkString* str) const {
-    str->append("SkEmbossMaskFilter: (");
-
-    str->append("direction: (");
-    str->appendScalar(fLight.fDirection[0]);
-    str->append(", ");
-    str->appendScalar(fLight.fDirection[1]);
-    str->append(", ");
-    str->appendScalar(fLight.fDirection[2]);
-    str->append(") ");
-
-    str->appendf("ambient: %d specular: %d ",
-        fLight.fAmbient, fLight.fSpecular);
-
-    str->append("blurSigma: ");
-    str->appendScalar(fBlurSigma);
-    str->append(")");
-}
diff --git a/src/effects/SkEmbossMaskFilter.h b/src/effects/SkEmbossMaskFilter.h
index 67d068c..7b58786 100644
--- a/src/effects/SkEmbossMaskFilter.h
+++ b/src/effects/SkEmbossMaskFilter.h
@@ -33,7 +33,6 @@
     bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&,
                     SkIPoint* margin) const override;
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkEmbossMaskFilter)
 
 protected:
diff --git a/src/effects/SkHighContrastFilter.cpp b/src/effects/SkHighContrastFilter.cpp
index b805212..607033e 100644
--- a/src/effects/SkHighContrastFilter.cpp
+++ b/src/effects/SkHighContrastFilter.cpp
@@ -45,8 +45,6 @@
                         SkArenaAlloc* scratch,
                         bool shaderIsOpaque) const override;
 
-    void toString(SkString* str) const override;
-
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkHighContrast_Filter)
 
 protected:
@@ -157,10 +155,6 @@
     return sk_make_sp<SkHighContrast_Filter>(config);
 }
 
-void SkHighContrast_Filter::toString(SkString* str) const {
-    str->append("SkHighContrastColorFilter ");
-}
-
 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkHighContrastFilter)
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkHighContrast_Filter)
 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
diff --git a/src/effects/SkImageSource.cpp b/src/effects/SkImageSource.cpp
index 0f48fb0..960de37 100644
--- a/src/effects/SkImageSource.cpp
+++ b/src/effects/SkImageSource.cpp
@@ -157,12 +157,3 @@
     return dstRect.roundOut();
 }
 
-void SkImageSource::toString(SkString* str) const {
-    str->appendf("SkImageSource: (");
-    str->appendf("src: (%f,%f,%f,%f) dst: (%f,%f,%f,%f) ",
-                 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBottom,
-                 fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBottom);
-    str->appendf("image: (%d,%d)",
-                 fImage->width(), fImage->height());
-    str->append(")");
-}
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp
index db61e08..16108094 100644
--- a/src/effects/SkLayerDrawLooper.cpp
+++ b/src/effects/SkLayerDrawLooper.cpp
@@ -279,62 +279,6 @@
     return builder.detach();
 }
 
-void SkLayerDrawLooper::toString(SkString* str) const {
-    str->appendf("SkLayerDrawLooper (%d): ", fCount);
-
-    Rec* rec = fRecs;
-    for (int i = 0; i < fCount; i++) {
-        str->appendf("%d: paintBits: (", i);
-        if (0 == rec->fInfo.fPaintBits) {
-            str->append("None");
-        } else if (kEntirePaint_Bits == rec->fInfo.fPaintBits) {
-            str->append("EntirePaint");
-        } else {
-            bool needSeparator = false;
-            SkAddFlagToString(str, SkToBool(kStyle_Bit & rec->fInfo.fPaintBits), "Style",
-                              &needSeparator);
-            SkAddFlagToString(str, SkToBool(kTextSkewX_Bit & rec->fInfo.fPaintBits), "TextSkewX",
-                              &needSeparator);
-            SkAddFlagToString(str, SkToBool(kPathEffect_Bit & rec->fInfo.fPaintBits), "PathEffect",
-                              &needSeparator);
-            SkAddFlagToString(str, SkToBool(kMaskFilter_Bit & rec->fInfo.fPaintBits), "MaskFilter",
-                              &needSeparator);
-            SkAddFlagToString(str, SkToBool(kShader_Bit & rec->fInfo.fPaintBits), "Shader",
-                              &needSeparator);
-            SkAddFlagToString(str, SkToBool(kColorFilter_Bit & rec->fInfo.fPaintBits), "ColorFilter",
-                              &needSeparator);
-            SkAddFlagToString(str, SkToBool(kXfermode_Bit & rec->fInfo.fPaintBits), "Xfermode",
-                              &needSeparator);
-        }
-        str->append(") ");
-
-        static const char* gModeStrings[(int)SkBlendMode::kLastMode+1] = {
-            "kClear", "kSrc", "kDst", "kSrcOver", "kDstOver", "kSrcIn", "kDstIn",
-            "kSrcOut", "kDstOut", "kSrcATop", "kDstATop", "kXor", "kPlus",
-            "kMultiply", "kScreen", "kOverlay", "kDarken", "kLighten", "kColorDodge",
-            "kColorBurn", "kHardLight", "kSoftLight", "kDifference", "kExclusion"
-        };
-
-        str->appendf("mode: %s ", gModeStrings[(int)rec->fInfo.fColorMode]);
-
-        str->append("offset: (");
-        str->appendScalar(rec->fInfo.fOffset.fX);
-        str->append(", ");
-        str->appendScalar(rec->fInfo.fOffset.fY);
-        str->append(") ");
-
-        str->append("postTranslate: ");
-        if (rec->fInfo.fPostTranslate) {
-            str->append("true ");
-        } else {
-            str->append("false ");
-        }
-
-        rec->fPaint.toString(str);
-        rec = rec->fNext;
-    }
-}
-
 SkLayerDrawLooper::Builder::Builder()
         : fRecs(nullptr),
           fTopRec(nullptr),
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index 5b7b94a..064c16d 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -530,7 +530,6 @@
                                      sk_sp<SkImageFilter>,
                                      const CropRect*);
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDiffuseLightingImageFilter)
     SkScalar kd() const { return fKD; }
 
@@ -565,7 +564,6 @@
                                      SkScalar ks, SkScalar shininess,
                                      sk_sp<SkImageFilter>, const CropRect*);
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSpecularLightingImageFilter)
 
     SkScalar ks() const { return fKS; }
@@ -1371,12 +1369,6 @@
     return this->refMe();
 }
 
-void SkDiffuseLightingImageFilter::toString(SkString* str) const {
-    str->appendf("SkDiffuseLightingImageFilter: (");
-    str->appendf("kD: %f\n", fKD);
-    str->append(")");
-}
-
 #if SK_SUPPORT_GPU
 std::unique_ptr<GrFragmentProcessor> SkDiffuseLightingImageFilter::makeFragmentProcessor(
         sk_sp<GrTextureProxy> proxy,
@@ -1526,12 +1518,6 @@
     return this->refMe();
 }
 
-void SkSpecularLightingImageFilter::toString(SkString* str) const {
-    str->appendf("SkSpecularLightingImageFilter: (");
-    str->appendf("kS: %f shininess: %f", fKS, fShininess);
-    str->append(")");
-}
-
 #if SK_SUPPORT_GPU
 std::unique_ptr<GrFragmentProcessor> SkSpecularLightingImageFilter::makeFragmentProcessor(
         sk_sp<GrTextureProxy> proxy,
diff --git a/src/effects/SkLumaColorFilter.cpp b/src/effects/SkLumaColorFilter.cpp
index 847d5f9..12d6dd8 100644
--- a/src/effects/SkLumaColorFilter.cpp
+++ b/src/effects/SkLumaColorFilter.cpp
@@ -37,10 +37,6 @@
 
 void SkLumaColorFilter::flatten(SkWriteBuffer&) const {}
 
-void SkLumaColorFilter::toString(SkString* str) const {
-    str->append("SkLumaColorFilter ");
-}
-
 #if SK_SUPPORT_GPU
 std::unique_ptr<GrFragmentProcessor> SkLumaColorFilter::asFragmentProcessor(
         GrContext*, const GrColorSpaceInfo&) const {
diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp
index 3a6679d..7df30ce 100644
--- a/src/effects/SkMagnifierImageFilter.cpp
+++ b/src/effects/SkMagnifierImageFilter.cpp
@@ -201,11 +201,3 @@
     }
     return this->refMe();
 }
-
-void SkMagnifierImageFilter::toString(SkString* str) const {
-    str->appendf("SkMagnifierImageFilter: (");
-    str->appendf("src: (%f,%f,%f,%f) ",
-                 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBottom);
-    str->appendf("inset: %f", fInset);
-    str->append(")");
-}
diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp
index 585103a..9e71ab6 100644
--- a/src/effects/SkMatrixConvolutionImageFilter.cpp
+++ b/src/effects/SkMatrixConvolutionImageFilter.cpp
@@ -480,18 +480,3 @@
     // pixels it will affect in object-space.
     return kRepeat_TileMode != fTileMode;
 }
-
-void SkMatrixConvolutionImageFilter::toString(SkString* str) const {
-    str->appendf("SkMatrixConvolutionImageFilter: (");
-    str->appendf("size: (%d,%d) kernel: (", fKernelSize.width(), fKernelSize.height());
-    for (int y = 0; y < fKernelSize.height(); y++) {
-        for (int x = 0; x < fKernelSize.width(); x++) {
-            str->appendf("%f ", fKernel[y * fKernelSize.width() + x]);
-        }
-    }
-    str->appendf(")");
-    str->appendf("gain: %f bias: %f ", fGain, fBias);
-    str->appendf("offset: (%d, %d) ", fKernelOffset.fX, fKernelOffset.fY);
-    str->appendf("convolveAlpha: %s", fConvolveAlpha ? "true" : "false");
-    str->append(")");
-}
diff --git a/src/effects/SkMergeImageFilter.cpp b/src/effects/SkMergeImageFilter.cpp
index debe332..3225ba8 100644
--- a/src/effects/SkMergeImageFilter.cpp
+++ b/src/effects/SkMergeImageFilter.cpp
@@ -122,15 +122,3 @@
     this->INHERITED::flatten(buffer);
 }
 
-void SkMergeImageFilter::toString(SkString* str) const {
-    str->appendf("SkMergeImageFilter: (");
-
-    for (int i = 0; i < this->countInputs(); ++i) {
-        SkImageFilter* filter = this->getInput(i);
-        str->appendf("%d: (", i);
-        filter->toString(str);
-        str->appendf(")");
-    }
-
-    str->append(")");
-}
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index dbdea3d..8b3e76c 100644
--- a/src/effects/SkMorphologyImageFilter.cpp
+++ b/src/effects/SkMorphologyImageFilter.cpp
@@ -114,18 +114,6 @@
     return Make(width, height, common.getInput(0), &common.cropRect());
 }
 
-void SkErodeImageFilter::toString(SkString* str) const {
-    str->appendf("SkErodeImageFilter: (");
-    str->appendf("radius: (%d,%d)", this->radius().fWidth, this->radius().fHeight);
-    str->append(")");
-}
-
-void SkDilateImageFilter::toString(SkString* str) const {
-    str->appendf("SkDilateImageFilter: (");
-    str->appendf("radius: (%d,%d)", this->radius().fWidth, this->radius().fHeight);
-    str->append(")");
-}
-
 #if SK_SUPPORT_GPU
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/src/effects/SkOffsetImageFilter.cpp b/src/effects/SkOffsetImageFilter.cpp
index 19aa68e..8dacc11 100644
--- a/src/effects/SkOffsetImageFilter.cpp
+++ b/src/effects/SkOffsetImageFilter.cpp
@@ -125,13 +125,3 @@
     : INHERITED(&input, 1, cropRect) {
     fOffset.set(dx, dy);
 }
-
-void SkOffsetImageFilter::toString(SkString* str) const {
-    str->appendf("SkOffsetImageFilter: (");
-    str->appendf("offset: (%f, %f) ", fOffset.fX, fOffset.fY);
-    str->append("input: (");
-    if (this->getInput(0)) {
-        this->getInput(0)->toString(str);
-    }
-    str->append("))");
-}
diff --git a/src/effects/SkOverdrawColorFilter.cpp b/src/effects/SkOverdrawColorFilter.cpp
index 01dab65..71dbb72 100644
--- a/src/effects/SkOverdrawColorFilter.cpp
+++ b/src/effects/SkOverdrawColorFilter.cpp
@@ -36,14 +36,6 @@
     p->append(SkRasterPipeline::callback, ctx);
 }
 
-void SkOverdrawColorFilter::toString(SkString* str) const {
-    str->append("SkOverdrawColorFilter (");
-    for (int i = 0; i < kNumColors; i++) {
-        str->appendf("%d: %x\n", i, fColors[i]);
-    }
-    str->append(")");
-}
-
 void SkOverdrawColorFilter::flatten(SkWriteBuffer& buffer) const {
     buffer.writeByteArray(fColors, kNumColors * sizeof(SkPMColor));
 }
diff --git a/src/effects/SkPaintImageFilter.cpp b/src/effects/SkPaintImageFilter.cpp
index 235f76f..c0be41f 100644
--- a/src/effects/SkPaintImageFilter.cpp
+++ b/src/effects/SkPaintImageFilter.cpp
@@ -81,9 +81,3 @@
 bool SkPaintImageFilter::affectsTransparentBlack() const {
     return true;
 }
-
-void SkPaintImageFilter::toString(SkString* str) const {
-    str->appendf("SkPaintImageFilter: (");
-    fPaint.toString(str);
-    str->append(")");
-}
diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp
index 66fea1f..df11e6c 100644
--- a/src/effects/SkPictureImageFilter.cpp
+++ b/src/effects/SkPictureImageFilter.cpp
@@ -131,15 +131,3 @@
 
     return sk_sp<SkImageFilter>(new SkPictureImageFilter(fPicture, fCropRect, std::move(dstCS)));
 }
-
-void SkPictureImageFilter::toString(SkString* str) const {
-    str->appendf("SkPictureImageFilter: (");
-    str->appendf("crop: (%f,%f,%f,%f) ",
-                 fCropRect.fLeft, fCropRect.fTop, fCropRect.fRight, fCropRect.fBottom);
-    if (fPicture) {
-        str->appendf("picture: (%f,%f,%f,%f)",
-                     fPicture->cullRect().fLeft, fPicture->cullRect().fTop,
-                     fPicture->cullRect().fRight, fPicture->cullRect().fBottom);
-    }
-    str->append(")");
-}
diff --git a/src/effects/SkShaderMaskFilter.cpp b/src/effects/SkShaderMaskFilter.cpp
index cfa15c5..f2160a1 100644
--- a/src/effects/SkShaderMaskFilter.cpp
+++ b/src/effects/SkShaderMaskFilter.cpp
@@ -27,7 +27,6 @@
 
     bool asABlur(BlurRec*) const override { return false; }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkShaderMF)
 
 protected:
@@ -47,10 +46,6 @@
     typedef SkMaskFilter INHERITED;
 };
 
-void SkShaderMF::toString(SkString* str) const {
-    str->set("SkShaderMF:");
-}
-
 sk_sp<SkFlattenable> SkShaderMF::CreateProc(SkReadBuffer& buffer) {
     return SkShaderMaskFilter::Make(buffer.readShader());
 }
diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp
index 08b7b7e..5dbc784 100644
--- a/src/effects/SkTableColorFilter.cpp
+++ b/src/effects/SkTableColorFilter.cpp
@@ -90,8 +90,6 @@
             GrContext*, const GrColorSpaceInfo&) const override;
 #endif
 
-    void toString(SkString* str) const override;
-
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTable_ColorFilter)
 
     enum {
@@ -140,35 +138,6 @@
     typedef SkColorFilter INHERITED;
 };
 
-void SkTable_ColorFilter::toString(SkString* str) const {
-    const uint8_t* table = fStorage;
-    const uint8_t* tableA = gIdentityTable;
-    const uint8_t* tableR = gIdentityTable;
-    const uint8_t* tableG = gIdentityTable;
-    const uint8_t* tableB = gIdentityTable;
-    if (fFlags & kA_Flag) {
-        tableA = table; table += 256;
-    }
-    if (fFlags & kR_Flag) {
-        tableR = table; table += 256;
-    }
-    if (fFlags & kG_Flag) {
-        tableG = table; table += 256;
-    }
-    if (fFlags & kB_Flag) {
-        tableB = table;
-    }
-
-    str->append("SkTable_ColorFilter (");
-
-    for (int i = 0; i < 256; ++i) {
-        str->appendf("%d: %d,%d,%d,%d\n",
-                     i, tableR[i], tableG[i], tableB[i], tableA[i]);
-    }
-
-    str->append(")");
-}
-
 static const uint8_t gCountNibBits[] = {
     0, 1, 1, 2,
     1, 2, 2, 3,
diff --git a/src/effects/SkTableMaskFilter.cpp b/src/effects/SkTableMaskFilter.cpp
index 2df2fa7..8ff58ec 100644
--- a/src/effects/SkTableMaskFilter.cpp
+++ b/src/effects/SkTableMaskFilter.cpp
@@ -18,7 +18,6 @@
     SkMask::Format getFormat() const override;
     bool filterMask(SkMask*, const SkMask&, const SkMatrix&, SkIPoint*) const override;
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTableMaskFilterImpl)
 
 protected:
@@ -167,15 +166,3 @@
     SkDebugf("\n\n");
 #endif
 }
-
-void SkTableMaskFilterImpl::toString(SkString* str) const {
-    str->append("SkTableMaskFilter: (");
-
-    str->append("table: ");
-    for (int i = 0; i < 255; ++i) {
-        str->appendf("%d, ", fTable[i]);
-    }
-    str->appendf("%d", fTable[255]);
-
-    str->append(")");
-}
diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp
index f96af87..7ced09e 100644
--- a/src/effects/SkTileImageFilter.cpp
+++ b/src/effects/SkTileImageFilter.cpp
@@ -158,17 +158,3 @@
     buffer.writeRect(fSrcRect);
     buffer.writeRect(fDstRect);
 }
-
-void SkTileImageFilter::toString(SkString* str) const {
-    str->appendf("SkTileImageFilter: (");
-    str->appendf("src: %.2f %.2f %.2f %.2f",
-                 fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBottom);
-    str->appendf(" dst: %.2f %.2f %.2f %.2f",
-                 fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBottom);
-    if (this->getInput(0)) {
-        str->appendf("input: (");
-        this->getInput(0)->toString(str);
-        str->appendf(")");
-    }
-    str->append(")");
-}
diff --git a/src/effects/SkToSRGBColorFilter.cpp b/src/effects/SkToSRGBColorFilter.cpp
index 8ea0826..5831bf0 100644
--- a/src/effects/SkToSRGBColorFilter.cpp
+++ b/src/effects/SkToSRGBColorFilter.cpp
@@ -70,11 +70,6 @@
     buffer.writeDataAsByteArray(fSrcColorSpace->serialize().get());
 }
 
-void SkToSRGBColorFilter::toString(SkString* str) const {
-    // TODO
-    str->append("SkToSRGBColorFilter ");
-}
-
 #if SK_SUPPORT_GPU
 std::unique_ptr<GrFragmentProcessor> SkToSRGBColorFilter::asFragmentProcessor(
         GrContext*, const GrColorSpaceInfo&) const {
diff --git a/src/effects/SkTrimPE.h b/src/effects/SkTrimPE.h
index b7ed0c7..0f29987 100644
--- a/src/effects/SkTrimPE.h
+++ b/src/effects/SkTrimPE.h
@@ -19,7 +19,6 @@
 
     bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, const SkRect*) const override;
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTrimPE)
 
 protected:
diff --git a/src/effects/SkTrimPathEffect.cpp b/src/effects/SkTrimPathEffect.cpp
index d63393a..8c3f56e 100644
--- a/src/effects/SkTrimPathEffect.cpp
+++ b/src/effects/SkTrimPathEffect.cpp
@@ -97,10 +97,6 @@
         (mode & 1) ? SkTrimPathEffect::Mode::kInverted : SkTrimPathEffect::Mode::kNormal);
 }
 
-void SkTrimPE::toString(SkString* str) const {
-    str->appendf("SkTrimPathEffect: (%g %g)", fStartT, fStopT);
-}
-
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
 sk_sp<SkPathEffect> SkTrimPathEffect::Make(SkScalar startT, SkScalar stopT, Mode mode) {
diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp
index 19c072f..d32488d 100644
--- a/src/effects/SkXfermodeImageFilter.cpp
+++ b/src/effects/SkXfermodeImageFilter.cpp
@@ -35,7 +35,6 @@
     SkXfermodeImageFilter_Base(SkBlendMode mode, sk_sp<SkImageFilter> inputs[2],
                                const CropRect* cropRect);
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkXfermodeImageFilter_Base)
 
 protected:
@@ -250,22 +249,6 @@
     canvas->drawPaint(paint);
 }
 
-void SkXfermodeImageFilter_Base::toString(SkString* str) const {
-    str->appendf("SkXfermodeImageFilter: (");
-    str->appendf("blendmode: (%d)", (int)fMode);
-    if (this->getInput(0)) {
-        str->appendf("foreground: (");
-        this->getInput(0)->toString(str);
-        str->appendf(")");
-    }
-    if (this->getInput(1)) {
-        str->appendf("background: (");
-        this->getInput(1)->toString(str);
-        str->appendf(")");
-    }
-    str->append(")");
-}
-
 #if SK_SUPPORT_GPU
 
 #include "effects/GrXfermodeFragmentProcessor.h"
diff --git a/src/gpu/GrTestUtils.h b/src/gpu/GrTestUtils.h
index 0cfe6e4..7627df4 100644
--- a/src/gpu/GrTestUtils.h
+++ b/src/gpu/GrTestUtils.h
@@ -74,7 +74,6 @@
     bool filterPath(SkPath* dst, const SkPath&, SkStrokeRec* , const SkRect*) const override;
     DashType asADash(DashInfo* info) const override;
     Factory getFactory() const override { return nullptr; }
-    void toString(SkString*) const override {}
 
 private:
     TestDashPathEffect(const SkScalar* intervals, int count, SkScalar phase);
diff --git a/src/gpu/text/GrSDFMaskFilter.cpp b/src/gpu/text/GrSDFMaskFilter.cpp
index ff79cdb..82adaaa 100644
--- a/src/gpu/text/GrSDFMaskFilter.cpp
+++ b/src/gpu/text/GrSDFMaskFilter.cpp
@@ -26,7 +26,6 @@
 
     void computeFastBounds(const SkRect&, SkRect*) const override;
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(GrSDFMaskFilterImpl)
 
 protected:
@@ -87,10 +86,6 @@
     return GrSDFMaskFilter::Make();
 }
 
-void GrSDFMaskFilterImpl::toString(SkString* str) const {
-    str->append("GrSDFMaskFilterImpl: ()");
-}
-
 void gr_register_sdf_maskfilter_createproc() {
     SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(GrSDFMaskFilterImpl)
 }
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index cc4419a..1d5e2db 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -132,12 +132,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-const char* SkImage::toString(SkString* str) const {
-    str->appendf("image: (id:%d (%d, %d) %s)", this->uniqueID(), this->width(), this->height(),
-                 this->isOpaque() ? "opaque" : "");
-    return str->c_str();
-}
-
 sk_sp<SkImage> SkImage::makeSubset(const SkIRect& subset) const {
     if (subset.isEmpty()) {
         return nullptr;
diff --git a/src/shaders/SkColorFilterShader.cpp b/src/shaders/SkColorFilterShader.cpp
index 0f25518..16bf565 100644
--- a/src/shaders/SkColorFilterShader.cpp
+++ b/src/shaders/SkColorFilterShader.cpp
@@ -71,19 +71,6 @@
 }
 #endif
 
-void SkColorFilterShader::toString(SkString* str) const {
-    str->append("SkColorFilterShader: (");
-
-    str->append("Shader: ");
-    as_SB(fShader)->toString(str);
-    str->append(" Filter: ");
-    // TODO: add "fFilter->toString(str);" once SkColorFilter::toString is added
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 sk_sp<SkShader> SkShader::makeWithColorFilter(sk_sp<SkColorFilter> filter) const {
diff --git a/src/shaders/SkColorFilterShader.h b/src/shaders/SkColorFilterShader.h
index 2f5b469..d97dd06 100644
--- a/src/shaders/SkColorFilterShader.h
+++ b/src/shaders/SkColorFilterShader.h
@@ -21,7 +21,6 @@
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorFilterShader)
 
 protected:
diff --git a/src/shaders/SkColorShader.cpp b/src/shaders/SkColorShader.cpp
index 152a0b5..c3f86b9 100644
--- a/src/shaders/SkColorShader.cpp
+++ b/src/shaders/SkColorShader.cpp
@@ -97,17 +97,6 @@
 
 #endif
 
-void SkColorShader::toString(SkString* str) const {
-    str->append("SkColorShader: (");
-
-    str->append("Color: ");
-    str->appendHex(fColor);
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -223,16 +212,6 @@
 
 #endif
 
-void SkColor4Shader::toString(SkString* str) const {
-    str->append("SkColor4Shader: (");
-
-    str->append("RGBA:");
-    for (int i = 0; i < 4; ++i) {
-        str->appendf(" %g", fColor4.vec()[i]);
-    }
-    str->append(" )");
-}
-
 sk_sp<SkShader> SkColor4Shader::onMakeColorSpace(SkColorSpaceXformer* xformer) const {
     return SkShader::MakeColorShader(xformer->apply(fCachedByteColor));
 }
diff --git a/src/shaders/SkColorShader.h b/src/shaders/SkColorShader.h
index 9fab094..235f8e3 100644
--- a/src/shaders/SkColorShader.h
+++ b/src/shaders/SkColorShader.h
@@ -50,7 +50,6 @@
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorShader)
 
 protected:
@@ -106,7 +105,6 @@
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkColorShader)
 
 protected:
diff --git a/src/shaders/SkComposeShader.cpp b/src/shaders/SkComposeShader.cpp
index e7125ad..845d320 100644
--- a/src/shaders/SkComposeShader.cpp
+++ b/src/shaders/SkComposeShader.cpp
@@ -141,18 +141,3 @@
                                                               std::move(fpA), fMode);
 }
 #endif
-
-void SkComposeShader::toString(SkString* str) const {
-    str->append("SkComposeShader: (");
-
-    str->append("dst: ");
-    as_SB(fDst)->toString(str);
-    str->append(" src: ");
-    as_SB(fSrc)->toString(str);
-    str->appendf(" mode: %s", SkBlendMode_Name(fMode));
-    str->appendf(" lerpT: %g", fLerpT);
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
diff --git a/src/shaders/SkComposeShader.h b/src/shaders/SkComposeShader.h
index 9208502..c2dc2c3 100644
--- a/src/shaders/SkComposeShader.h
+++ b/src/shaders/SkComposeShader.h
@@ -35,7 +35,6 @@
     bool asACompose(ComposeRec* rec) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeShader)
 
 protected:
diff --git a/src/shaders/SkEmptyShader.h b/src/shaders/SkEmptyShader.h
index 12848b37..7956003 100644
--- a/src/shaders/SkEmptyShader.h
+++ b/src/shaders/SkEmptyShader.h
@@ -20,7 +20,6 @@
 public:
     SkEmptyShader() {}
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkEmptyShader)
 
 protected:
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index e0dd512..b80f6b9 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -172,17 +172,6 @@
     return sk_sp<SkShader>{ new SkImageShader(image, tx,ty, localMatrix, clampAsIfUnpremul) };
 }
 
-void SkImageShader::toString(SkString* str) const {
-    const char* gTileModeName[SkShader::kTileModeCount] = {
-        "clamp", "repeat", "mirror"
-    };
-
-    str->appendf("ImageShader: ((%s %s) ", gTileModeName[fTileModeX], gTileModeName[fTileModeY]);
-    fImage->toString(str);
-    this->INHERITED::toString(str);
-    str->append(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 #if SK_SUPPORT_GPU
diff --git a/src/shaders/SkImageShader.h b/src/shaders/SkImageShader.h
index 3e980d3..0d40c23 100644
--- a/src/shaders/SkImageShader.h
+++ b/src/shaders/SkImageShader.h
@@ -23,7 +23,6 @@
 
     bool isOpaque() const override;
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkImageShader)
 
 #if SK_SUPPORT_GPU
diff --git a/src/shaders/SkLocalMatrixShader.cpp b/src/shaders/SkLocalMatrixShader.cpp
index 509c66d..28d7775 100644
--- a/src/shaders/SkLocalMatrixShader.cpp
+++ b/src/shaders/SkLocalMatrixShader.cpp
@@ -71,16 +71,6 @@
     return as_SB(fProxyShader)->appendStages(newRec);
 }
 
-void SkLocalMatrixShader::toString(SkString* str) const {
-    str->append("SkLocalMatrixShader: (");
-
-    as_SB(fProxyShader)->toString(str);
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
-
 sk_sp<SkShader> SkShader::makeWithLocalMatrix(const SkMatrix& localMatrix) const {
     if (localMatrix.isIdentity()) {
         return sk_ref_sp(const_cast<SkShader*>(this));
diff --git a/src/shaders/SkLocalMatrixShader.h b/src/shaders/SkLocalMatrixShader.h
index 48d1ef1..9f89812 100644
--- a/src/shaders/SkLocalMatrixShader.h
+++ b/src/shaders/SkLocalMatrixShader.h
@@ -38,7 +38,6 @@
         return fProxyShader;
     }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLocalMatrixShader)
 
 protected:
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp
index 7b457f5..2b4601b 100644
--- a/src/shaders/SkPerlinNoiseShader.cpp
+++ b/src/shaders/SkPerlinNoiseShader.cpp
@@ -366,7 +366,6 @@
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPerlinNoiseShaderImpl)
 
 protected:
@@ -1477,37 +1476,6 @@
 
 #endif
 
-void SkPerlinNoiseShaderImpl::toString(SkString* str) const {
-    str->append("SkPerlinNoiseShaderImpl: (");
-
-    str->append("type: ");
-    switch (fType) {
-        case kFractalNoise_Type:
-            str->append("\"fractal noise\"");
-            break;
-        case kTurbulence_Type:
-            str->append("\"turbulence\"");
-            break;
-        default:
-            str->append("\"unknown\"");
-            break;
-    }
-    str->append(" base frequency: (");
-    str->appendScalar(fBaseFrequencyX);
-    str->append(", ");
-    str->appendScalar(fBaseFrequencyY);
-    str->append(") number of octaves: ");
-    str->appendS32(fNumOctaves);
-    str->append(" seed: ");
-    str->appendScalar(fSeed);
-    str->append(" stitch tiles: ");
-    str->append(fStitchTiles ? "true " : "false ");
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 static bool valid_input(SkScalar baseX, SkScalar baseY, int numOctaves, const SkISize* tileSize,
diff --git a/src/shaders/SkPictureShader.cpp b/src/shaders/SkPictureShader.cpp
index f958814..576598b 100644
--- a/src/shaders/SkPictureShader.cpp
+++ b/src/shaders/SkPictureShader.cpp
@@ -338,22 +338,6 @@
     fBitmapShaderContext->shadeSpan(x, y, dstC, count);
 }
 
-void SkPictureShader::toString(SkString* str) const {
-    static const char* gTileModeName[SkShader::kTileModeCount] = {
-        "clamp", "repeat", "mirror"
-    };
-
-    str->appendf("PictureShader: [%f:%f:%f:%f] ",
-                 fPicture->cullRect().fLeft,
-                 fPicture->cullRect().fTop,
-                 fPicture->cullRect().fRight,
-                 fPicture->cullRect().fBottom);
-
-    str->appendf("(%s, %s)", gTileModeName[fTmx], gTileModeName[fTmy]);
-
-    this->INHERITED::toString(str);
-}
-
 #if SK_SUPPORT_GPU
 std::unique_ptr<GrFragmentProcessor> SkPictureShader::asFragmentProcessor(
         const GrFPArgs& args) const {
diff --git a/src/shaders/SkPictureShader.h b/src/shaders/SkPictureShader.h
index 6e5201e..25fe53f 100644
--- a/src/shaders/SkPictureShader.h
+++ b/src/shaders/SkPictureShader.h
@@ -28,7 +28,6 @@
     static sk_sp<SkShader> Make(sk_sp<SkPicture>, TileMode, TileMode, const SkMatrix*,
                                 const SkRect*);
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkPictureShader)
 
 #if SK_SUPPORT_GPU
diff --git a/src/shaders/SkShader.cpp b/src/shaders/SkShader.cpp
index f3ffd26..a17cca1 100644
--- a/src/shaders/SkShader.cpp
+++ b/src/shaders/SkShader.cpp
@@ -208,13 +208,6 @@
     return SkPictureShader::Make(std::move(src), tmx, tmy, localMatrix, tile);
 }
 
-void SkShaderBase::toString(SkString* str) const {
-    if (!fLocalMatrix.isIdentity()) {
-        str->append(" ");
-        fLocalMatrix.toString(str);
-    }
-}
-
 bool SkShaderBase::appendStages(const StageRec& rec) const {
     return this->onAppendStages(rec);
 }
@@ -258,13 +251,3 @@
 sk_sp<SkFlattenable> SkEmptyShader::CreateProc(SkReadBuffer&) {
     return SkShader::MakeEmptyShader();
 }
-
-#include "SkEmptyShader.h"
-
-void SkEmptyShader::toString(SkString* str) const {
-    str->append("SkEmptyShader: (");
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
diff --git a/src/shaders/SkShaderBase.h b/src/shaders/SkShaderBase.h
index 53ec0dc..9cfca4c 100644
--- a/src/shaders/SkShaderBase.h
+++ b/src/shaders/SkShaderBase.h
@@ -208,8 +208,6 @@
         return nullptr;
     }
 
-    virtual void toString(SkString* str) const;
-
     SK_DEFINE_FLATTENABLE_TYPE(SkShaderBase)
     SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
 
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp
index 4c6a425..cfcd335 100644
--- a/src/shaders/gradients/SkGradientShader.cpp
+++ b/src/shaders/gradients/SkGradientShader.cpp
@@ -627,38 +627,6 @@
     }
 }
 
-void SkGradientShaderBase::toString(SkString* str) const {
-
-    str->appendf("%d colors: ", fColorCount);
-
-    for (int i = 0; i < fColorCount; ++i) {
-        str->appendHex(this->getLegacyColor(i), 8);
-        if (i < fColorCount-1) {
-            str->append(", ");
-        }
-    }
-
-    if (fColorCount > 2) {
-        str->append(" points: (");
-        for (int i = 0; i < fColorCount; ++i) {
-            str->appendScalar(this->getPos(i));
-            if (i < fColorCount-1) {
-                str->append(", ");
-            }
-        }
-        str->append(")");
-    }
-
-    static const char* gTileModeName[SkShader::kTileModeCount] = {
-        "clamp", "repeat", "mirror", "decal",
-    };
-
-    str->append(" ");
-    str->append(gTileModeName[fTileMode]);
-
-    this->INHERITED::toString(str);
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h
index dccb4e7..e50f1a6 100644
--- a/src/shaders/gradients/SkGradientShaderPriv.h
+++ b/src/shaders/gradients/SkGradientShaderPriv.h
@@ -80,7 +80,6 @@
 
     SkGradientShaderBase(SkReadBuffer& );
     void flatten(SkWriteBuffer&) const override;
-    void toString(SkString* str) const override;
 
     void commonAsAGradient(GradientInfo*) const;
 
diff --git a/src/shaders/gradients/SkLinearGradient.cpp b/src/shaders/gradients/SkLinearGradient.cpp
index a377442..34cac26 100644
--- a/src/shaders/gradients/SkLinearGradient.cpp
+++ b/src/shaders/gradients/SkLinearGradient.cpp
@@ -207,14 +207,4 @@
 
 #endif
 
-void SkLinearGradient::toString(SkString* str) const {
-    str->append("SkLinearGradient (");
-
-    str->appendf("start: (%f, %f)", fStart.fX, fStart.fY);
-    str->appendf(" end: (%f, %f) ", fEnd.fX, fEnd.fY);
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
 
diff --git a/src/shaders/gradients/SkLinearGradient.h b/src/shaders/gradients/SkLinearGradient.h
index 111ed99..d100a1c 100644
--- a/src/shaders/gradients/SkLinearGradient.h
+++ b/src/shaders/gradients/SkLinearGradient.h
@@ -19,7 +19,6 @@
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkLinearGradient)
 
 protected:
diff --git a/src/shaders/gradients/SkRadialGradient.cpp b/src/shaders/gradients/SkRadialGradient.cpp
index 6d19361..ec0f8a0 100644
--- a/src/shaders/gradients/SkRadialGradient.cpp
+++ b/src/shaders/gradients/SkRadialGradient.cpp
@@ -185,19 +185,3 @@
                                             SkRasterPipeline*) const {
     p->append(SkRasterPipeline::xy_to_radius);
 }
-
-void SkRadialGradient::toString(SkString* str) const {
-    str->append("SkRadialGradient: (");
-
-    str->append("center: (");
-    str->appendScalar(fCenter.fX);
-    str->append(", ");
-    str->appendScalar(fCenter.fY);
-    str->append(") radius: ");
-    str->appendScalar(fRadius);
-    str->append(" ");
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
diff --git a/src/shaders/gradients/SkRadialGradient.h b/src/shaders/gradients/SkRadialGradient.h
index b0d6854..d6963f6 100644
--- a/src/shaders/gradients/SkRadialGradient.h
+++ b/src/shaders/gradients/SkRadialGradient.h
@@ -19,7 +19,6 @@
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkRadialGradient)
 
 protected:
diff --git a/src/shaders/gradients/SkSweepGradient.cpp b/src/shaders/gradients/SkSweepGradient.cpp
index c409d9a..cfce5fe 100644
--- a/src/shaders/gradients/SkSweepGradient.cpp
+++ b/src/shaders/gradients/SkSweepGradient.cpp
@@ -241,20 +241,6 @@
                                        fGradFlags, &this->getLocalMatrix());
 }
 
-void SkSweepGradient::toString(SkString* str) const {
-    str->append("SkSweepGradient: (");
-
-    str->append("center: (");
-    str->appendScalar(fCenter.fX);
-    str->append(", ");
-    str->appendScalar(fCenter.fY);
-    str->append(") ");
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
-
 void SkSweepGradient::appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* p,
                                            SkRasterPipeline*) const {
     p->append(SkRasterPipeline::xy_to_unit_angle);
diff --git a/src/shaders/gradients/SkSweepGradient.h b/src/shaders/gradients/SkSweepGradient.h
index dce9a35..a58c957 100644
--- a/src/shaders/gradients/SkSweepGradient.h
+++ b/src/shaders/gradients/SkSweepGradient.h
@@ -20,7 +20,6 @@
     std::unique_ptr<GrFragmentProcessor> asFragmentProcessor(const GrFPArgs&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSweepGradient)
 
 protected:
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.cpp b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
index 73ec3f2..7d5026b 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient.cpp
+++ b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
@@ -199,31 +199,6 @@
                                                  fTileMode, fGradFlags, &this->getLocalMatrix());
 }
 
-
-void SkTwoPointConicalGradient::toString(SkString* str) const {
-    str->append("SkTwoPointConicalGradient: (");
-
-    str->append("center1: (");
-    str->appendScalar(fCenter1.fX);
-    str->append(", ");
-    str->appendScalar(fCenter1.fY);
-    str->append(") radius1: ");
-    str->appendScalar(fRadius1);
-    str->append(" ");
-
-    str->append("center2: (");
-    str->appendScalar(fCenter2.fX);
-    str->append(", ");
-    str->appendScalar(fCenter2.fY);
-    str->append(") radius2: ");
-    str->appendScalar(fRadius2);
-    str->append(" ");
-
-    this->INHERITED::toString(str);
-
-    str->append(")");
-}
-
 void SkTwoPointConicalGradient::appendGradientStages(SkArenaAlloc* alloc, SkRasterPipeline* p,
                                                      SkRasterPipeline* postPipeline) const {
     const auto dRadius = fRadius2 - fRadius1;
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.h b/src/shaders/gradients/SkTwoPointConicalGradient.h
index f0d341f..b965e15 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient.h
+++ b/src/shaders/gradients/SkTwoPointConicalGradient.h
@@ -65,7 +65,6 @@
     const SkMatrix& getGradientMatrix() const { return fPtsToUnit; }
     const FocalData& getFocalData() const { return fFocalData; }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTwoPointConicalGradient)
 
 protected:
diff --git a/src/utils/SkShadowUtils.cpp b/src/utils/SkShadowUtils.cpp
index dfd5ba4..f0b1e8f 100644
--- a/src/utils/SkShadowUtils.cpp
+++ b/src/utils/SkShadowUtils.cpp
@@ -45,7 +45,6 @@
             GrContext*, const GrColorSpaceInfo&) const override;
 #endif
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkGaussianColorFilter)
 
 protected:
@@ -64,10 +63,6 @@
     return Make();
 }
 
-void SkGaussianColorFilter::toString(SkString* str) const {
-    str->append("SkGaussianColorFilter ");
-}
-
 #if SK_SUPPORT_GPU
 
 std::unique_ptr<GrFragmentProcessor> SkGaussianColorFilter::asFragmentProcessor(
diff --git a/tests/CanvasTest.cpp b/tests/CanvasTest.cpp
index 9f942d2..1a1c20a 100644
--- a/tests/CanvasTest.cpp
+++ b/tests/CanvasTest.cpp
@@ -838,7 +838,6 @@
 public:
     static sk_sp<SkImageFilter> Make() { return sk_sp<SkImageFilter>(new ZeroBoundsImageFilter); }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(ZeroBoundsImageFilter)
 
 protected:
@@ -862,10 +861,6 @@
     return nullptr;
 }
 
-void ZeroBoundsImageFilter::toString(SkString* str) const {
-    str->appendf("ZeroBoundsImageFilter: ()");
-}
-
 }  // anonymous namespace
 
 DEF_TEST(Canvas_SaveLayerWithNullBoundsAndZeroBoundsImageFilter, r) {
diff --git a/tests/GrShapeTest.cpp b/tests/GrShapeTest.cpp
index 86f007e..930012c 100644
--- a/tests/GrShapeTest.cpp
+++ b/tests/GrShapeTest.cpp
@@ -1161,7 +1161,6 @@
         }
         static sk_sp<SkPathEffect> Make() { return sk_sp<SkPathEffect>(new RRectPathEffect); }
         Factory getFactory() const override { return nullptr; }
-        void toString(SkString*) const override {}
     private:
         RRectPathEffect() {}
     };
@@ -1244,7 +1243,6 @@
         }
         static sk_sp<SkPathEffect> Make() { return sk_sp<SkPathEffect>(new AddLineTosPathEffect); }
         Factory getFactory() const override { return nullptr; }
-        void toString(SkString*) const override {}
     private:
         AddLineTosPathEffect() {}
     };
@@ -1281,7 +1279,6 @@
             return sk_sp<SkPathEffect>(new MakeHairlinePathEffect);
         }
         Factory getFactory() const override { return nullptr; }
-        void toString(SkString*) const override {}
     private:
         MakeHairlinePathEffect() {}
     };
@@ -1367,7 +1364,6 @@
             return sk_sp<SkPathEffect>(new EmptyPathEffect(invert));
         }
         Factory getFactory() const override { return nullptr; }
-        void toString(SkString*) const override {}
     private:
         bool fInvert;
         EmptyPathEffect(bool invert) : fInvert(invert) {}
@@ -1448,7 +1444,6 @@
         }
         static sk_sp<SkPathEffect> Make() { return sk_sp<SkPathEffect>(new FailurePathEffect); }
         Factory getFactory() const override { return nullptr; }
-        void toString(SkString*) const override {}
     private:
         FailurePathEffect() {}
     };
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index e475ddd..f38b714 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -57,7 +57,6 @@
         return sk_sp<SkImageFilter>(new MatrixTestImageFilter(reporter, expectedMatrix));
     }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(MatrixTestImageFilter)
 
 protected:
@@ -101,7 +100,6 @@
         return nullptr;
     }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(FailImageFilter)
 
 private:
@@ -113,11 +111,6 @@
     return sk_sp<SkFlattenable>(new FailImageFilter());
 }
 
-void FailImageFilter::toString(SkString* str) const {
-    str->appendf("FailImageFilter: (");
-    str->append(")");
-}
-
 void draw_gradient_circle(SkCanvas* canvas, int width, int height) {
     SkScalar x = SkIntToScalar(width / 2);
     SkScalar y = SkIntToScalar(height / 2);
@@ -295,7 +288,6 @@
             : SkImageFilter(nullptr, 0, nullptr), fBounds(bounds) {}
 
 private:
-    void toString(SkString*) const override {}
     Factory getFactory() const override { return nullptr; }
 
     sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* src, const Context&,
@@ -318,11 +310,6 @@
     return nullptr;
 }
 
-void MatrixTestImageFilter::toString(SkString* str) const {
-    str->appendf("MatrixTestImageFilter: (");
-    str->append(")");
-}
-
 static sk_sp<SkImage> make_small_image() {
     auto surface(SkSurface::MakeRasterN32Premul(kBitmapSize, kBitmapSize));
     SkCanvas* canvas = surface->getCanvas();
@@ -1841,8 +1828,6 @@
     public:
         TestFilter() : INHERITED(nullptr, 0, nullptr) {}
 
-        void toString(SkString*) const override {}
-
         Factory getFactory() const override { return nullptr; }
 
         size_t cloneCount() const { return fCloneCount; }
diff --git a/tests/PDFPrimitivesTest.cpp b/tests/PDFPrimitivesTest.cpp
index b9f8a05..d25adea 100644
--- a/tests/PDFPrimitivesTest.cpp
+++ b/tests/PDFPrimitivesTest.cpp
@@ -357,7 +357,6 @@
         return sk_sp<DummyImageFilter>(new DummyImageFilter(visited));
     }
 
-    void toString(SkString* str) const override;
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(DummyImageFilter)
     bool visited() const { return fVisited; }
 
@@ -386,11 +385,6 @@
     return DummyImageFilter::Make(visited);
 }
 
-void DummyImageFilter::toString(SkString* str) const {
-    str->appendf("DummyImageFilter: (");
-    str->append(")");
-}
-
 };
 
 // Check that PDF rendering of image filters successfully falls back to
diff --git a/tests/QuickRejectTest.cpp b/tests/QuickRejectTest.cpp
index d673ceb..ffa012b 100644
--- a/tests/QuickRejectTest.cpp
+++ b/tests/QuickRejectTest.cpp
@@ -30,10 +30,6 @@
         return nullptr;
     }
 
-    void toString(SkString* str) const override {
-        str->append("TestLooper:");
-    }
-
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(TestLooper)
 
 private:
diff --git a/tools/bookmaker/bookmaker.h b/tools/bookmaker/bookmaker.h
index a002621..ecfbc99 100644
--- a/tools/bookmaker/bookmaker.h
+++ b/tools/bookmaker/bookmaker.h
@@ -1150,6 +1150,8 @@
         fParent = def;
     }
 
+    char* FindDateTime(char* buffer, int size);
+
     void indentIn(IndentKind kind) {
         fIndent += 4;
         fIndentStack.emplace_back(kind, fIndent);
@@ -1218,7 +1220,7 @@
         fParent = fParent->fParent;
     }
 
-    const char* ReadToBuffer(string filename, int* size);
+    char* ReadToBuffer(string filename, int* size);
 
     virtual void reset() = 0;
 
diff --git a/tools/bookmaker/includeWriter.cpp b/tools/bookmaker/includeWriter.cpp
index 566cc7c..38cd223 100644
--- a/tools/bookmaker/includeWriter.cpp
+++ b/tools/bookmaker/includeWriter.cpp
@@ -1342,6 +1342,7 @@
     bool sawConst = false;
     bool staticOnly = false;
     bool sawTypedef = false;
+    Definition* deferredTypedefComment = nullptr;
     const Definition* requireDense = nullptr;
     const Definition* startDef = nullptr;
     for (auto& child : def->fTokens) {
@@ -1621,7 +1622,9 @@
                                 child.fContentStart;
                         this->writeBlockTrim((int) (bodyEnd - fStart), fStart);
                         if (fPendingMethod) {
-                            this->indentOut();
+                            if (fIndent >= 4) {
+                                this->indentOut();
+                            }
                             fPendingMethod = false;
                         }
                         startDef = requireDense ? requireDense : &child;
@@ -1784,6 +1787,7 @@
                 case KeyWord::kTypedef:
                     SkASSERT(!memberStart);
                     memberStart = &child;
+                    deferredTypedefComment = fDeferComment;
                     sawTypedef = true;
                     break;
                 case KeyWord::kSK_BEGIN_REQUIRE_DENSE:
@@ -2013,6 +2017,7 @@
                         SkASSERT(fBmhParser->fTypedefMap.end() != typedefIter);
                         bmhTypedef = &typedefIter->second;
                     }
+                    fDeferComment = deferredTypedefComment;
                     this->constOut(memberStart, bmhTypedef);
                     fDeferComment = nullptr;
                     sawTypedef = false;
@@ -2768,6 +2773,13 @@
     this->writeString("*/");
     this->lf(2);
     fIndent = 0;
+    if (this->startsWith("/* Generated by tools/bookmaker from")) {
+        this->skipToEndBracket("*/");
+        if (!this->skipExact("*/\n\n")) {
+            return this->reportError<bool>("malformed generated comment");
+        }
+    }
     fStart = fChar;
+
     return true;
 }
diff --git a/tools/bookmaker/parserCommon.cpp b/tools/bookmaker/parserCommon.cpp
index 8a58b26..35769b6 100644
--- a/tools/bookmaker/parserCommon.cpp
+++ b/tools/bookmaker/parserCommon.cpp
@@ -245,7 +245,7 @@
     fMaxLF = 2;
 }
 
-const char* ParserCommon::ReadToBuffer(string filename, int* size) {
+char* ParserCommon::ReadToBuffer(string filename, int* size) {
     FILE* file = fopen(filename.c_str(), "rb");
     if (!file) {
         return nullptr;
@@ -261,13 +261,27 @@
     return buffer;
 }
 
+char* ParserCommon::FindDateTime(char* buffer, int size) {
+    int index = -1;
+    int lineCount = 8;
+    while (++index < size && ('\n' != buffer[index] || --lineCount))
+        ;
+    if (lineCount) {
+        return nullptr;
+    }
+    if (strncmp("\n   on 20", &buffer[index], 9)) {
+        return nullptr;
+    }
+    return &buffer[index];
+}
+
 bool ParserCommon::writtenFileDiffers(string filename, string readname) {
     int writtenSize, readSize;
-    const char* written = ReadToBuffer(filename, &writtenSize);
+    char* written = ReadToBuffer(filename, &writtenSize);
     if (!written) {
         return true;
     }
-    const char* read = ReadToBuffer(readname, &readSize);
+    char* read = ReadToBuffer(readname, &readSize);
     if (!read) {
         delete[] written;
         return true;
@@ -285,6 +299,12 @@
     if (readSize != writtenSize) {
         return true;
     }
+    // force the date/time to be the same, if present in both
+    const char* newDateTime = FindDateTime(written, writtenSize);
+    char* oldDateTime = FindDateTime(read, readSize);
+    if (newDateTime && oldDateTime) {
+        memcpy(oldDateTime, newDateTime, 26);
+    }
     bool result = !!memcmp(written, read, writtenSize);
     delete[] written;
     delete[] read;