Revert "Revert "Compile all fiddle examples locally""

This reverts commit 37575bf3cad759b4703b2021d3fc80bb8eded60f.

Change-Id: Ia31abbd4906ddeed406f3da1128bc4d4177abf24
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/201603
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/docs/examples/AutoCanvasRestore_000.cpp b/docs/examples/AutoCanvasRestore_000.cpp
new file mode 100644
index 0000000..d7f2de3
--- /dev/null
+++ b/docs/examples/AutoCanvasRestore_000.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=466ef576b88e29d7252422db7adeed1c
+REG_FIDDLE(AutoCanvasRestore_000, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkFont font(nullptr, 64);
+    for (SkScalar sx : { -1, 1 } ) {
+        for (SkScalar sy : { -1, 1 } ) {
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            SkMatrix m = SkMatrix::MakeAll(sx, 1, 96,    0, sy, 64,   0, 0, 1);
+            canvas->concat(m);
+            canvas->drawString("R", 0, 0, font, paint);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/AutoCanvasRestore_001.cpp b/docs/examples/AutoCanvasRestore_001.cpp
new file mode 100644
index 0000000..6176b86
--- /dev/null
+++ b/docs/examples/AutoCanvasRestore_001.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9f459b218ec079c1ada23f4412968f9a
+REG_FIDDLE(AutoCanvasRestore_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (bool callRestore : { false, true } ) {
+        for (bool saveCanvas : {false, true} ) {
+            SkAutoCanvasRestore autoRestore(canvas, saveCanvas);
+            if (!saveCanvas) {
+                canvas->save();
+            }
+            SkDebugf("saveCanvas: %s  before restore: %d\n",
+                   saveCanvas ? "true" : "false", canvas->getSaveCount());
+            if (callRestore) autoRestore.restore();
+            SkDebugf("saveCanvas: %s  after restore: %d\n",
+                   saveCanvas ? "true" : "false", canvas->getSaveCount());
+        }
+    }
+    SkDebugf("final count: %d\n", canvas->getSaveCount());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_000.cpp b/docs/examples/Bitmap_000.cpp
new file mode 100644
index 0000000..0bfebc9
--- /dev/null
+++ b/docs/examples/Bitmap_000.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fe79a9c1ec350264eb9c7b2509dd3638
+REG_FIDDLE(Bitmap_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType));
+    SkDebugf("pixel address = %p\n", bitmap.getPixels());
+    SkBitmap::HeapAllocator stdalloc;
+    if (!stdalloc.allocPixelRef(&bitmap)) {
+        SkDebugf("pixel allocation failed\n");
+    } else {
+        SkDebugf("pixel address = %p\n", bitmap.getPixels());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_001.cpp b/docs/examples/Bitmap_001.cpp
new file mode 100644
index 0000000..39613b1
--- /dev/null
+++ b/docs/examples/Bitmap_001.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6739d14ec0d6a373f2fcadc6b3077fd4
+REG_FIDDLE(Bitmap_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkBitmap bitmap;
+    for (int i = 0; i < 2; ++i) {
+       SkDebugf("width: %2d  height: %2d", bitmap.width(), bitmap.height());
+       SkDebugf("  color: k%s_SkColorType", colors[bitmap.colorType()]);
+       SkDebugf("  alpha: k%s_SkAlphaType\n", alphas[bitmap.alphaType()]);
+       bitmap.setInfo(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType),
+                      0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_002.cpp b/docs/examples/Bitmap_002.cpp
new file mode 100644
index 0000000..6e2ca88
--- /dev/null
+++ b/docs/examples/Bitmap_002.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bbbae7a181bfd128a4484e8e9f454db1
+REG_FIDDLE(Bitmap_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap original;
+    if (original.tryAllocPixels(
+            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {
+        SkDebugf("original has pixels before copy: %s\n", original.getPixels() ? "true" : "false");
+        SkBitmap copy(original);
+        SkDebugf("original has pixels after copy: %s\n", original.getPixels() ? "true" : "false");
+        SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_003.cpp b/docs/examples/Bitmap_003.cpp
new file mode 100644
index 0000000..6c307af
--- /dev/null
+++ b/docs/examples/Bitmap_003.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=40afd4f1fa69e02d69d92b38252088ef
+REG_FIDDLE(Bitmap_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap original;
+    if (original.tryAllocPixels(
+            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {
+        SkDebugf("original has pixels before move: %s\n", original.getPixels() ? "true" : "false");
+        SkBitmap copy(std::move(original));
+        // NOLINTNEXTLINE(bugprone-use-after-move)
+        SkDebugf("original has pixels after move: %s\n", original.getPixels() ? "true" : "false");
+        SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_004.cpp b/docs/examples/Bitmap_004.cpp
new file mode 100644
index 0000000..f0e7bfe
--- /dev/null
+++ b/docs/examples/Bitmap_004.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=45279c519ae808f78bd30e9d84bdfdde
+REG_FIDDLE(Bitmap_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap original;
+    if (original.tryAllocPixels(
+            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {
+        SkDebugf("original has pixels before copy: %s\n", original.getPixels() ? "true" : "false");
+        SkBitmap copy = original;
+        SkDebugf("original has pixels after copy: %s\n", original.getPixels() ? "true" : "false");
+        SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_005.cpp b/docs/examples/Bitmap_005.cpp
new file mode 100644
index 0000000..c4bb112
--- /dev/null
+++ b/docs/examples/Bitmap_005.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=35ea3fed27d8db22dc00f48670de64de
+REG_FIDDLE(Bitmap_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap original;
+    if (original.tryAllocPixels(
+            SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {
+        SkDebugf("original has pixels before move: %s\n", original.getPixels() ? "true" : "false");
+        SkBitmap copy = std::move(original);
+        // NOLINTNEXTLINE(bugprone-use-after-move)
+        SkDebugf("original has pixels after move: %s\n", original.getPixels() ? "true" : "false");
+        SkDebugf("copy has pixels: %s\n", copy.getPixels() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_006.cpp b/docs/examples/Bitmap_006.cpp
new file mode 100644
index 0000000..9de6348
--- /dev/null
+++ b/docs/examples/Bitmap_006.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=de9be45255e48fae445c916a41063abc
+REG_FIDDLE(Bitmap_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkBitmap& b) -> void {
+        const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+        const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                                "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                                "RGBA_F16"};
+        SkDebugf("%s width:%d height:%d colorType:k%s_SkColorType alphaType:k%s_SkAlphaType\n",
+                 prefix, b.width(), b.height(), colors[b.colorType()], alphas[b.alphaType()]);
+    };
+    SkBitmap one, two;
+    if (!one.tryAllocPixels(
+            SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType))) {
+        return;
+    }
+    if (!two.tryAllocPixels(
+            SkImageInfo::Make(2, 2, kBGRA_8888_SkColorType, kPremul_SkAlphaType))) {
+        return;
+    }
+    for (int index = 0; index < 2; ++index) {
+       debugster("one", one);
+       debugster("two", two);
+       one.swap(two);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_007.cpp b/docs/examples/Bitmap_007.cpp
new file mode 100644
index 0000000..8e55515
--- /dev/null
+++ b/docs/examples/Bitmap_007.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7f972d742dd78d2500034d8867e9ef2f
+REG_FIDDLE(Bitmap_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(10, 11));
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorWHITE);
+    SkPaint paint;
+    SkFont font;
+    font.setEdging(SkFont::Edging::kAlias);
+    offscreen.drawString("&", 0, 10, font, paint);
+    const SkPixmap& pixmap = bitmap.pixmap();
+    if (pixmap.addr()) {
+        SkPMColor pmWhite = *pixmap.addr32(0, 0);
+        for (int y = 0; y < pixmap.height(); ++y) {
+            for (int x = 0; x < pixmap.width(); ++x) {
+                SkDebugf("%c", *pixmap.addr32(x, y) == pmWhite ? '-' : 'x');
+            }
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_008.cpp b/docs/examples/Bitmap_008.cpp
new file mode 100644
index 0000000..8aae2e3
--- /dev/null
+++ b/docs/examples/Bitmap_008.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ec47c4dc23e2925ad565eaba55a91553
+REG_FIDDLE(Bitmap_008, 256, 256, true, 4) {
+void draw(SkCanvas* canvas) {
+    // SkBitmap source;  // pre-populated with soccer ball by fiddle.skia.org
+    const SkImageInfo& info = source.info();
+    const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkDebugf("width: %d height: %d color: %s alpha: %s\n", info.width(), info.height(),
+                colors[info.colorType()], alphas[info.alphaType()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_009.cpp b/docs/examples/Bitmap_009.cpp
new file mode 100644
index 0000000..c85fc11
--- /dev/null
+++ b/docs/examples/Bitmap_009.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d06880c42f8bb3b4c3b67bd988046049
+REG_FIDDLE(Bitmap_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeA8(16, 32);
+    SkBitmap bitmap;
+    bitmap.setInfo(info);
+    SkDebugf("bitmap width: %d  info width: %d\n", bitmap.width(), info.width());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_010.cpp b/docs/examples/Bitmap_010.cpp
new file mode 100644
index 0000000..7cc01bc
--- /dev/null
+++ b/docs/examples/Bitmap_010.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c79a196278c58b34cd5f551b0124ecc9
+REG_FIDDLE(Bitmap_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeA8(16, 32);
+    SkBitmap bitmap;
+    bitmap.setInfo(info);
+    SkDebugf("bitmap height: %d  info height: %d\n", bitmap.height(), info.height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_011.cpp b/docs/examples/Bitmap_011.cpp
new file mode 100644
index 0000000..2d905c8
--- /dev/null
+++ b/docs/examples/Bitmap_011.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ceb77fab7326b57822a147b04aa0960e
+REG_FIDDLE(Bitmap_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeA8(16, 32));
+    SkDebugf("color type: k" "%s" "_SkColorType\n", colors[bitmap.colorType()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_012.cpp b/docs/examples/Bitmap_012.cpp
new file mode 100644
index 0000000..d45b507
--- /dev/null
+++ b/docs/examples/Bitmap_012.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=070b1a60232be499eb10c6ea62371804
+REG_FIDDLE(Bitmap_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);
+    SkDebugf("alpha type: k" "%s" "_SkAlphaType\n", alphas[pixmap.alphaType()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_013.cpp b/docs/examples/Bitmap_013.cpp
new file mode 100644
index 0000000..5b2c4d5
--- /dev/null
+++ b/docs/examples/Bitmap_013.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=817f95879fadba44baf87ea60e9b595a
+REG_FIDDLE(Bitmap_013, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
+            SkColorSpace::MakeSRGBLinear()));
+    SkColorSpace* colorSpace = bitmap.colorSpace();
+    SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n",
+            colorSpace->gammaCloseToSRGB() ? "true" : "false",
+            colorSpace->gammaIsLinear() ? "true" : "false",
+            colorSpace->isSRGB() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_014.cpp b/docs/examples/Bitmap_014.cpp
new file mode 100644
index 0000000..4d90ea5
--- /dev/null
+++ b/docs/examples/Bitmap_014.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cb028b7931da85b949ad0953b9711f9f
+REG_FIDDLE(Bitmap_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap1, bitmap2;
+    bitmap1.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
+            SkColorSpace::MakeSRGBLinear()));
+    bitmap2.setInfo(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
+            bitmap1.refColorSpace()));
+    SkColorSpace* colorSpace = bitmap2.colorSpace();
+    SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n",
+            colorSpace->gammaCloseToSRGB() ? "true" : "false",
+            colorSpace->gammaIsLinear() ? "true" : "false",
+            colorSpace->isSRGB() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_015.cpp b/docs/examples/Bitmap_015.cpp
new file mode 100644
index 0000000..0127aa6
--- /dev/null
+++ b/docs/examples/Bitmap_015.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2a688e6f0a516c0d44a826381e9d637f
+REG_FIDDLE(Bitmap_015, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkImageInfo info = SkImageInfo::MakeA8(1, 1);
+    SkBitmap bitmap;
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        bitmap.setInfo(info.makeColorType(colorType));
+        SkDebugf("color: k" "%s" "_SkColorType" "%*s" "bytesPerPixel: %d\n",
+                colors[colorType], 13 - strlen(colors[colorType]), " ",
+                bitmap.bytesPerPixel());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_016.cpp b/docs/examples/Bitmap_016.cpp
new file mode 100644
index 0000000..4efe927
--- /dev/null
+++ b/docs/examples/Bitmap_016.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=03a9e08082a23a98de17c3e24871d61a
+REG_FIDDLE(Bitmap_016, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    for (int rowBytes : { 4, 5, 6, 7, 8} ) {
+        bitmap.setInfo(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), rowBytes);
+        SkDebugf("rowBytes: %d rowBytesAsPixels: %d\n", rowBytes, bitmap.rowBytesAsPixels());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_017.cpp b/docs/examples/Bitmap_017.cpp
new file mode 100644
index 0000000..bc2d2e0
--- /dev/null
+++ b/docs/examples/Bitmap_017.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=56ede4b7d45c15d5936f81ac3d74f070
+REG_FIDDLE(Bitmap_017, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkImageInfo info = SkImageInfo::MakeA8(1, 1);
+    SkBitmap bitmap;
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        bitmap.setInfo(info.makeColorType(colorType));
+        SkDebugf("color: k" "%s" "_SkColorType" "%*s" "shiftPerPixel: %d\n",
+                colors[colorType], 14 - strlen(colors[colorType]), " ",
+                bitmap.shiftPerPixel());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_018.cpp b/docs/examples/Bitmap_018.cpp
new file mode 100644
index 0000000..9233ae2
--- /dev/null
+++ b/docs/examples/Bitmap_018.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a3762c2722b56ba55e42689c527f146c
+REG_FIDDLE(Bitmap_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    for (int width : { 0, 2 } ) {
+        for (int height : { 0, 2 } ) {
+             bitmap.setInfo(SkImageInfo::MakeA8(width, height));
+             SkDebugf("width: %d height: %d empty: %s\n", width, height,
+                      bitmap.empty() ? "true" : "false");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_019.cpp b/docs/examples/Bitmap_019.cpp
new file mode 100644
index 0000000..01ca915
--- /dev/null
+++ b/docs/examples/Bitmap_019.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=211ec89418011aa6e54aa2cc9567e003
+REG_FIDDLE(Bitmap_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    SkDebugf("empty bitmap does %shave pixels\n", bitmap.isNull() ? "not " : "");
+    bitmap.setInfo(SkImageInfo::MakeA8(8, 8));
+    SkDebugf("bitmap with dimensions does %shave pixels\n", bitmap.isNull() ? "not " : "");
+    bitmap.allocPixels();
+    SkDebugf("allocated bitmap does %shave pixels\n", bitmap.isNull() ? "not " : "");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_020.cpp b/docs/examples/Bitmap_020.cpp
new file mode 100644
index 0000000..ce68d3f
--- /dev/null
+++ b/docs/examples/Bitmap_020.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=daacf43394ce4045a362a48b5774deed
+REG_FIDDLE(Bitmap_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    for (int w : { 0, 8 } ) {
+        for (bool allocate : { false, true} ) {
+            bitmap.setInfo(SkImageInfo::MakeA8(w, 8));
+            allocate ? bitmap.allocPixels() : (void) 0 ;
+            SkDebugf("empty:%s isNull:%s drawsNothing:%s\n", bitmap.empty() ? "true " : "false",
+                     bitmap.isNull() ? "true " : "false", bitmap.drawsNothing() ? "true" : "false");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_021.cpp b/docs/examples/Bitmap_021.cpp
new file mode 100644
index 0000000..a006212
--- /dev/null
+++ b/docs/examples/Bitmap_021.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a654fd0b73f424859ae6c95e03f55099
+REG_FIDDLE(Bitmap_021, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    for (int rowBytes : { 2, 8 } ) {
+        bool result = bitmap.setInfo(SkImageInfo::MakeA8(4, 4), rowBytes);
+        SkDebugf("setInfo returned:%s rowBytes:%d\n", result ? "true " : "false", bitmap.rowBytes());
+     }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_022.cpp b/docs/examples/Bitmap_022.cpp
new file mode 100644
index 0000000..1c53d59
--- /dev/null
+++ b/docs/examples/Bitmap_022.cpp
@@ -0,0 +1,34 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=af3adcbea7b58bf90298ca5e0ea93030
+REG_FIDDLE(Bitmap_022, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                             "RGBA_F16"};
+    const char* alphas[] = {"Unknown ", "Opaque  ", "Premul  ", "Unpremul"};
+    SkBitmap bitmap;
+    SkAlphaType alphaTypes[] = { kUnknown_SkAlphaType, kOpaque_SkAlphaType, kPremul_SkAlphaType,
+    kUnpremul_SkAlphaType
+                               };
+    SkDebugf("%18s%15s%17s%18s%19s\n", "Canonical", "Unknown", "Opaque", "Premul", "Unpremul");
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        for (SkAlphaType canonicalAlphaType : alphaTypes) {
+            SkColorTypeValidateAlphaType(colorType, kUnknown_SkAlphaType, &canonicalAlphaType );
+            SkDebugf("%12s %9s  ", colors[(int) colorType], alphas[(int) canonicalAlphaType ]);
+            for (SkAlphaType alphaType : alphaTypes) {
+                bitmap.setInfo(SkImageInfo::Make(4, 4, colorType, canonicalAlphaType));
+                bool result = bitmap.setAlphaType(alphaType);
+                SkDebugf("%s %s    ", result ? "true " : "false", alphas[(int) bitmap.alphaType()]);
+            }
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_023.cpp b/docs/examples/Bitmap_023.cpp
new file mode 100644
index 0000000..1c00991
--- /dev/null
+++ b/docs/examples/Bitmap_023.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e006bb05cf74ec8d2b3d6adeb5dba11b
+REG_FIDDLE(Bitmap_023, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeN32(4, 4, kPremul_SkAlphaType));
+    bitmap.allocPixels();
+    bitmap.eraseColor(0x00000000);
+    void* baseAddr = bitmap.getPixels();
+    *(SkPMColor*)baseAddr = 0xFFFFFFFF;
+    SkDebugf("bitmap.getColor(0, 1) %c= 0x00000000\n",
+              bitmap.getColor(0, 1)  == 0x00000000 ? '=' : '!');
+    SkDebugf("bitmap.getColor(0, 0) %c= 0xFFFFFFFF\n",
+              bitmap.getColor(0, 0)  == 0xFFFFFFFF ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_024.cpp b/docs/examples/Bitmap_024.cpp
new file mode 100644
index 0000000..ffa91bb
--- /dev/null
+++ b/docs/examples/Bitmap_024.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=165c8f208829fc0908e8a50da60c0076
+REG_FIDDLE(Bitmap_024, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    for (int width : { 1, 1000, 1000000 } ) {
+        for (int height: { 1, 1000, 1000000 } ) {
+            SkImageInfo imageInfo = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
+            bitmap.setInfo(imageInfo, width * 5);
+            SkDebugf("width: %7d height: %7d computeByteSize: %13lld\n", width, height,
+                     bitmap.computeByteSize());
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_025.cpp b/docs/examples/Bitmap_025.cpp
new file mode 100644
index 0000000..75b0c8a
--- /dev/null
+++ b/docs/examples/Bitmap_025.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=db61fdcd382342ee88ea1b4f27c27b95
+REG_FIDDLE(Bitmap_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap original;
+    SkImageInfo info = SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
+    if (original.tryAllocPixels(info)) {
+        original.setImmutable();
+        SkBitmap copy;
+        original.extractSubset(&copy, {5, 10, 15, 20});
+        SkDebugf("original is " "%s" "immutable\n", original.isImmutable() ? "" : "not ");
+        SkDebugf("copy is " "%s" "immutable\n", copy.isImmutable() ? "" : "not ");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_026.cpp b/docs/examples/Bitmap_026.cpp
new file mode 100644
index 0000000..6da97c1
--- /dev/null
+++ b/docs/examples/Bitmap_026.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9210060d1f4ca46e1375496237902ef3
+REG_FIDDLE(Bitmap_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeN32(4, 4, kPremul_SkAlphaType));
+    bitmap.allocPixels();
+    SkCanvas offscreen(bitmap);
+    SkDebugf("draw white\n");
+    offscreen.clear(SK_ColorWHITE);
+    bitmap.setImmutable();
+    SkDebugf("draw black\n");
+    // Triggers assert if SK_DEBUG is true, runs fine otherwise.
+    // offscreen.clear(SK_ColorBLACK);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_027.cpp b/docs/examples/Bitmap_027.cpp
new file mode 100644
index 0000000..8908daf
--- /dev/null
+++ b/docs/examples/Bitmap_027.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5e76b68bb46d54315eb0c12d83bd6949
+REG_FIDDLE(Bitmap_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int height = 2;
+    const int width = 2;
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType));
+    for (int index = 0; index < 2; ++index) {
+        bitmap.allocPixels();
+        bitmap.eraseColor(0x00000000);
+        SkDebugf("isOpaque: %s\n", bitmap.isOpaque() ? "true" : "false");
+        bitmap.eraseColor(0xFFFFFFFF);
+        SkDebugf("isOpaque: %s\n", bitmap.isOpaque() ? "true" : "false");
+        bitmap.setInfo(bitmap.info().makeAlphaType(kOpaque_SkAlphaType));
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_028.cpp b/docs/examples/Bitmap_028.cpp
new file mode 100644
index 0000000..517cfc5
--- /dev/null
+++ b/docs/examples/Bitmap_028.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=23c4543ac6cdd0e8fe762816a0dc2e03
+REG_FIDDLE(Bitmap_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap original;
+    SkImageInfo info = SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
+    if (original.tryAllocPixels(info)) {
+        original.setIsVolatile(true);
+        SkBitmap copy;
+        original.extractSubset(&copy, {5, 10, 15, 20});
+        SkDebugf("original is " "%s" "volatile\n", original.isVolatile() ? "" : "not ");
+        SkDebugf("copy is " "%s" "volatile\n", copy.isImmutable() ? "" : "not ");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_029.cpp b/docs/examples/Bitmap_029.cpp
new file mode 100644
index 0000000..91494cf
--- /dev/null
+++ b/docs/examples/Bitmap_029.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e8627a4df659b896402f89a91326618f
+REG_FIDDLE(Bitmap_029, 256, 20, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));
+    bitmap.allocPixels();
+    bitmap.eraseColor(SK_ColorRED);
+    canvas->scale(16, 16);
+    canvas->drawBitmap(bitmap, 0, 0);
+    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorBLUE);
+    canvas->drawBitmap(bitmap, 2, 0);
+    bitmap.setIsVolatile(true);
+    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 4, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_030.cpp b/docs/examples/Bitmap_030.cpp
new file mode 100644
index 0000000..a333412
--- /dev/null
+++ b/docs/examples/Bitmap_030.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=52ccaeda67924373c5b55a2b89fe314d
+REG_FIDDLE(Bitmap_030, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));
+    bitmap.allocPixels();
+    SkDebugf("width:%d height:%d isNull:%s\n", bitmap.width(), bitmap.height(),
+             bitmap.isNull() ? "true" : "false");
+    bitmap.reset();
+    SkDebugf("width:%d height:%d isNull:%s\n", bitmap.width(), bitmap.height(),
+             bitmap.isNull() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_031.cpp b/docs/examples/Bitmap_031.cpp
new file mode 100644
index 0000000..98cb453
--- /dev/null
+++ b/docs/examples/Bitmap_031.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9df1baa17658fbd0c419780f26fd854f
+REG_FIDDLE(Bitmap_031, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::Make(2, 2, kN32_SkColorType, kPremul_SkAlphaType));
+    for (int index = 0; index < 2; ++index) {
+        bitmap.allocPixels();
+        bitmap.eraseColor(0x00000000);
+        SkDebugf("computeIsOpaque: %s\n", SkBitmap::ComputeIsOpaque(bitmap) ? "true" : "false");
+        bitmap.eraseColor(0xFFFFFFFF);
+        SkDebugf("computeIsOpaque: %s\n", SkBitmap::ComputeIsOpaque(bitmap) ? "true" : "false");
+        bitmap.setInfo(bitmap.info().makeAlphaType(kOpaque_SkAlphaType));
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_032.cpp b/docs/examples/Bitmap_032.cpp
new file mode 100644
index 0000000..2d423e4
--- /dev/null
+++ b/docs/examples/Bitmap_032.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2431ebc7e7d1e91e6d9daafd0f7a478f
+REG_FIDDLE(Bitmap_032, 256, 160, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkRect bounds;
+    source.getBounds(&bounds);
+    bounds.offset(100, 100);
+    SkPaint paint;
+    paint.setColor(SK_ColorGRAY);
+    canvas->scale(.25f, .25f);
+    canvas->drawRect(bounds, paint);
+    canvas->drawBitmap(source, 40, 40);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_033.cpp b/docs/examples/Bitmap_033.cpp
new file mode 100644
index 0000000..c402714
--- /dev/null
+++ b/docs/examples/Bitmap_033.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0c45da35172bc0a529b2faecddae62a2
+REG_FIDDLE(Bitmap_033, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkIRect bounds;
+    source.getBounds(&bounds);
+    bounds.inset(100, 100);
+    SkBitmap bitmap;
+    source.extractSubset(&bitmap, bounds);
+    canvas->scale(.5f, .5f);
+    canvas->drawBitmap(bitmap, 10, 10);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_034.cpp b/docs/examples/Bitmap_034.cpp
new file mode 100644
index 0000000..ea7b030
--- /dev/null
+++ b/docs/examples/Bitmap_034.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3e9126152ff1cc592aef6facbcb5fc96
+REG_FIDDLE(Bitmap_034, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(.5f, .5f);
+    SkIRect bounds = source.bounds();
+    for (int x : { 0, bounds.width() } ) {
+        for (int y : { 0, bounds.height() } ) {
+            canvas->drawBitmap(source, x, y);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_035.cpp b/docs/examples/Bitmap_035.cpp
new file mode 100644
index 0000000..421dcf4
--- /dev/null
+++ b/docs/examples/Bitmap_035.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=647056bcc12c27fb4413f212f33a2898
+REG_FIDDLE(Bitmap_035, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeN32(33, 55, kOpaque_SkAlphaType));
+    SkISize dimensions = bitmap.dimensions();
+    SkRect bounds;
+    bitmap.getBounds(&bounds);
+    SkRect dimensionsAsBounds = SkRect::Make(dimensions);
+    SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_036.cpp b/docs/examples/Bitmap_036.cpp
new file mode 100644
index 0000000..f2c8cfd
--- /dev/null
+++ b/docs/examples/Bitmap_036.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d6dd0b425aa550f21b938a18c2e1a981
+REG_FIDDLE(Bitmap_036, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    SkIRect bounds;
+    source.getBounds(&bounds);
+    bounds.inset(100, 100);
+    SkBitmap subset;
+    source.extractSubset(&subset, bounds);
+    SkIRect r = source.getSubset();
+    SkDebugf("source: %d, %d, %d, %d\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+    r = subset.getSubset();
+    SkDebugf("subset: %d, %d, %d, %d\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_037.cpp b/docs/examples/Bitmap_037.cpp
new file mode 100644
index 0000000..2c600d3
--- /dev/null
+++ b/docs/examples/Bitmap_037.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=599ab64d0aea005498176249bbfb64eb
+REG_FIDDLE(Bitmap_037, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeN32(44, 16, kOpaque_SkAlphaType));
+    bitmap.allocPixels();
+    bitmap.eraseColor(SK_ColorGREEN);
+    SkCanvas offscreen(bitmap);
+    SkPaint paint;
+    SkFont font;
+    offscreen.drawString("!@#$%", 0, 12, font, paint);
+    canvas->scale(6, 6);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_038.cpp b/docs/examples/Bitmap_038.cpp
new file mode 100644
index 0000000..5c4990c
--- /dev/null
+++ b/docs/examples/Bitmap_038.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f1d1880d38e0aea4cefd3e11745e8a09
+REG_FIDDLE(Bitmap_038, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    if (!bitmap.tryAllocPixelsFlags(SkImageInfo::MakeN32(10000, 10000, kOpaque_SkAlphaType),
+                                    SkBitmap::kZeroPixels_AllocFlag)) {
+        SkDebugf("bitmap allocation failed!\n");
+    } else {
+        SkDebugf("bitmap allocation succeeded!\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_039.cpp b/docs/examples/Bitmap_039.cpp
new file mode 100644
index 0000000..b9d6c15
--- /dev/null
+++ b/docs/examples/Bitmap_039.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=737e721c7d9e0f367d25521a1b823b9d
+REG_FIDDLE(Bitmap_039, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixelsFlags(SkImageInfo::MakeN32(44, 16, kPremul_SkAlphaType),
+                            SkBitmap::kZeroPixels_AllocFlag);
+    SkCanvas offscreen(bitmap);
+    SkPaint paint;
+    SkFont font;
+    offscreen.drawString("!@#$%", 0, 12, font, paint);
+    canvas->scale(6, 6);
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawBitmap(bitmap, 8, 8);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_040.cpp b/docs/examples/Bitmap_040.cpp
new file mode 100644
index 0000000..56f58ce
--- /dev/null
+++ b/docs/examples/Bitmap_040.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=34479d5aa23ce9f5e334b0786c9edb22
+REG_FIDDLE(Bitmap_040, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    SkImageInfo info = SkImageInfo::Make(64, 256, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    if (bitmap.tryAllocPixels(info, 0)) {
+        SkCanvas offscreen(bitmap);
+        offscreen.scale(.5f, .5f);
+        for (int x : { 0, 64, 128, 192 } ) {
+            offscreen.drawBitmap(source, -x, 0);
+            canvas->drawBitmap(bitmap, x, 0);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_041.cpp b/docs/examples/Bitmap_041.cpp
new file mode 100644
index 0000000..336646b
--- /dev/null
+++ b/docs/examples/Bitmap_041.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=555c0f62f96602a9dcd459badcd005e0
+REG_FIDDLE(Bitmap_041, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    SkImageInfo info = SkImageInfo::Make(256, 64, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    bitmap.allocPixels(info, info.width() * info.bytesPerPixel() + 64);
+    SkCanvas offscreen(bitmap);
+    offscreen.scale(.5f, .5f);
+    for (int y : { 0, 64, 128, 192 } ) {
+        offscreen.drawBitmap(source, 0, -y);
+        canvas->drawBitmap(bitmap, 0, y);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_042.cpp b/docs/examples/Bitmap_042.cpp
new file mode 100644
index 0000000..342e073
--- /dev/null
+++ b/docs/examples/Bitmap_042.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7ef3d043c4c5885649e591dd7dca92ff
+REG_FIDDLE(Bitmap_042, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    if (bitmap.tryAllocPixels(SkImageInfo::Make(64, 64, kGray_8_SkColorType, kOpaque_SkAlphaType))) {
+        SkCanvas offscreen(bitmap);
+        offscreen.scale(.25f, .5f);
+        for (int y : { 0, 64, 128, 192 } ) {
+            offscreen.drawBitmap(source, -y, -y);
+            canvas->drawBitmap(bitmap, y, y);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_043.cpp b/docs/examples/Bitmap_043.cpp
new file mode 100644
index 0000000..32c8035
--- /dev/null
+++ b/docs/examples/Bitmap_043.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=91f474a11a2112cd5c88c40a9015048d
+REG_FIDDLE(Bitmap_043, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::Make(64, 64, kGray_8_SkColorType, kOpaque_SkAlphaType));
+    SkCanvas offscreen(bitmap);
+    offscreen.scale(.5f, .5f);
+    for (int y : { 0, 64, 128, 192 } ) {
+        offscreen.drawBitmap(source, -y, -y);
+        canvas->drawBitmap(bitmap, y, y);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_044.cpp b/docs/examples/Bitmap_044.cpp
new file mode 100644
index 0000000..dca595d
--- /dev/null
+++ b/docs/examples/Bitmap_044.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a2b1e0910f37066f15ae56368775a6d8
+REG_FIDDLE(Bitmap_044, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    if (bitmap.tryAllocN32Pixels(80, 80)) {
+        bitmap.eraseColor(SK_ColorTRANSPARENT);
+        bitmap.erase(0x7f3f7fff, SkIRect::MakeWH(50, 30));
+        bitmap.erase(0x3f7fff3f, SkIRect::MakeXYWH(20, 10, 50, 30));
+        bitmap.erase(0x5fff3f7f, SkIRect::MakeXYWH(40, 20, 50, 30));
+        canvas->drawBitmap(bitmap, 0, 0);
+        for (int x : { 0, 30, 60, 90 } ) {
+            canvas->drawBitmap(bitmap, x, 70);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_045.cpp b/docs/examples/Bitmap_045.cpp
new file mode 100644
index 0000000..f61a667
--- /dev/null
+++ b/docs/examples/Bitmap_045.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c717491f9251604724c9cbde7088ec20
+REG_FIDDLE(Bitmap_045, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRandom random;
+    SkBitmap bitmap;
+    bitmap.allocN32Pixels(64, 64);
+    bitmap.eraseColor(SK_ColorTRANSPARENT);
+    for (int y = 0; y < 256; y += 64) {
+        for (int x = 0; x < 256; x += 64) {
+            SkColor color = random.nextU();
+            uint32_t w = random.nextRangeU(4, 32);
+            uint32_t cx = random.nextRangeU(0, 64 - w);
+            uint32_t h = random.nextRangeU(4, 32);
+            uint32_t cy = random.nextRangeU(0, 64 - h);
+            bitmap.erase(color, SkIRect::MakeXYWH(cx, cy, w, h));
+            canvas->drawBitmap(bitmap, x, y);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_046.cpp b/docs/examples/Bitmap_046.cpp
new file mode 100644
index 0000000..792cdb1
--- /dev/null
+++ b/docs/examples/Bitmap_046.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8c4f7bf73fffa1a812ee8e88e44e639c
+REG_FIDDLE(Bitmap_046, 256, 256, true, 0) {
+static void releaseProc(void* addr, void* ) {
+    SkDebugf("releaseProc called\n");
+    delete[] (uint32_t*) addr;
+}
+
+void draw(SkCanvas* canvas) {
+   SkBitmap bitmap;
+   void* pixels = new uint32_t[8 * 8];
+   SkImageInfo info = SkImageInfo::MakeN32(8, 8, kOpaque_SkAlphaType);
+   SkDebugf("before installPixels\n");
+   bool installed = bitmap.installPixels(info, pixels, 16, releaseProc, nullptr);
+   SkDebugf("install " "%s" "successful\n", installed ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_047.cpp b/docs/examples/Bitmap_047.cpp
new file mode 100644
index 0000000..f58d1fb
--- /dev/null
+++ b/docs/examples/Bitmap_047.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a7e04447b2081010c50d7920e80a6bb2
+REG_FIDDLE(Bitmap_047, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkRandom random;
+   SkBitmap bitmap;
+   const int width = 8;
+   const int height = 8;
+   uint32_t pixels[width * height];
+   for (unsigned x = 0; x < width * height; ++x) {
+       pixels[x] = random.nextU();
+   }
+   SkImageInfo info = SkImageInfo::MakeN32(width, height, kUnpremul_SkAlphaType);
+   if (bitmap.installPixels(info, pixels, info.minRowBytes())) {
+       canvas->scale(32, 32);
+       canvas->drawBitmap(bitmap, 0, 0);
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_048.cpp b/docs/examples/Bitmap_048.cpp
new file mode 100644
index 0000000..928e0bf
--- /dev/null
+++ b/docs/examples/Bitmap_048.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6e2a8c9358b34aebd2ec586815fe9d3a
+REG_FIDDLE(Bitmap_048, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
+                            { 0xAC, 0xA8, 0x89, 0x47, 0x87 },
+                            { 0x4B, 0x25, 0x25, 0x25, 0x46 },
+                            { 0x90, 0x81, 0x25, 0x41, 0x33 },
+                            { 0x75, 0x55, 0x44, 0x20, 0x00 }};
+    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->scale(10, 10);
+    canvas->drawBitmap(bitmap, 0, 0);
+    *pixmap.writable_addr8(2, 2) = 0xFF;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 10, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_049.cpp b/docs/examples/Bitmap_049.cpp
new file mode 100644
index 0000000..5ed9d2c
--- /dev/null
+++ b/docs/examples/Bitmap_049.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f0db16e06c9a1436917c8179f8c1718f
+REG_FIDDLE(Bitmap_049, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 };
+    uint8_t set2[5] = { 0xAC, 0xA8, 0x89, 0x47, 0x87 };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5);
+    canvas->scale(10, 50);
+    canvas->drawBitmap(bitmap, 0, 0);
+    bitmap.setPixels(set2);
+    canvas->drawBitmap(bitmap, 10, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_050.cpp b/docs/examples/Bitmap_050.cpp
new file mode 100644
index 0000000..e03dfa0
--- /dev/null
+++ b/docs/examples/Bitmap_050.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=720e4c053fae9e929ab6518b47e49370
+REG_FIDDLE(Bitmap_050, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5);
+    canvas->scale(10, 50);
+    canvas->drawBitmap(bitmap, 0, 0);
+    if (bitmap.tryAllocPixels()) {
+        bitmap.eraseColor(SK_ColorBLACK);
+        canvas->drawBitmap(bitmap, 8, 0);
+        bitmap.setPixels(set1);
+        canvas->drawBitmap(bitmap, 16, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_051.cpp b/docs/examples/Bitmap_051.cpp
new file mode 100644
index 0000000..1a859cb
--- /dev/null
+++ b/docs/examples/Bitmap_051.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1219b38c788bf270fb20f8cd2d78cff8
+REG_FIDDLE(Bitmap_051, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t set1[5] = { 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 };
+    uint8_t set2[5] = { 0xAC, 0xA8, 0x89, 0x47, 0x87 };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::Make(5, 1, kGray_8_SkColorType, kOpaque_SkAlphaType), set1, 5);
+    canvas->scale(10, 50);
+    canvas->drawBitmap(bitmap, 0, 0);
+    bitmap.allocPixels();
+    bitmap.eraseColor(SK_ColorBLACK);
+    canvas->drawBitmap(bitmap, 8, 0);
+    bitmap.setPixels(set2);
+    canvas->drawBitmap(bitmap, 16, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_052.cpp b/docs/examples/Bitmap_052.cpp
new file mode 100644
index 0000000..54e29cb
--- /dev/null
+++ b/docs/examples/Bitmap_052.cpp
@@ -0,0 +1,45 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eb6f861ca1839146d26e40d56c2a001c
+REG_FIDDLE(Bitmap_052, 256, 100, false, 0) {
+class LargePixelRef : public SkPixelRef {
+public:
+    LargePixelRef(const SkImageInfo& info, char* storage, size_t rowBytes)
+        : SkPixelRef(info.width(), info.height(), storage, rowBytes) {
+    }
+    ~LargePixelRef() override {
+        delete[] (char* ) this->pixels();
+    }
+};
+class LargeAllocator : public SkBitmap::Allocator {
+public:
+    bool allocPixelRef(SkBitmap* bitmap) override {
+        const SkImageInfo& info = bitmap->info();
+        uint64_t rowBytes = info.minRowBytes64();
+        uint64_t size = info.height() * rowBytes;
+        char* addr = new char[size];
+        if (nullptr == addr) {
+            return false;
+        }
+        sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(new LargePixelRef(info, addr, rowBytes));
+        if (!pr) {
+            return false;
+        }
+        bitmap->setPixelRef(std::move(pr), 0, 0);
+        return true;
+    }
+};
+
+void draw(SkCanvas* canvas) {
+   LargeAllocator largeAllocator;
+   SkBitmap bitmap;
+   int width = 100; // make this 20000
+   int height = 100; // and this 100000 to allocate 8 gigs on a 64-bit platform
+   bitmap.setInfo(SkImageInfo::MakeN32(width, height, kOpaque_SkAlphaType));
+   if (bitmap.tryAllocPixels(&largeAllocator)) {
+       bitmap.eraseColor(0xff55aa33);
+       canvas->drawBitmap(bitmap, 0, 0);
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_053.cpp b/docs/examples/Bitmap_053.cpp
new file mode 100644
index 0000000..b622ecf
--- /dev/null
+++ b/docs/examples/Bitmap_053.cpp
@@ -0,0 +1,32 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1b2800d23c9ea249b45c2c21a34b6d14
+REG_FIDDLE(Bitmap_053, 256, 32, false, 0) {
+class TinyAllocator : public SkBitmap::Allocator {
+public:
+    bool allocPixelRef(SkBitmap* bitmap) override {
+        const SkImageInfo& info = bitmap->info();
+        if (info.height() * info.minRowBytes() > sizeof(storage)) {
+            return false;
+        }
+        sk_sp<SkPixelRef> pr = sk_sp<SkPixelRef>(
+                new SkPixelRef(info.width(), info.height(), storage, info.minRowBytes()));
+        bitmap->setPixelRef(std::move(pr), 0, 0);
+        return true;
+    }
+    char storage[16];
+};
+
+void draw(SkCanvas* canvas) {
+   TinyAllocator tinyAllocator;
+   SkBitmap bitmap;
+   bitmap.setInfo(SkImageInfo::MakeN32(2, 2, kOpaque_SkAlphaType));
+   if (bitmap.tryAllocPixels(&tinyAllocator)) {
+       bitmap.eraseColor(0xff55aa33);
+       bitmap.erase(0xffaa3355, SkIRect::MakeXYWH(1, 1, 1, 1));
+       canvas->scale(16, 16);
+       canvas->drawBitmap(bitmap, 0, 0);
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_054.cpp b/docs/examples/Bitmap_054.cpp
new file mode 100644
index 0000000..d47ed99
--- /dev/null
+++ b/docs/examples/Bitmap_054.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5db2d30870a7cc45f28e22578d1880c3
+REG_FIDDLE(Bitmap_054, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    SkBitmap subset;
+    source.extractSubset(&subset, SkIRect::MakeXYWH(32, 64, 128, 256));
+    SkDebugf("src ref %c= sub ref\n", source.pixelRef() == subset.pixelRef() ? '=' : '!');
+    SkDebugf("src pixels %c= sub pixels\n", source.getPixels() == subset.getPixels() ? '=' : '!');
+    SkDebugf("src addr %c= sub addr\n", source.getAddr(32, 64) == subset.getAddr(0, 0) ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_055.cpp b/docs/examples/Bitmap_055.cpp
new file mode 100644
index 0000000..0e97e3d
--- /dev/null
+++ b/docs/examples/Bitmap_055.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6d31686c6c0829c70f284ae716526d6a
+REG_FIDDLE(Bitmap_055, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    SkBitmap subset;
+    source.extractSubset(&subset, SkIRect::MakeXYWH(32, 64, 128, 256));
+    SkIPoint sourceOrigin = source.pixelRefOrigin();
+    SkIPoint subsetOrigin = subset.pixelRefOrigin();
+    SkDebugf("source origin: %d, %d\n", sourceOrigin.fX, sourceOrigin.fY);
+    SkDebugf("subset origin: %d, %d\n", subsetOrigin.fX, subsetOrigin.fY);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_056.cpp b/docs/examples/Bitmap_056.cpp
new file mode 100644
index 0000000..07a8838
--- /dev/null
+++ b/docs/examples/Bitmap_056.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f98cc0451c6e77a8833d261c9a484c5f
+REG_FIDDLE(Bitmap_056, 256, 140, false, 5) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::Make(source.width() - 5, source.height() - 5,
+                   kGray_8_SkColorType, kOpaque_SkAlphaType), source.rowBytes());
+    bitmap.setPixelRef(sk_ref_sp(source.pixelRef()), 5, 5);
+    canvas->drawBitmap(bitmap, 10, 10);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_057.cpp b/docs/examples/Bitmap_057.cpp
new file mode 100644
index 0000000..9296ede
--- /dev/null
+++ b/docs/examples/Bitmap_057.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e89c78ca992e2e789ed50944fe68f920
+REG_FIDDLE(Bitmap_057, 256, 160, false, 5) {
+void draw(SkCanvas* canvas) {
+    if (source.readyToDraw()) {
+        canvas->drawBitmap(source, 10, 10);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_058.cpp b/docs/examples/Bitmap_058.cpp
new file mode 100644
index 0000000..8822e2e
--- /dev/null
+++ b/docs/examples/Bitmap_058.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=db9dd91e0207c3941c09538555817b4b
+REG_FIDDLE(Bitmap_058, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    SkDebugf("empty id %u\n", bitmap.getGenerationID());
+    bitmap.allocPixels(SkImageInfo::MakeN32(64, 64, kOpaque_SkAlphaType));
+    SkDebugf("alloc id %u\n", bitmap.getGenerationID());
+    bitmap.eraseColor(SK_ColorRED);
+    SkDebugf("erase id %u\n", bitmap.getGenerationID());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_059.cpp b/docs/examples/Bitmap_059.cpp
new file mode 100644
index 0000000..88e81fd
--- /dev/null
+++ b/docs/examples/Bitmap_059.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8f463ed17b0ed4fb9c503a0ec71706f9
+REG_FIDDLE(Bitmap_059, 256, 20, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::Make(1, 1, kRGBA_8888_SkColorType, kOpaque_SkAlphaType));
+    bitmap.allocPixels();
+    bitmap.eraseColor(SK_ColorRED);
+    canvas->scale(16, 16);
+    canvas->drawBitmap(bitmap, 0, 0);
+    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorBLUE);
+    canvas->drawBitmap(bitmap, 2, 0);
+    bitmap.notifyPixelsChanged();
+    *(SkPMColor*) bitmap.getPixels() = SkPreMultiplyColor(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 4, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_060.cpp b/docs/examples/Bitmap_060.cpp
new file mode 100644
index 0000000..9b1d363
--- /dev/null
+++ b/docs/examples/Bitmap_060.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=418928dbfffa9eb00c8225530f44baf5
+REG_FIDDLE(Bitmap_060, 256, 20, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kOpaque_SkAlphaType));
+    bitmap.eraseColor(SK_ColorRED);
+    canvas->scale(16, 16);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_061.cpp b/docs/examples/Bitmap_061.cpp
new file mode 100644
index 0000000..61a1dcb
--- /dev/null
+++ b/docs/examples/Bitmap_061.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=67277b0a1003f340473a35982533561c
+REG_FIDDLE(Bitmap_061, 256, 80, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType));
+    bitmap.eraseARGB(0x7f, 0xff, 0x7f, 0x3f);
+    canvas->scale(50, 50);
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawBitmap(bitmap, .5f, .5f);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_062.cpp b/docs/examples/Bitmap_062.cpp
new file mode 100644
index 0000000..2aa7c2b
--- /dev/null
+++ b/docs/examples/Bitmap_062.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2c5c4230ccd2861a5d15b7cd2764ab6e
+REG_FIDDLE(Bitmap_062, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32(2, 2, kPremul_SkAlphaType));
+    bitmap.erase(0x7fff7f3f, SkIRect::MakeWH(1, 1));
+    bitmap.erase(0x7f7f3fff, SkIRect::MakeXYWH(0, 1, 1, 1));
+    bitmap.erase(0x7f3fff7f, SkIRect::MakeXYWH(1, 0, 1, 1));
+    bitmap.erase(0x7f1fbf5f, SkIRect::MakeXYWH(1, 1, 1, 1));
+    canvas->scale(25, 25);
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawBitmap(bitmap, .5f, .5f);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_063.cpp b/docs/examples/Bitmap_063.cpp
new file mode 100644
index 0000000..7726729
--- /dev/null
+++ b/docs/examples/Bitmap_063.cpp
@@ -0,0 +1,33 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=193d1f6d8a43b7a8e9f27ba21de38617
+REG_FIDDLE(Bitmap_063, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    SkColor colors[][w] = {
+        { 0x00000000, 0x2a0e002a, 0x55380055, 0x7f7f007f },
+        { 0x2a000e2a, 0x551c1c55, 0x7f542a7f, 0xaaaa38aa },
+        { 0x55003855, 0x7f2a547f, 0xaa7171aa, 0xd4d48dd4 },
+        { 0x7f007f7f, 0xaa38aaaa, 0xd48dd4d4, 0xffffffff }
+    };
+    SkDebugf("Premultiplied:\n");
+    for (int y = 0; y < h; ++y) {
+        SkDebugf("(0, %d) ", y);
+        for (int x = 0; x < w; ++x) {
+            SkDebugf("0x%08x%c", colors[y][x], x == w - 1 ? '\n' : ' ');
+        }
+    }
+    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), colors, w * 4);
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    SkDebugf("Unpremultiplied:\n");
+    for (int y = 0; y < h; ++y) {
+        SkDebugf("(0, %d) ", y);
+        for (int x = 0; x < w; ++x) {
+            SkDebugf("0x%08x%c", bitmap.getColor(x, y), x == w - 1 ? '\n' : ' ');
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_064.cpp b/docs/examples/Bitmap_064.cpp
new file mode 100644
index 0000000..204c83f
--- /dev/null
+++ b/docs/examples/Bitmap_064.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ffcefb2344cd38c3b99f69cfe6d64a17
+REG_FIDDLE(Bitmap_064, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    char* row0 = (char* ) source.getAddr(0, 0);
+    char* row1 = (char* ) source.getAddr(0, 1);
+    SkDebugf("addr interval %c= rowBytes\n",
+             (size_t) (row1 - row0) == source.rowBytes() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_065.cpp b/docs/examples/Bitmap_065.cpp
new file mode 100644
index 0000000..84f23c7
--- /dev/null
+++ b/docs/examples/Bitmap_065.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=837a2bcc9fb9ce617a3420956cefc64a
+REG_FIDDLE(Bitmap_065, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    uint32_t* row0 = source.getAddr32(0, 0);
+    uint32_t* row1 = source.getAddr32(0, 1);
+    size_t interval = (row1 - row0) * source.bytesPerPixel();
+    SkDebugf("addr interval %c= rowBytes\n", interval == source.rowBytes() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_066.cpp b/docs/examples/Bitmap_066.cpp
new file mode 100644
index 0000000..855639e
--- /dev/null
+++ b/docs/examples/Bitmap_066.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=53e00899ef2e00e2096daf7a07d9b059
+REG_FIDDLE(Bitmap_066, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap16;
+    SkImageInfo dstInfo = SkImageInfo::Make(source.width(), source.height(), kARGB_4444_SkColorType,
+                     kPremul_SkAlphaType);
+    bitmap16.allocPixels(dstInfo);
+    if (source.readPixels(dstInfo, bitmap16.getPixels(), bitmap16.rowBytes(), 0, 0)) {
+        uint16_t* row0 = bitmap16.getAddr16(0, 0);
+        uint16_t* row1 = bitmap16.getAddr16(0, 1);
+        size_t interval = (row1 - row0) * bitmap16.bytesPerPixel();
+        SkDebugf("addr interval %c= rowBytes\n", interval == bitmap16.rowBytes() ? '=' : '!');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_067.cpp b/docs/examples/Bitmap_067.cpp
new file mode 100644
index 0000000..f01eb9a
--- /dev/null
+++ b/docs/examples/Bitmap_067.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cb9a08e8ff779b6a1cf8bb54f3883aaf
+REG_FIDDLE(Bitmap_067, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    const int width = 8;
+    const int height = 8;
+    uint8_t pixels[height][width];
+    SkImageInfo info = SkImageInfo::Make(width, height, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    if (bitmap.installPixels(info, pixels, info.minRowBytes())) {
+        SkDebugf("&pixels[4][2] %c= bitmap.getAddr8(2, 4)\n",
+                  &pixels[4][2]  == bitmap.getAddr8(2, 4) ? '=' : '!');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_068.cpp b/docs/examples/Bitmap_068.cpp
new file mode 100644
index 0000000..7510b85
--- /dev/null
+++ b/docs/examples/Bitmap_068.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=304148c50c91490bfd58e9222342419c
+REG_FIDDLE(Bitmap_068, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    SkIRect bounds, s;
+    source.getBounds(&bounds);
+    SkDebugf("bounds: %d, %d, %d, %d\n", bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    SkBitmap subset;
+    for (int left: { -100, 0, 100, 1000 } ) {
+         for (int right: { 0, 100, 1000 } ) {
+             SkIRect b = SkIRect::MakeLTRB(left, 100, right, 200);
+             bool success = source.extractSubset(&subset, b);
+             SkDebugf("subset: %4d, %4d, %4d, %4d  ", b.fLeft, b.fTop, b.fRight, b.fBottom);
+             SkDebugf("success; %s", success ? "true" : "false");
+             if (success) {
+                 subset.getBounds(&s);
+                 SkDebugf("  subset: %d, %d, %d, %d", s.fLeft, s.fTop, s.fRight, s.fBottom);
+             }
+             SkDebugf("\n");
+         }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_069.cpp b/docs/examples/Bitmap_069.cpp
new file mode 100644
index 0000000..7da8c49
--- /dev/null
+++ b/docs/examples/Bitmap_069.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b2cbbbbcffb618865d8aae3bc04b2a62
+REG_FIDDLE(Bitmap_069, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    const int width = 256;
+    const int height = 64;
+    SkImageInfo srcInfo = SkImageInfo::MakeN32Premul(width, height);
+    SkColor  gradColors[] = { 0xFFAA3300, 0x7F881122 };
+    SkPoint  gradPoints[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
+                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
+    SkBitmap bitmap;
+    bitmap.allocPixels(srcInfo);
+    SkCanvas srcCanvas(bitmap);
+    srcCanvas.drawRect(SkRect::MakeWH(width, height), paint);
+    canvas->drawBitmap(bitmap, 0, 0);
+    SkImageInfo dstInfo = srcInfo.makeColorType(kARGB_4444_SkColorType);
+    std::vector<int16_t> dstPixels;
+    dstPixels.resize(height * width);
+    bitmap.readPixels(dstInfo, &dstPixels.front(), width * 2, 0, 0);
+    SkPixmap dstPixmap(dstInfo, &dstPixels.front(), width * 2);
+    bitmap.installPixels(dstPixmap);
+    canvas->drawBitmap(bitmap, 0, 64);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_070.cpp b/docs/examples/Bitmap_070.cpp
new file mode 100644
index 0000000..c912d11
--- /dev/null
+++ b/docs/examples/Bitmap_070.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e9f70cbc9827097449a386ec7a8a8188
+REG_FIDDLE(Bitmap_070, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> srcPixels;
+    srcPixels.resize(source.height() * source.rowBytes());
+    for (int y = 0; y < 4; ++y) {
+        for (int x = 0; x < 4; ++x) {
+            SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width() / 4, source.height() / 4),
+                    &srcPixels.front() + x * source.height() * source.width() / 4 +
+                    y * source.width() / 4, source.rowBytes());
+            source.readPixels(pixmap, x * source.width() / 4, y * source.height() / 4);
+        }
+    }
+    canvas->scale(.5f, .5f);
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeN32Premul(source.width(), source.height()),
+                             &srcPixels.front(), source.rowBytes());
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_071.cpp b/docs/examples/Bitmap_071.cpp
new file mode 100644
index 0000000..db806fd
--- /dev/null
+++ b/docs/examples/Bitmap_071.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4590fbf052659d6e629fbfd827081ae5
+REG_FIDDLE(Bitmap_071, 256, 128, false, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> srcPixels;
+    srcPixels.resize(source.height() * source.width() * 8);
+    for (int i = 0;  i < 2; ++i) {
+    SkPixmap pixmap(SkImageInfo::Make(source.width() * 2, source.height(),
+                    i ? kRGBA_8888_SkColorType : kBGRA_8888_SkColorType, kPremul_SkAlphaType),
+                    &srcPixels.front() + i * source.width(), source.rowBytes() * 2);
+        source.readPixels(pixmap);
+    }
+    canvas->scale(.25f, .25f);
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeN32Premul(source.width() * 2, source.height()),
+                         &srcPixels.front(), source.rowBytes() * 2);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_072.cpp b/docs/examples/Bitmap_072.cpp
new file mode 100644
index 0000000..371535b
--- /dev/null
+++ b/docs/examples/Bitmap_072.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9b3133a6673d2514d166398adbe1f9f4
+REG_FIDDLE(Bitmap_072, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> srcPixels;
+    int width = image->width();
+    int height = image->height();
+    srcPixels.resize(height * width  * 4);
+    SkPixmap pixmap(SkImageInfo::MakeN32Premul(width, height), (const void*) &srcPixels.front(),
+                    width * 4);
+    image->readPixels(pixmap, 0, 0);
+    canvas->scale(.5f, .5f);
+    width /= 4;
+    height /= 4;
+    for (int y = 0; y < 4; ++y) {
+        for (int x = 0; x < 4; ++x) {
+            SkBitmap bitmap;
+            bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height));
+            bitmap.writePixels(pixmap, -y * width, -x * height);
+            canvas->drawBitmap(bitmap, x * width, y * height);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_073.cpp b/docs/examples/Bitmap_073.cpp
new file mode 100644
index 0000000..1a0efce
--- /dev/null
+++ b/docs/examples/Bitmap_073.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=faa5dfa466f6e16c07c124d971f32679
+REG_FIDDLE(Bitmap_073, 256, 80, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(2, 2));
+    bitmap.eraseColor(SK_ColorGREEN);
+    SkPMColor color = 0xFF5599BB;
+    SkPixmap src(SkImageInfo::MakeN32Premul(1, 1), &color, 4);
+    bitmap.writePixels(src);
+    canvas->scale(40, 40);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_074.cpp b/docs/examples/Bitmap_074.cpp
new file mode 100644
index 0000000..4e65ed8
--- /dev/null
+++ b/docs/examples/Bitmap_074.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ab6577df079e6c70511cf2bfc6447b44
+REG_FIDDLE(Bitmap_074, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap alpha, bitmap;
+    bitmap.allocN32Pixels(100, 100);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(0);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(SK_ColorBLUE);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    offscreen.drawCircle(50, 50, 39, paint);
+    offscreen.flush();
+    bitmap.extractAlpha(&alpha);
+    paint.setColor(SK_ColorRED);
+    canvas->drawBitmap(bitmap, 0, 0, &paint);
+    canvas->drawBitmap(alpha, 100, 0, &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_075.cpp b/docs/examples/Bitmap_075.cpp
new file mode 100644
index 0000000..a57ffc0
--- /dev/null
+++ b/docs/examples/Bitmap_075.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=092739b4cd5d732a27c07ced8ef45f01
+REG_FIDDLE(Bitmap_075, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto radiusToSigma = [](SkScalar radius) -> SkScalar {
+         static const SkScalar kBLUR_SIGMA_SCALE = 0.57735f;
+         return radius > 0 ? kBLUR_SIGMA_SCALE * radius + 0.5f : 0.0f;
+    };
+    SkBitmap alpha, bitmap;
+    bitmap.allocN32Pixels(100, 100);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(0);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(SK_ColorBLUE);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    offscreen.drawCircle(50, 50, 39, paint);
+    offscreen.flush();
+    paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, radiusToSigma(25)));
+    SkIPoint offset;
+    bitmap.extractAlpha(&alpha, &paint, &offset);
+    paint.setColor(SK_ColorRED);
+    canvas->drawBitmap(bitmap, 0, -offset.fY, &paint);
+    canvas->drawBitmap(alpha, 100 + offset.fX, 0, &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_076.cpp b/docs/examples/Bitmap_076.cpp
new file mode 100644
index 0000000..5751fd2
--- /dev/null
+++ b/docs/examples/Bitmap_076.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cd7543fa8c9f3cede46dc2d72eb8c4bd
+REG_FIDDLE(Bitmap_076, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap alpha, bitmap;
+    bitmap.allocN32Pixels(100, 100);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(0);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(SK_ColorBLUE);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    offscreen.drawCircle(50, 50, 39, paint);
+    offscreen.flush();
+    paint.setMaskFilter(SkMaskFilter::MakeBlur(kOuter_SkBlurStyle, 3));
+    SkIPoint offset;
+    bitmap.extractAlpha(&alpha, &paint, nullptr, &offset);
+    paint.setColor(SK_ColorRED);
+    canvas->drawBitmap(bitmap, 0, -offset.fY, &paint);
+    canvas->drawBitmap(alpha, 100 + offset.fX, 0, &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Bitmap_077.cpp b/docs/examples/Bitmap_077.cpp
new file mode 100644
index 0000000..53f8590f
--- /dev/null
+++ b/docs/examples/Bitmap_077.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0cc2c6a0dffa61a88711534bd3d43b40
+REG_FIDDLE(Bitmap_077, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(6, 11));
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorWHITE);
+    SkPaint paint;
+    SkFont font;
+    offscreen.drawString("?", 0, 10, font, paint);
+    SkPixmap pixmap;
+    if (bitmap.peekPixels(&pixmap)) {
+        const SkPMColor* pixels = pixmap.addr32();
+        SkPMColor pmWhite = pixels[0];
+        for (int y = 0; y < bitmap.height(); ++y) {
+            for (int x = 0; x < bitmap.width(); ++x) {
+                SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
+            }
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_000.cpp b/docs/examples/BlendMode_000.cpp
new file mode 100644
index 0000000..8dab5e9
--- /dev/null
+++ b/docs/examples/BlendMode_000.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a9b56a26ca469bab9ab10e16f62fb2e2
+REG_FIDDLE(BlendMode_000, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->saveLayer(nullptr, nullptr);
+    canvas->drawColor(SK_ColorYELLOW, SkBlendMode::kClear);
+    SkPaint paint;
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
+        SkColor colors[] = { color, SkColorSetA(color, 0) };
+        paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,
+                colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
+        canvas->drawCircle(64, 64, 100, paint);
+        canvas->translate(64, 64);
+    }
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_001.cpp b/docs/examples/BlendMode_001.cpp
new file mode 100644
index 0000000..5bcf294
--- /dev/null
+++ b/docs/examples/BlendMode_001.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0fc85dd916cc1a5896d36c80b9847391
+REG_FIDDLE(BlendMode_001, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->clipRect({50, 50, 200, 200});
+    SkPaint srcBlend;
+    srcBlend.setBlendMode(SkBlendMode::kSrc);
+    canvas->saveLayer(nullptr, &srcBlend);
+    canvas->drawColor(0);
+    SkPaint transRed;
+    transRed.setColor(SkColorSetA(SK_ColorRED, 127));
+    canvas->drawCircle(125, 125, 75, transRed);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_002.cpp b/docs/examples/BlendMode_002.cpp
new file mode 100644
index 0000000..726a38c
--- /dev/null
+++ b/docs/examples/BlendMode_002.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=35915a2273be1076f00f2e47998ce808
+REG_FIDDLE(BlendMode_002, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 125, 128 } };
+    SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };
+    SkColor colors[] = { 0x7f55aa00, 0x7f3333bf };
+    canvas->drawAtlas(image.get(), xforms, tex, colors, 2, SkBlendMode::kSrc, nullptr, nullptr);
+    canvas->translate(128, 0);
+    canvas->drawAtlas(image.get(), xforms, tex, colors, 2, SkBlendMode::kDst, nullptr, nullptr);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_003.cpp b/docs/examples/BlendMode_003.cpp
new file mode 100644
index 0000000..b301f8d
--- /dev/null
+++ b/docs/examples/BlendMode_003.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2ea9c149964a06cdb4929158cb4f15f8
+REG_FIDDLE(BlendMode_003, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstIn);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcOver);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_004.cpp b/docs/examples/BlendMode_004.cpp
new file mode 100644
index 0000000..09b7b8e
--- /dev/null
+++ b/docs/examples/BlendMode_004.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=10dbb4d97902956ef5f5f8562f65119e
+REG_FIDDLE(BlendMode_004, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstIn);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstOver);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_005.cpp b/docs/examples/BlendMode_005.cpp
new file mode 100644
index 0000000..bb3d86a
--- /dev/null
+++ b/docs/examples/BlendMode_005.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b0833c18fe8b0eeaab9bd6d2160d272f
+REG_FIDDLE(BlendMode_005, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstIn);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcIn);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_006.cpp b/docs/examples/BlendMode_006.cpp
new file mode 100644
index 0000000..4021b1b
--- /dev/null
+++ b/docs/examples/BlendMode_006.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a5eeba05ccf6097a5d110a9d64f97c25
+REG_FIDDLE(BlendMode_006, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstIn);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstIn);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_007.cpp b/docs/examples/BlendMode_007.cpp
new file mode 100644
index 0000000..750a12e
--- /dev/null
+++ b/docs/examples/BlendMode_007.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ccc1e74226e0c9eacbc21f1eed017b84
+REG_FIDDLE(BlendMode_007, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstIn);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcOut);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_008.cpp b/docs/examples/BlendMode_008.cpp
new file mode 100644
index 0000000..f894638
--- /dev/null
+++ b/docs/examples/BlendMode_008.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b9a894c9accfc5d94081bbd77d5d790a
+REG_FIDDLE(BlendMode_008, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstIn);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kDstOut);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_009.cpp b/docs/examples/BlendMode_009.cpp
new file mode 100644
index 0000000..0a70cea
--- /dev/null
+++ b/docs/examples/BlendMode_009.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a13148977bfc985934a92752c83a2041
+REG_FIDDLE(BlendMode_009, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstIn);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcATop);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_010.cpp b/docs/examples/BlendMode_010.cpp
new file mode 100644
index 0000000..16cc52b
--- /dev/null
+++ b/docs/examples/BlendMode_010.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1955856d45773a4fd914fcc1f813222f
+REG_FIDDLE(BlendMode_010, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstATop);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kSrcATop);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_011.cpp b/docs/examples/BlendMode_011.cpp
new file mode 100644
index 0000000..b244334
--- /dev/null
+++ b/docs/examples/BlendMode_011.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=29db2c7493d9098b8a086ddbe30dd6d6
+REG_FIDDLE(BlendMode_011, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kXor);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
+        SkColor colors[] = { color, SkColorSetA(color, 192), SkColorSetA(color, 128),
+                             SkColorSetA(color, 0) };
+        paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,
+                colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
+        canvas->drawCircle(64, 64, 100, paint);
+        canvas->translate(64, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_012.cpp b/docs/examples/BlendMode_012.cpp
new file mode 100644
index 0000000..a385f84
--- /dev/null
+++ b/docs/examples/BlendMode_012.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=05383441e510d54008402e128fc8ad2b
+REG_FIDDLE(BlendMode_012, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->drawColor(SK_ColorBLACK);
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kPlus);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
+        SkColor colors[] = { color, SkColorSetA(color, 192), SkColorSetA(color, 128),
+                             SkColorSetA(color, 0) };
+        paint.setShader(SkGradientShader::MakeRadial({ 64, 64}, 100,
+                colors, nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
+        canvas->drawCircle(64, 64, 100, paint);
+        canvas->translate(64, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_013.cpp b/docs/examples/BlendMode_013.cpp
new file mode 100644
index 0000000..2bf998b
--- /dev/null
+++ b/docs/examples/BlendMode_013.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3fdac2b2f48bd227d2e74234c260bc8e
+REG_FIDDLE(BlendMode_013, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto drawSquare = [=](int dx, int dy, SkBlendMode mode, const char* label) -> void {
+        const SkColor colors[] = { SK_ColorBLACK, SK_ColorWHITE };
+        const SkPoint horz[] = { { 0, 0 }, { 128, 0 } };
+        SkPaint paint;
+        paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+                SkShader::kClamp_TileMode));
+        paint.setBlendMode(mode);
+        canvas->translate(dx, dy);
+        canvas->drawRect({0, 0, 128, 128}, paint);
+        paint.setBlendMode(SkBlendMode::kXor);
+        SkFont font;
+        canvas->drawString(label, 40, 100, font, paint);
+    };
+    drawSquare(0, 0, SkBlendMode::kSrc, "destination");
+    drawSquare(128, 0, SkBlendMode::kSrc, "");
+    drawSquare(0, 128, SkBlendMode::kSrc, "");
+    canvas->translate(-128, -128);
+    canvas->rotate(90, 0, 128);
+    drawSquare(0, 0, SkBlendMode::kSrc, "source");
+    drawSquare(0, -128, SkBlendMode::kModulate, "modulate");
+    drawSquare(-128, 0, SkBlendMode::kMultiply, "multiply");
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_014.cpp b/docs/examples/BlendMode_014.cpp
new file mode 100644
index 0000000..793bf17
--- /dev/null
+++ b/docs/examples/BlendMode_014.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b7b42965927788d853f449f08ddf46de
+REG_FIDDLE(BlendMode_014, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstATop);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kScreen);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_015.cpp b/docs/examples/BlendMode_015.cpp
new file mode 100644
index 0000000..846360e
--- /dev/null
+++ b/docs/examples/BlendMode_015.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=03bf042201de02d6d131938ccd3172eb
+REG_FIDDLE(BlendMode_015, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    paint.setBlendMode(SkBlendMode::kDstATop);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(SkColorSetA(SK_ColorGREEN, 128), SkBlendMode::kOverlay);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_016.cpp b/docs/examples/BlendMode_016.cpp
new file mode 100644
index 0000000..4bf8b23
--- /dev/null
+++ b/docs/examples/BlendMode_016.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=23c974d2759f523ca2f4a78ae86855c3
+REG_FIDDLE(BlendMode_016, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    SkColor colors[] = { SK_ColorWHITE, SK_ColorBLACK };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    paint.setBlendMode(SkBlendMode::kDarken);
+    canvas->drawPaint(paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_017.cpp b/docs/examples/BlendMode_017.cpp
new file mode 100644
index 0000000..5965f87
--- /dev/null
+++ b/docs/examples/BlendMode_017.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=95cb08b8c8db3af3b2c9ad56ae7d6bc1
+REG_FIDDLE(BlendMode_017, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    SkColor colors[] = { SK_ColorBLACK, SK_ColorWHITE };
+    SkPoint horz[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(horz, colors, nullptr, SK_ARRAY_COUNT(colors),
+            SkShader::kClamp_TileMode));
+    paint.setBlendMode(SkBlendMode::kLighten);
+    canvas->drawPaint(paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_018.cpp b/docs/examples/BlendMode_018.cpp
new file mode 100644
index 0000000..ccac6a3
--- /dev/null
+++ b/docs/examples/BlendMode_018.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=280ad6267a7d2d77b6d2c4531c6fc0bf
+REG_FIDDLE(BlendMode_018, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->clipRect({128, 0, 256, 256});
+    canvas->drawColor(SkColorSetARGB(0x80, 0x90, 0x90, 0x90), SkBlendMode::kColorDodge);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_019.cpp b/docs/examples/BlendMode_019.cpp
new file mode 100644
index 0000000..e2d78f2
--- /dev/null
+++ b/docs/examples/BlendMode_019.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3eeef529375d8083ae0d615789d55e89
+REG_FIDDLE(BlendMode_019, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->clipRect({128, 0, 256, 256});
+    canvas->drawColor(SkColorSetARGB(0x80, 0x90, 0x90, 0x90), SkBlendMode::kColorBurn);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_020.cpp b/docs/examples/BlendMode_020.cpp
new file mode 100644
index 0000000..a62b6ba
--- /dev/null
+++ b/docs/examples/BlendMode_020.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ac2fe555e2196e15863ea4ce74db3d54
+REG_FIDDLE(BlendMode_020, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    const SkColor colors[] = { 0xFFFFFFFF, 0x00000000 };
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kHardLight);
+    paint.setShader(SkGradientShader::MakeRadial({ 128, 128}, 100, colors,
+         nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
+    canvas->clipRect({0, 128, 256, 256});
+    canvas->drawPaint(paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_021.cpp b/docs/examples/BlendMode_021.cpp
new file mode 100644
index 0000000..343a23a
--- /dev/null
+++ b/docs/examples/BlendMode_021.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ac93f30dff13f8a8bb31398de370863b
+REG_FIDDLE(BlendMode_021, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    const SkColor colors[] = { 0xFFFFFFFF, 0x3FFFFFFF };
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kSoftLight);
+    paint.setShader(SkGradientShader::MakeRadial({ 128, 128}, 100, colors,
+         nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
+    canvas->drawImage(image, 0, 0);
+    canvas->drawCircle(128, 128, 100, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_022.cpp b/docs/examples/BlendMode_022.cpp
new file mode 100644
index 0000000..90acf16
--- /dev/null
+++ b/docs/examples/BlendMode_022.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=52d2c8d1b9b428de4477b4caa1543a3d
+REG_FIDDLE(BlendMode_022, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->drawImage(image, 128, 0);
+    canvas->drawImage(image, 0, 128);
+    canvas->drawImage(image, 128, 128);
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kDstATop);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(0x80bb9977, SkBlendMode::kDifference);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_023.cpp b/docs/examples/BlendMode_023.cpp
new file mode 100644
index 0000000..3e6a0fd
--- /dev/null
+++ b/docs/examples/BlendMode_023.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a544ee1c67c7c557a9e54d5e99f94bb6
+REG_FIDDLE(BlendMode_023, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->drawImage(image, 128, 0);
+    canvas->drawImage(image, 0, 128);
+    canvas->drawImage(image, 128, 128);
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kDstATop);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(0x80bb9977, SkBlendMode::kExclusion);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_024.cpp b/docs/examples/BlendMode_024.cpp
new file mode 100644
index 0000000..e99c802
--- /dev/null
+++ b/docs/examples/BlendMode_024.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eb29c896f008dfbef09e16b85114fc3a
+REG_FIDDLE(BlendMode_024, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->drawImage(image, 128, 0);
+    canvas->drawImage(image, 0, 128);
+    canvas->drawImage(image, 128, 128);
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kDstATop);
+    SkColor alphas[] = { SK_ColorBLACK, SK_ColorTRANSPARENT };
+    SkPoint vert[] = { { 0, 0 }, { 0, 256 } };
+    paint.setShader(SkGradientShader::MakeLinear(vert, alphas, nullptr, SK_ARRAY_COUNT(alphas),
+            SkShader::kClamp_TileMode));
+    canvas->drawPaint(paint);
+    canvas->clipRect( { 30, 30, 226, 226 } );
+    canvas->drawColor(0x80bb9977, SkBlendMode::kMultiply);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_025.cpp b/docs/examples/BlendMode_025.cpp
new file mode 100644
index 0000000..a5ee489
--- /dev/null
+++ b/docs/examples/BlendMode_025.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=41e45570d682397d3b8ff2f51bd9c574
+REG_FIDDLE(BlendMode_025, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->drawColor(0xFF00FF00, SkBlendMode::kHue);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_026.cpp b/docs/examples/BlendMode_026.cpp
new file mode 100644
index 0000000..c47986a
--- /dev/null
+++ b/docs/examples/BlendMode_026.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a48698975d236573cef512f94a7e360b
+REG_FIDDLE(BlendMode_026, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->drawColor(0xFF00FF00, SkBlendMode::kSaturation);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_027.cpp b/docs/examples/BlendMode_027.cpp
new file mode 100644
index 0000000..0ed6a1a
--- /dev/null
+++ b/docs/examples/BlendMode_027.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5d7c6e23a34ca9bf3ba8cda4cdc94cc4
+REG_FIDDLE(BlendMode_027, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->drawColor(0xFF00FF00, SkBlendMode::kColor);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_028.cpp b/docs/examples/BlendMode_028.cpp
new file mode 100644
index 0000000..280df28
--- /dev/null
+++ b/docs/examples/BlendMode_028.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7d42fe34ae20dd9e12c39dc3950e9989
+REG_FIDDLE(BlendMode_028, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawImage(image, 0, 0);
+    canvas->drawColor(0xFF00FF00, SkBlendMode::kLuminosity);
+}
+}  // END FIDDLE
diff --git a/docs/examples/BlendMode_029.cpp b/docs/examples/BlendMode_029.cpp
new file mode 100644
index 0000000..cc91036
--- /dev/null
+++ b/docs/examples/BlendMode_029.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3996f4994bf4e90b4cd86524c1f9f1a6
+REG_FIDDLE(BlendMode_029, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("default blend: SkBlendMode::k%s\n", SkBlendMode_Name(SkPaint().getBlendMode()));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_000.cpp b/docs/examples/Canvas_000.cpp
new file mode 100644
index 0000000..f11b0fd
--- /dev/null
+++ b/docs/examples/Canvas_000.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=525285073aae7e53eb8f454a398f880c
+REG_FIDDLE(Canvas_000, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);  // device aligned, 32 bpp, Premultiplied
+    const size_t minRowBytes = info.minRowBytes();  // bytes used by one bitmap row
+    const size_t size = info.computeMinByteSize();  // bytes used by all rows
+    SkAutoTMalloc<SkPMColor> storage(size);  // allocate storage for pixels
+    SkPMColor* pixels = storage.get();  // get pointer to allocated storage
+    // create a SkCanvas backed by a raster device, and delete it when the
+    // function goes out of scope.
+    std::unique_ptr<SkCanvas> canvas = SkCanvas::MakeRasterDirect(info, pixels, minRowBytes);
+    canvas->clear(SK_ColorWHITE);  // white is Unpremultiplied, in ARGB order
+    canvas->flush();  // ensure that pixels are cleared
+    SkPMColor pmWhite = pixels[0];  // the Premultiplied format may vary
+    SkPaint paint;  // by default, draws black
+    canvas->drawPoint(1, 1, paint);  // draw in the center
+    canvas->flush();  // ensure that point was drawn
+    for (int y = 0; y < info.height(); ++y) {
+        for (int x = 0; x < info.width(); ++x) {
+            SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
+        }
+        SkDebugf("\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_001.cpp b/docs/examples/Canvas_001.cpp
new file mode 100644
index 0000000..7d66118
--- /dev/null
+++ b/docs/examples/Canvas_001.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=87f55e62ec4c3535e1a5d0f1415b20c6
+REG_FIDDLE(Canvas_001, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    const int width = 3;
+    const int height = 3;
+    SkPMColor pixels[height][width];  // allocate a 3 by 3 Premultiplied bitmap on the stack
+    // create a SkCanvas backed by a raster device, and delete it when the
+    // function goes out of scope.
+    std::unique_ptr<SkCanvas> canvas = SkCanvas::MakeRasterDirectN32(
+            width,
+            height,
+            pixels[0],  // top-left of the bitmap
+            sizeof(pixels[0]));  // byte width of the each row
+    // write a Premultiplied value for white into all pixels in the bitmap
+    canvas->clear(SK_ColorWHITE);
+    SkPMColor pmWhite = pixels[0][0];  // the Premultiplied format may vary
+    SkPaint paint;  // by default, draws black
+    canvas->drawPoint(1, 1, paint);  // draw in the center
+    canvas->flush();  // ensure that pixels is ready to be read
+    for (int y = 0; y < height; ++y) {
+        for (int x = 0; x < width; ++x) {
+            SkDebugf("%c", pixels[y][x] == pmWhite ? '-' : 'x');
+        }
+        SkDebugf("\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_002.cpp b/docs/examples/Canvas_002.cpp
new file mode 100644
index 0000000..253b4f7
--- /dev/null
+++ b/docs/examples/Canvas_002.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4a00e6589e862fde5be532f4b6e316ce
+REG_FIDDLE(Canvas_002, 256, 256, true, 0) {
+static void check_for_rotated_ctm(const SkCanvas* canvas) {
+    const SkMatrix& matrix = canvas->getTotalMatrix();
+    SkDebugf("rect stays rect is %s\n", matrix.rectStaysRect() ? "true" : "false");
+}
+
+void draw(SkCanvas* canvas) {
+    check_for_rotated_ctm(canvas);
+    canvas->rotate(30);
+    check_for_rotated_ctm(canvas);
+    SkCanvas defaultCanvas;
+    check_for_rotated_ctm(&defaultCanvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_003.cpp b/docs/examples/Canvas_003.cpp
new file mode 100644
index 0000000..88b5571
--- /dev/null
+++ b/docs/examples/Canvas_003.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ce6a5ef2df447970b4453489d9d67930
+REG_FIDDLE(Canvas_003, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkCanvas canvas(10, 20);  // 10 units wide, 20 units high
+    canvas.clipRect(SkRect::MakeXYWH(30, 40, 5, 10));  // clip is outside canvas' device
+    SkDebugf("canvas %s empty\n", canvas.getDeviceClipBounds().isEmpty() ? "is" : "is not");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_004.cpp b/docs/examples/Canvas_004.cpp
new file mode 100644
index 0000000..9c8dd97
--- /dev/null
+++ b/docs/examples/Canvas_004.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dd92db963af190e849894038f39b598a
+REG_FIDDLE(Canvas_004, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkBitmap bitmap;
+    // create a bitmap 5 wide and 11 high
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(5, 11));
+    SkCanvas canvas(bitmap);
+    canvas.clear(SK_ColorWHITE);  // white is Unpremultiplied, in ARGB order
+    SkPixmap pixmap;  // provides guaranteed access to the drawn pixels
+    if (!canvas.peekPixels(&pixmap)) {
+        SkDebugf("peekPixels should never fail.\n");
+    }
+    const SkPMColor* pixels = pixmap.addr32();  // points to top-left of bitmap
+    SkPMColor pmWhite = pixels[0];  // the Premultiplied format may vary
+    SkPaint paint;  // by default, draws black, 12 point text
+    SkFont font;
+    canvas.drawString("!", 1, 10, font, paint);  // 1 char at baseline (1, 10)
+    for (int y = 0; y < bitmap.height(); ++y) {
+        for (int x = 0; x < bitmap.width(); ++x) {
+            SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
+        }
+        SkDebugf("\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_005.cpp b/docs/examples/Canvas_005.cpp
new file mode 100644
index 0000000..67b6e1b
--- /dev/null
+++ b/docs/examples/Canvas_005.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c26cfae4c42cb445240335cc12a50235
+REG_FIDDLE(Canvas_005, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkBitmap bitmap;
+    // create a bitmap 5 wide and 11 high
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(5, 11));
+    SkCanvas canvas(bitmap, SkSurfaceProps(0, kUnknown_SkPixelGeometry));
+    canvas.clear(SK_ColorWHITE);  // white is Unpremultiplied, in ARGB order
+    SkPixmap pixmap;  // provides guaranteed access to the drawn pixels
+    if (!canvas.peekPixels(&pixmap)) {
+        SkDebugf("peekPixels should never fail.\n");
+    }
+    const SkPMColor* pixels = pixmap.addr32();  // points to top-left of bitmap
+    SkPMColor pmWhite = pixels[0];  // the Premultiplied format may vary
+    SkPaint paint;  // by default, draws black, 12 point text
+    SkFont font;
+    canvas.drawString("!", 1, 10, font, paint);  // 1 char at baseline (1, 10)
+    for (int y = 0; y < bitmap.height(); ++y) {
+        for (int x = 0; x < bitmap.width(); ++x) {
+            SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
+        }
+        SkDebugf("\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_006.cpp b/docs/examples/Canvas_006.cpp
new file mode 100644
index 0000000..f7b2678
--- /dev/null
+++ b/docs/examples/Canvas_006.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b7bc91ff16c9b9351b2a127f35394b82
+REG_FIDDLE(Canvas_006, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(200, 200));
+    {
+        SkCanvas offscreen(bitmap);
+        SkPaint paint;
+        SkFont font(nullptr, 100);
+        offscreen.drawString("ABC", 20, 160, font, paint);
+        SkRect layerBounds = SkRect::MakeXYWH(32, 32, 192, 192);
+        offscreen.saveLayerAlpha(&layerBounds, 128);
+        offscreen.clear(SK_ColorWHITE);
+        offscreen.drawString("DEF", 20, 160, font, paint);
+    }
+    canvas->drawBitmap(bitmap, 0, 0, nullptr);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_008.cpp b/docs/examples/Canvas_008.cpp
new file mode 100644
index 0000000..35031c1
--- /dev/null
+++ b/docs/examples/Canvas_008.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d93389d971f8084c4ccc7a66e4e157ee
+REG_FIDDLE(Canvas_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas emptyCanvas;
+    SkImageInfo canvasInfo = emptyCanvas.imageInfo();
+    SkImageInfo emptyInfo;
+    SkDebugf("emptyInfo %c= canvasInfo\n", emptyInfo == canvasInfo ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_009.cpp b/docs/examples/Canvas_009.cpp
new file mode 100644
index 0000000..981539c
--- /dev/null
+++ b/docs/examples/Canvas_009.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0fbf2dedc2619bbfbf173c9e3bc1a508
+REG_FIDDLE(Canvas_009, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkBitmap bitmap;
+    bitmap.allocN32Pixels(1, 1);
+    SkCanvas canvas(bitmap, SkSurfaceProps(0, kRGB_V_SkPixelGeometry));
+    SkSurfaceProps surfaceProps(0, kUnknown_SkPixelGeometry);
+    SkDebugf("isRGB:%d\n", SkPixelGeometryIsRGB(surfaceProps.pixelGeometry()));
+    if (!canvas.getProps(&surfaceProps)) {
+        SkDebugf("getProps failed unexpectedly.\n");
+    }
+    SkDebugf("isRGB:%d\n", SkPixelGeometryIsRGB(surfaceProps.pixelGeometry()));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_010.cpp b/docs/examples/Canvas_010.cpp
new file mode 100644
index 0000000..75772dc
--- /dev/null
+++ b/docs/examples/Canvas_010.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=374e245d91cd729eca48fd20e631fdf3
+REG_FIDDLE(Canvas_010, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(20, 30));
+    SkCanvas canvas(bitmap, SkSurfaceProps(0, kUnknown_SkPixelGeometry));
+    canvas.clipRect(SkRect::MakeWH(10, 40));
+    SkIRect clipDeviceBounds = canvas.getDeviceClipBounds();
+    if (clipDeviceBounds.isEmpty()) {
+        SkDebugf("Empty clip bounds is unexpected!\n");
+    }
+    SkDebugf("clip=%d,%d\n", clipDeviceBounds.width(), clipDeviceBounds.height());
+    SkISize baseLayerSize = canvas.getBaseLayerSize();
+    SkDebugf("size=%d,%d\n", baseLayerSize.width(), baseLayerSize.height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_011.cpp b/docs/examples/Canvas_011.cpp
new file mode 100644
index 0000000..25bb09b
--- /dev/null
+++ b/docs/examples/Canvas_011.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1ce28351444b41ab2b8e3128a4b9b9c2
+REG_FIDDLE(Canvas_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(5, 6);
+    SkCanvas* smallCanvas = surface->getCanvas();
+    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(3, 4);
+    sk_sp<SkSurface> compatible = smallCanvas->makeSurface(imageInfo);
+    SkDebugf("compatible %c= nullptr\n", compatible == nullptr ? '=' : '!');
+    SkDebugf("size = %d, %d\n", compatible->width(), compatible->height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_012.cpp b/docs/examples/Canvas_012.cpp
new file mode 100644
index 0000000..ccccaa3
--- /dev/null
+++ b/docs/examples/Canvas_012.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c4ea949e5fa5a0630dcb6b0204bd498f
+REG_FIDDLE(Canvas_012, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    if (canvas->getGrContext()) {
+         canvas->clear(SK_ColorRED);
+    } else {
+         canvas->clear(SK_ColorBLUE);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_013.cpp b/docs/examples/Canvas_013.cpp
new file mode 100644
index 0000000..1c3f8e3
--- /dev/null
+++ b/docs/examples/Canvas_013.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=38d0d6ca9bea146d31bcbec197856359
+REG_FIDDLE(Canvas_013, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    if (canvas->accessTopLayerPixels(nullptr, nullptr)) {
+         canvas->clear(SK_ColorRED);
+    } else {
+         canvas->clear(SK_ColorBLUE);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_014.cpp b/docs/examples/Canvas_014.cpp
new file mode 100644
index 0000000..a0519e0
--- /dev/null
+++ b/docs/examples/Canvas_014.cpp
@@ -0,0 +1,40 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a7ac9c21bbabcdeeca00f72a61cd0f3e
+REG_FIDDLE(Canvas_014, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+  SkPaint paint;
+  SkFont font(nullptr, 100);
+  canvas->drawString("ABC", 20, 160, font, paint);
+  SkRect layerBounds = SkRect::MakeXYWH(32, 32, 192, 192);
+  canvas->saveLayerAlpha(&layerBounds, 128);
+  canvas->clear(SK_ColorWHITE);
+  canvas->drawString("DEF", 20, 160, font, paint);
+  SkImageInfo imageInfo;
+  size_t rowBytes;
+  SkIPoint origin;
+  uint32_t* access = (uint32_t*) canvas->accessTopLayerPixels(&imageInfo, &rowBytes, &origin);
+  if (access) {
+    int h = imageInfo.height();
+    int v = imageInfo.width();
+    int rowWords = rowBytes / sizeof(uint32_t);
+    for (int y = 0; y < h; ++y) {
+        int newY = (y - h / 2) * 2 + h / 2;
+        if (newY < 0 || newY >= h) {
+            continue;
+        }
+        for (int x = 0; x < v; ++x) {
+            int newX = (x - v / 2) * 2 + v / 2;
+            if (newX < 0 || newX >= v) {
+                continue;
+            }
+            if (access[y * rowWords + x] == SK_ColorBLACK) {
+                access[newY * rowWords + newX] = SK_ColorGRAY;
+            }
+        }
+    }
+  }
+  canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_015.cpp b/docs/examples/Canvas_015.cpp
new file mode 100644
index 0000000..e40b257
--- /dev/null
+++ b/docs/examples/Canvas_015.cpp
@@ -0,0 +1,33 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4486d0c0b22ad2931db130f42da4c80c
+REG_FIDDLE(Canvas_015, 256, 256, true, 0) {
+static void DeleteCallback(void*, void* context) {
+    delete (char*) context;
+}
+class CustomAllocator : public SkRasterHandleAllocator {
+public:
+    bool allocHandle(const SkImageInfo& info, Rec* rec) override {
+        char* context = new char[4]{'s', 'k', 'i', 'a'};
+        rec->fReleaseProc = DeleteCallback;
+        rec->fReleaseCtx = context;
+        rec->fHandle = context;
+        rec->fPixels = context;
+        rec->fRowBytes = 4;
+        return true;
+    }
+    void updateHandle(Handle handle, const SkMatrix& ctm, const SkIRect& clip_bounds) override {
+        // apply canvas matrix and clip to custom environment
+    }
+};
+
+void draw(SkCanvas* canvas) {
+    const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);
+    std::unique_ptr<SkCanvas> c2 =
+            SkRasterHandleAllocator::MakeCanvas(std::unique_ptr<CustomAllocator>(
+            new CustomAllocator()), info);
+    char* context = (char*) c2->accessTopRasterHandle();
+    SkDebugf("context = %.4s\n", context);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_016.cpp b/docs/examples/Canvas_016.cpp
new file mode 100644
index 0000000..c3f4b78
--- /dev/null
+++ b/docs/examples/Canvas_016.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e9411d676d1fa13b46331abe9e14ad3e
+REG_FIDDLE(Canvas_016, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPixmap pixmap;
+    if (canvas->peekPixels(&pixmap)) {
+        SkDebugf("width=%d height=%d\n", pixmap.bounds().width(), pixmap.bounds().height());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_017.cpp b/docs/examples/Canvas_017.cpp
new file mode 100644
index 0000000..c5112dd
--- /dev/null
+++ b/docs/examples/Canvas_017.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=102d014d7f753db2a9b9ee08893aaf11
+REG_FIDDLE(Canvas_017, 64, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(SK_ColorBLUE);
+    SkPaint paint;
+    canvas->drawCircle(32, 32, 28, paint);
+    SkImageInfo info = SkImageInfo::Make(64, 64, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+    sk_sp<SkData> data(SkData::MakeUninitialized(info.minRowBytes() * info.height()));
+    sk_bzero(data->writable_data(), info.minRowBytes() * info.height());
+    for (int x : { 32, -32 } ) {
+        for (int y : { 32, -32 } ) {
+            canvas->readPixels(info, data->writable_data(), info.minRowBytes(), x, y);
+        }
+    }
+    sk_sp<SkImage> image = SkImage::MakeRasterData(info, data, info.minRowBytes());
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_018.cpp b/docs/examples/Canvas_018.cpp
new file mode 100644
index 0000000..e122a52
--- /dev/null
+++ b/docs/examples/Canvas_018.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=481e990e923a0ed34654f4361b94f096
+REG_FIDDLE(Canvas_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(0x8055aaff);
+    for (SkAlphaType alphaType : { kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {
+        uint32_t pixel = 0;
+        SkImageInfo info = SkImageInfo::Make(1, 1, kBGRA_8888_SkColorType, alphaType);
+        if (canvas->readPixels(info, &pixel, 4, 0, 0)) {
+            SkDebugf("pixel = %08x\n", pixel);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_019.cpp b/docs/examples/Canvas_019.cpp
new file mode 100644
index 0000000..b86a8ca
--- /dev/null
+++ b/docs/examples/Canvas_019.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=85f199032943b6483722c34a91c4e20f
+REG_FIDDLE(Canvas_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(0x8055aaff);
+    uint32_t pixels[1] = { 0 };
+    SkPixmap pixmap(SkImageInfo::MakeN32Premul(1, 1), pixels, 4);
+    canvas->readPixels(pixmap, 0, 0);
+    SkDebugf("pixel = %08x\n", pixels[0]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_020.cpp b/docs/examples/Canvas_020.cpp
new file mode 100644
index 0000000..8585399
--- /dev/null
+++ b/docs/examples/Canvas_020.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=af6dec8ef974aa67bf102f29915bcd6a
+REG_FIDDLE(Canvas_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(0x8055aaff);
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(1, 1));
+    canvas->readPixels(bitmap, 0, 0);
+    SkDebugf("pixel = %08x\n", bitmap.getAddr32(0, 0)[0]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_021.cpp b/docs/examples/Canvas_021.cpp
new file mode 100644
index 0000000..849411f
--- /dev/null
+++ b/docs/examples/Canvas_021.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=29b98ebf58aa9fd1edfaabf9f4490b3a
+REG_FIDDLE(Canvas_021, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo imageInfo = SkImageInfo::MakeN32(256, 1, kPremul_SkAlphaType);
+    for (int y = 0; y < 256; ++y) {
+        uint32_t pixels[256];
+        for (int x = 0; x < 256; ++x) {
+            pixels[x] = SkColorSetARGB(x, (x + y) % 256, x, (x - y) & 0xFF);
+        }
+        canvas->writePixels(imageInfo, &pixels, sizeof(pixels), 0, y);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_022.cpp b/docs/examples/Canvas_022.cpp
new file mode 100644
index 0000000..453dd93
--- /dev/null
+++ b/docs/examples/Canvas_022.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b128e067881f9251357653692fa28da
+REG_FIDDLE(Canvas_022, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(2, 2);
+    SkBitmap bitmap;
+    bitmap.setInfo(imageInfo);
+    uint32_t pixels[4];
+    bitmap.setPixels(pixels);
+    for (int y = 0; y < 256; y += 2) {
+        for (int x = 0; x < 256;  x += 2) {
+            pixels[0] = SkColorSetRGB(x, y, x | y);
+            pixels[1] = SkColorSetRGB(x ^ y, y, x);
+            pixels[2] = SkColorSetRGB(x, x & y, y);
+            pixels[3] = SkColorSetRGB((~x) & 0xFF, (~y) & 0xFF, x);
+            canvas->writePixels(bitmap, x, y);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_023.cpp b/docs/examples/Canvas_023.cpp
new file mode 100644
index 0000000..559ebe5
--- /dev/null
+++ b/docs/examples/Canvas_023.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bb1dbfdca3aedf716beb6f07e2aab065
+REG_FIDDLE(Canvas_023, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    canvas->save();                             // records stack depth to restore
+    canvas->clipRect(SkRect::MakeWH(100, 100)); // constrains drawing to clip
+    canvas->clear(SK_ColorRED);                 // draws to limit of clip
+    canvas->save();                             // records stack depth to restore
+    canvas->clipRect(SkRect::MakeWH(50, 150));  // Rect below 100 is ignored
+    canvas->clear(SK_ColorBLUE);                // draws to smaller clip
+    canvas->restore();                          // enlarges clip
+    canvas->drawLine(20, 20, 150, 150, paint);  // line below 100 is not drawn
+    canvas->restore();                          // enlarges clip
+    canvas->drawLine(150, 20, 50, 120, paint);  // line below 100 is drawn
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_024.cpp b/docs/examples/Canvas_024.cpp
new file mode 100644
index 0000000..4e51502
--- /dev/null
+++ b/docs/examples/Canvas_024.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9f563a2d60aa31d4b26742e5aa17aa4e
+REG_FIDDLE(Canvas_024, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clipRect(SkRect::MakeWH(100, 100));
+    canvas->clear(SK_ColorRED);
+    canvas->scale(.5, .5);
+    canvas->clipRect(SkRect::MakeWH(100, 100));
+    canvas->clear(SK_ColorBLUE);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_025.cpp b/docs/examples/Canvas_025.cpp
new file mode 100644
index 0000000..d80e94d
--- /dev/null
+++ b/docs/examples/Canvas_025.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e477dce358a9ba3b0aa1bf33b8a376de
+REG_FIDDLE(Canvas_025, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRect rect = { 0, 0, 25, 25 };
+    canvas->drawRect(rect, paint);
+    canvas->save();
+    canvas->translate(50, 50);
+    canvas->drawRect(rect, paint);
+    canvas->restore();
+    paint.setColor(SK_ColorRED);
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_026.cpp b/docs/examples/Canvas_026.cpp
new file mode 100644
index 0000000..696b5ff
--- /dev/null
+++ b/docs/examples/Canvas_026.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e78471212a67f2f4fd39496e17a30d17
+REG_FIDDLE(Canvas_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas simple;
+    SkDebugf("depth = %d\n", simple.getSaveCount());
+    simple.restore();
+    SkDebugf("depth = %d\n", simple.getSaveCount());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_027.cpp b/docs/examples/Canvas_027.cpp
new file mode 100644
index 0000000..19e5401
--- /dev/null
+++ b/docs/examples/Canvas_027.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=005f2b207e078baac596681924fe591e
+REG_FIDDLE(Canvas_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas simple;
+    SkDebugf("depth = %d\n", simple.getSaveCount());
+    simple.save();
+    SkDebugf("depth = %d\n", simple.getSaveCount());
+    simple.restore();
+    SkDebugf("depth = %d\n", simple.getSaveCount());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_028.cpp b/docs/examples/Canvas_028.cpp
new file mode 100644
index 0000000..454f37d
--- /dev/null
+++ b/docs/examples/Canvas_028.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9ed0d56436e114c7097fd49eed1aea47
+REG_FIDDLE(Canvas_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("depth = %d\n", canvas->getSaveCount());
+    canvas->save();
+    canvas->save();
+    SkDebugf("depth = %d\n", canvas->getSaveCount());
+    canvas->restoreToCount(0);
+    SkDebugf("depth = %d\n", canvas->getSaveCount());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_029.cpp b/docs/examples/Canvas_029.cpp
new file mode 100644
index 0000000..782aff6
--- /dev/null
+++ b/docs/examples/Canvas_029.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=42318b18d403e17e07a541652da91ee2
+REG_FIDDLE(Canvas_029, 256, 128, false, 0) {
+#include "SkBlurImageFilter.h"
+
+void draw(SkCanvas* canvas) {
+    SkPaint paint, blur;
+    blur.setImageFilter(SkBlurImageFilter::Make(3, 3, nullptr));
+    canvas->saveLayer(nullptr, &blur);
+    SkRect rect = { 25, 25, 50, 50};
+    canvas->drawRect(rect, paint);
+    canvas->translate(50, 50);
+    paint.setColor(SK_ColorRED);
+    canvas->drawRect(rect, paint);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_030.cpp b/docs/examples/Canvas_030.cpp
new file mode 100644
index 0000000..94c66ab
--- /dev/null
+++ b/docs/examples/Canvas_030.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a17aec3aa4909527be039e26a7eda694
+REG_FIDDLE(Canvas_030, 256, 128, false, 0) {
+#include "SkBlurImageFilter.h"
+
+void draw(SkCanvas* canvas) {
+    SkPaint paint, blur;
+    blur.setImageFilter(SkBlurImageFilter::Make(3, 3, nullptr));
+    canvas->saveLayer(SkRect::MakeWH(90, 90), &blur);
+    SkRect rect = { 25, 25, 50, 50};
+    canvas->drawRect(rect, paint);
+    canvas->translate(50, 50);
+    paint.setColor(SK_ColorRED);
+    canvas->drawRect(rect, paint);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_031.cpp b/docs/examples/Canvas_031.cpp
new file mode 100644
index 0000000..33d6e55
--- /dev/null
+++ b/docs/examples/Canvas_031.cpp
@@ -0,0 +1,28 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8460bf8b013f46c67e0bd96e13451aff
+REG_FIDDLE(Canvas_031, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setLCDRenderText(true);
+    paint.setTextSize(20);
+    for (auto preserve : { false, true } ) {
+        preserve ? canvas->saveLayerPreserveLCDTextRequests(nullptr, nullptr)
+                 : canvas->saveLayer(nullptr, nullptr);
+        SkPaint p;
+        p.setColor(SK_ColorWHITE);
+        // Comment out the next line to draw on a non-opaque background.
+        canvas->drawRect(SkRect::MakeLTRB(25, 40, 200, 70), p);
+        canvas->drawString("Hamburgefons", 30, 60, paint);
+        p.setColor(0xFFCCCCCC);
+        canvas->drawRect(SkRect::MakeLTRB(25, 70, 200, 100), p);
+        canvas->drawString("Hamburgefons", 30, 90, paint);
+        canvas->restore();
+        canvas->translate(0, 80);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_032.cpp b/docs/examples/Canvas_032.cpp
new file mode 100644
index 0000000..34e0913
--- /dev/null
+++ b/docs/examples/Canvas_032.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8ab88d86fb438856cc48d6e2f08a6e24
+REG_FIDDLE(Canvas_032, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorRED);
+    canvas->drawCircle(50, 50, 50, paint);
+    canvas->saveLayerAlpha(nullptr, 128);
+    paint.setColor(SK_ColorBLUE);
+    canvas->drawCircle(100, 50, 50, paint);
+    paint.setColor(SK_ColorGREEN);
+    paint.setAlpha(128);
+    canvas->drawCircle(75, 90, 50, paint);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_033.cpp b/docs/examples/Canvas_033.cpp
new file mode 100644
index 0000000..4bea2d5
--- /dev/null
+++ b/docs/examples/Canvas_033.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=05db6a937225e8e31ae3481173d25dae
+REG_FIDDLE(Canvas_033, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint redPaint, bluePaint, scalePaint;
+    redPaint.setColor(SK_ColorRED);
+    canvas->drawCircle(21, 21, 8, redPaint);
+    bluePaint.setColor(SK_ColorBLUE);
+    canvas->drawCircle(31, 21, 8, bluePaint);
+    SkMatrix matrix;
+    matrix.setScale(4, 4);
+    scalePaint.setAlpha(0x40);
+    scalePaint.setImageFilter(
+            SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr));
+    SkCanvas::SaveLayerRec saveLayerRec(nullptr, &scalePaint,
+            SkCanvas::kInitWithPrevious_SaveLayerFlag);
+    canvas->saveLayer(saveLayerRec);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_034.cpp b/docs/examples/Canvas_034.cpp
new file mode 100644
index 0000000..0b7aeda
--- /dev/null
+++ b/docs/examples/Canvas_034.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ee8c0b120234e27364f8c9a786cf8f89
+REG_FIDDLE(Canvas_034, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint redPaint, bluePaint;
+    redPaint.setAntiAlias(true);
+    redPaint.setColor(SK_ColorRED);
+    canvas->drawCircle(21, 21, 8, redPaint);
+    bluePaint.setColor(SK_ColorBLUE);
+    canvas->drawCircle(31, 21, 8, bluePaint);
+    SkMatrix matrix;
+    matrix.setScale(4, 4);
+    auto scaler = SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr);
+    SkCanvas::SaveLayerRec saveLayerRec(nullptr, nullptr, scaler.get(), 0);
+    canvas->saveLayer(saveLayerRec);
+    canvas->drawCircle(125, 85, 8, redPaint);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_035.cpp b/docs/examples/Canvas_035.cpp
new file mode 100644
index 0000000..1416ec7
--- /dev/null
+++ b/docs/examples/Canvas_035.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b5cea1eed80a0eb04ddbab3f36dff73f
+REG_FIDDLE(Canvas_035, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas::SaveLayerRec rec1;
+    rec1.fSaveLayerFlags = SkCanvas::kPreserveLCDText_SaveLayerFlag;
+    SkCanvas::SaveLayerRec rec2(nullptr, nullptr, SkCanvas::kPreserveLCDText_SaveLayerFlag);
+    SkDebugf("rec1 %c= rec2\n", rec1.fBounds == rec2.fBounds
+            && rec1.fPaint == rec2.fPaint
+            && rec1.fBackdrop == rec2.fBackdrop
+            && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_036.cpp b/docs/examples/Canvas_036.cpp
new file mode 100644
index 0000000..173303d
--- /dev/null
+++ b/docs/examples/Canvas_036.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=027f920259888fc19591ea9a90d92873
+REG_FIDDLE(Canvas_036, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas::SaveLayerRec rec1;
+    SkCanvas::SaveLayerRec rec2(nullptr, nullptr);
+    SkDebugf("rec1 %c= rec2\n", rec1.fBounds == rec2.fBounds
+            && rec1.fPaint == rec2.fPaint
+            && rec1.fBackdrop == rec2.fBackdrop
+            && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_037.cpp b/docs/examples/Canvas_037.cpp
new file mode 100644
index 0000000..cc511b4
--- /dev/null
+++ b/docs/examples/Canvas_037.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9b7fa2fe855642ffff6538829db15328
+REG_FIDDLE(Canvas_037, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas::SaveLayerRec rec1;
+    SkCanvas::SaveLayerRec rec2(nullptr, nullptr, nullptr, 0);
+    SkDebugf("rec1 %c= rec2\n", rec1.fBounds == rec2.fBounds
+            && rec1.fPaint == rec2.fPaint
+            && rec1.fBackdrop == rec2.fBackdrop
+            && rec1.fSaveLayerFlags == rec2.fSaveLayerFlags ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_038.cpp b/docs/examples/Canvas_038.cpp
new file mode 100644
index 0000000..e3b26ba
--- /dev/null
+++ b/docs/examples/Canvas_038.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7d3751e82d1b6ec328ffa3d6f48ca831
+REG_FIDDLE(Canvas_038, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    // sk_sp<SkImage> image = GetResourceAsImage("images/mandrill_256.png");
+    canvas->drawImage(image, 0, 0, nullptr);
+    SkCanvas::SaveLayerRec rec;
+    SkPaint paint;
+    paint.setBlendMode(SkBlendMode::kPlus);
+    rec.fSaveLayerFlags = SkCanvas::kInitWithPrevious_SaveLayerFlag;
+    rec.fPaint = &paint;
+    canvas->saveLayer(rec);
+    paint.setBlendMode(SkBlendMode::kClear);
+    canvas->drawCircle(128, 128, 96, paint);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_039.cpp b/docs/examples/Canvas_039.cpp
new file mode 100644
index 0000000..58549a3
--- /dev/null
+++ b/docs/examples/Canvas_039.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eb93d5fa66a5f7a10f4f9210494d7222
+REG_FIDDLE(Canvas_039, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint filledPaint;
+    SkPaint outlinePaint;
+    outlinePaint.setStyle(SkPaint::kStroke_Style);
+    outlinePaint.setColor(SK_ColorBLUE);
+    canvas->save();
+    canvas->translate(50, 50);
+    canvas->drawCircle(28, 28, 15, outlinePaint);  // blue center: (50+28, 50+28)
+    canvas->scale(2, 1/2.f);
+    canvas->drawCircle(28, 28, 15, filledPaint);   // black center: (50+(28*2), 50+(28/2))
+    canvas->restore();
+    filledPaint.setColor(SK_ColorGRAY);
+    outlinePaint.setColor(SK_ColorRED);
+    canvas->scale(2, 1/2.f);
+    canvas->drawCircle(28, 28, 15, outlinePaint);  // red center: (28*2, 28/2)
+    canvas->translate(50, 50);
+    canvas->drawCircle(28, 28, 15, filledPaint);   // gray center: ((50+28)*2, (50+28)/2)
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_040.cpp b/docs/examples/Canvas_040.cpp
new file mode 100644
index 0000000..128dfa2
--- /dev/null
+++ b/docs/examples/Canvas_040.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7d0d801ef13c6c6da51e840c22ac15b0
+REG_FIDDLE(Canvas_040, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRect rect = { 10, 20, 60, 120 };
+    canvas->translate(20, 20);
+    canvas->drawRect(rect, paint);
+    canvas->scale(2, .5f);
+    paint.setColor(SK_ColorGRAY);
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_041.cpp b/docs/examples/Canvas_041.cpp
new file mode 100644
index 0000000..3d44c7f
--- /dev/null
+++ b/docs/examples/Canvas_041.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=963789ac8498d4e505748ab3b15cdaa5
+REG_FIDDLE(Canvas_041, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->translate(128, 128);
+    canvas->drawCircle(0, 0, 60, paint);
+    canvas->save();
+    canvas->rotate(10 * 360 / 60);   // 10 minutes of 60 scaled to 360 degrees
+    canvas->drawLine(0, 0, 0, -50, paint);
+    canvas->restore();
+    canvas->rotate((5 + 10.f/60) * 360 / 12); // 5 and 10/60 hours of 12 scaled to 360 degrees
+    canvas->drawLine(0, 0, 0, -30, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_042.cpp b/docs/examples/Canvas_042.cpp
new file mode 100644
index 0000000..b052bfc
--- /dev/null
+++ b/docs/examples/Canvas_042.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bcf5baea1c66a957d5ffd7b54bbbfeff
+REG_FIDDLE(Canvas_042, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkFont font(nullptr, 96);
+    canvas->drawString("A1", 130, 100, font, paint);
+    canvas->rotate(180, 130, 100);
+    canvas->drawString("A1", 130, 100, font, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_043.cpp b/docs/examples/Canvas_043.cpp
new file mode 100644
index 0000000..5e2e99d
--- /dev/null
+++ b/docs/examples/Canvas_043.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2e2acc21d7774df7e0940a30ad2ca99e
+REG_FIDDLE(Canvas_043, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkFont font(nullptr, 128);
+    canvas->translate(30, 130);
+    canvas->save();
+    canvas->skew(-.5, 0);
+    canvas->drawString("A1", 0, 0, font, paint);
+    canvas->restore();
+    canvas->save();
+    canvas->skew(0, .5);
+    paint.setColor(SK_ColorRED);
+    canvas->drawString("A1", 0, 0, font, paint);
+    canvas->restore();
+    canvas->skew(-.5, .5);
+    paint.setColor(SK_ColorBLUE);
+    canvas->drawString("A1", 0, 0, font, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_044.cpp b/docs/examples/Canvas_044.cpp
new file mode 100644
index 0000000..f5a2f56
--- /dev/null
+++ b/docs/examples/Canvas_044.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8f6818b25a92a88638ad99b2dd293f61
+REG_FIDDLE(Canvas_044, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkFont font(nullptr, 80);
+    font.setScaleX(.3f);
+    SkMatrix matrix;
+    SkRect rect[2] = {{ 10, 20, 90, 110 }, { 40, 130, 140, 180 }};
+    matrix.setRectToRect(rect[0], rect[1], SkMatrix::kFill_ScaleToFit);
+    canvas->drawRect(rect[0], paint);
+    canvas->drawRect(rect[1], paint);
+    paint.setColor(SK_ColorWHITE);
+    canvas->drawString("Here", rect[0].fLeft + 10, rect[0].fBottom - 10, font, paint);
+    canvas->concat(matrix);
+    canvas->drawString("There", rect[0].fLeft + 10, rect[0].fBottom - 10, font, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_045.cpp b/docs/examples/Canvas_045.cpp
new file mode 100644
index 0000000..4b3abea
--- /dev/null
+++ b/docs/examples/Canvas_045.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=24b9cf7e6f9a08394e1e07413bd8733a
+REG_FIDDLE(Canvas_045, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkFont font;
+    canvas->scale(4, 6);
+    canvas->drawString("truth", 2, 10, font, paint);
+    SkMatrix matrix;
+    matrix.setScale(2.8f, 6);
+    canvas->setMatrix(matrix);
+    canvas->drawString("consequences", 2, 20, font, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_046.cpp b/docs/examples/Canvas_046.cpp
new file mode 100644
index 0000000..30c9916
--- /dev/null
+++ b/docs/examples/Canvas_046.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=412afffdf4682baa503a4e2e99201967
+REG_FIDDLE(Canvas_046, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkFont font;
+    canvas->scale(4, 6);
+    canvas->drawString("truth", 2, 10, font, paint);
+    canvas->resetMatrix();
+    canvas->scale(2.8f, 6);
+    canvas->drawString("consequences", 2, 20, font, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_047.cpp b/docs/examples/Canvas_047.cpp
new file mode 100644
index 0000000..67f1c51
--- /dev/null
+++ b/docs/examples/Canvas_047.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c0d5fa544759704768f47cac91ae3832
+REG_FIDDLE(Canvas_047, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("isIdentity %s\n", canvas->getTotalMatrix().isIdentity() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_048.cpp b/docs/examples/Canvas_048.cpp
new file mode 100644
index 0000000..aa16384
--- /dev/null
+++ b/docs/examples/Canvas_048.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=862cc026601a41a58df49c0b9f0d7777
+REG_FIDDLE(Canvas_048, 256, 90, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint redPaint, scalePaint;
+    redPaint.setAntiAlias(true);
+    redPaint.setColor(SK_ColorRED);
+    canvas->save();
+    for (bool antialias : { false, true } ) {
+        canvas->save();
+        canvas->clipRect(SkRect::MakeWH(19.5f, 11.5f), antialias);
+        canvas->drawCircle(17, 11, 8, redPaint);
+        canvas->restore();
+        canvas->translate(16, 0);
+    }
+    canvas->restore();
+    SkMatrix matrix;
+    matrix.setScale(6, 6);
+    scalePaint.setImageFilter(
+            SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr));
+    SkCanvas::SaveLayerRec saveLayerRec(
+            nullptr, &scalePaint, SkCanvas::kInitWithPrevious_SaveLayerFlag);
+    canvas->saveLayer(saveLayerRec);
+    canvas->restore();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_049.cpp b/docs/examples/Canvas_049.cpp
new file mode 100644
index 0000000..8c7cf65
--- /dev/null
+++ b/docs/examples/Canvas_049.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6a614faa0fbcf19958b5559c19b02d0f
+REG_FIDDLE(Canvas_049, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->rotate(10);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    for (auto alias: { false, true } ) {
+        canvas->save();
+        canvas->clipRect(SkRect::MakeWH(90, 80), SkClipOp::kIntersect, alias);
+        canvas->drawCircle(100, 60, 60, paint);
+        canvas->restore();
+        canvas->translate(80, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_050.cpp b/docs/examples/Canvas_050.cpp
new file mode 100644
index 0000000..ce57d54
--- /dev/null
+++ b/docs/examples/Canvas_050.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=13bbc5fa5597a6cd4d704b419dbc66d9
+REG_FIDDLE(Canvas_050, 280, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    for (SkClipOp op: { SkClipOp::kIntersect, SkClipOp::kDifference } ) {
+        canvas->save();
+        canvas->clipRect(SkRect::MakeWH(90, 120), op, false);
+        canvas->drawCircle(100, 100, 60, paint);
+        canvas->restore();
+        canvas->translate(80, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_051.cpp b/docs/examples/Canvas_051.cpp
new file mode 100644
index 0000000..5976312
--- /dev/null
+++ b/docs/examples/Canvas_051.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1d4e0632c97e42692775d834fe10aa99
+REG_FIDDLE(Canvas_051, 256, 133, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(SK_ColorWHITE);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(0x8055aaff);
+    SkRect clipRect = { 0, 0, 87.4f, 87.4f };
+    for (auto alias: { false, true } ) {
+        canvas->save();
+        canvas->clipRect(clipRect, SkClipOp::kIntersect, alias);
+        canvas->drawCircle(67, 67, 60, paint);
+        canvas->restore();
+        canvas->save();
+        canvas->clipRect(clipRect, SkClipOp::kDifference, alias);
+        canvas->drawCircle(67, 67, 60, paint);
+        canvas->restore();
+        canvas->translate(120, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_052.cpp b/docs/examples/Canvas_052.cpp
new file mode 100644
index 0000000..f35a4e6
--- /dev/null
+++ b/docs/examples/Canvas_052.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=182ef48ab5e04ba3578496fda8d9fa36
+REG_FIDDLE(Canvas_052, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(SK_ColorWHITE);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(0x8055aaff);
+    SkRRect oval;
+    oval.setOval({10, 20, 90, 100});
+    canvas->clipRRect(oval, SkClipOp::kIntersect, true);
+    canvas->drawCircle(70, 100, 60, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_053.cpp b/docs/examples/Canvas_053.cpp
new file mode 100644
index 0000000..450172b
--- /dev/null
+++ b/docs/examples/Canvas_053.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ef6ae2eaae6761130ce38065d0364abd
+REG_FIDDLE(Canvas_053, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(0x8055aaff);
+    auto oval = SkRRect::MakeOval({10, 20, 90, 100});
+    canvas->clipRRect(oval, SkClipOp::kIntersect);
+    canvas->drawCircle(70, 100, 60, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_054.cpp b/docs/examples/Canvas_054.cpp
new file mode 100644
index 0000000..e7e1d50
--- /dev/null
+++ b/docs/examples/Canvas_054.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f583114580b2176fe3e75b0994476a84
+REG_FIDDLE(Canvas_054, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    auto oval = SkRRect::MakeRectXY({10, 20, 90, 100}, 9, 13);
+    canvas->clipRRect(oval, true);
+    canvas->drawCircle(70, 100, 60, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_055.cpp b/docs/examples/Canvas_055.cpp
new file mode 100644
index 0000000..ac1a3f4
--- /dev/null
+++ b/docs/examples/Canvas_055.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ee47ae6b813bfaa55e1a7b7c053ed60d
+REG_FIDDLE(Canvas_055, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPath path;
+    path.addRect({20, 30, 100, 110});
+    path.setFillType(SkPath::kInverseWinding_FillType);
+    canvas->save();
+    canvas->clipPath(path, SkClipOp::kDifference, false);
+    canvas->drawCircle(70, 100, 60, paint);
+    canvas->restore();
+    canvas->translate(100, 100);
+    path.setFillType(SkPath::kWinding_FillType);
+    canvas->clipPath(path, SkClipOp::kIntersect, false);
+    canvas->drawCircle(70, 100, 60, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_056.cpp b/docs/examples/Canvas_056.cpp
new file mode 100644
index 0000000..432de66
--- /dev/null
+++ b/docs/examples/Canvas_056.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7856755c1bf8431c286c734b353345ad
+REG_FIDDLE(Canvas_056, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPath path;
+    path.addRect({20, 15, 100, 95});
+    path.addRect({50, 65, 130, 135});
+    path.setFillType(SkPath::kWinding_FillType);
+    canvas->save();
+    canvas->clipPath(path, SkClipOp::kIntersect);
+    canvas->drawCircle(70, 85, 60, paint);
+    canvas->restore();
+    canvas->translate(100, 100);
+    path.setFillType(SkPath::kEvenOdd_FillType);
+    canvas->clipPath(path, SkClipOp::kIntersect);
+    canvas->drawCircle(70, 85, 60, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_057.cpp b/docs/examples/Canvas_057.cpp
new file mode 100644
index 0000000..ade1fda
--- /dev/null
+++ b/docs/examples/Canvas_057.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=187a7ae77a8176e417181411988534b6
+REG_FIDDLE(Canvas_057, 256, 212, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPath path;
+    SkPoint poly[] = {{20, 20}, { 80, 20}, { 80,  80}, {40,  80},
+                      {40, 40}, {100, 40}, {100, 100}, {20, 100}};
+    path.addPoly(poly, SK_ARRAY_COUNT(poly), true);
+    path.setFillType(SkPath::kWinding_FillType);
+    canvas->save();
+    canvas->clipPath(path, SkClipOp::kIntersect);
+    canvas->drawCircle(50, 50, 45, paint);
+    canvas->restore();
+    canvas->translate(100, 100);
+    path.setFillType(SkPath::kEvenOdd_FillType);
+    canvas->clipPath(path, SkClipOp::kIntersect);
+    canvas->drawCircle(50, 50, 45, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_058.cpp b/docs/examples/Canvas_058.cpp
new file mode 100644
index 0000000..15d7f92
--- /dev/null
+++ b/docs/examples/Canvas_058.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7bb57c0e456c5fda2c2cca4abb68b19e
+REG_FIDDLE(Canvas_058, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkIRect iRect = {30, 40, 120, 130 };
+    SkRegion region(iRect);
+    canvas->rotate(10);
+    canvas->save();
+    canvas->clipRegion(region, SkClipOp::kIntersect);
+    canvas->drawCircle(50, 50, 45, paint);
+    canvas->restore();
+    canvas->translate(100, 100);
+    canvas->clipRect(SkRect::Make(iRect), SkClipOp::kIntersect);
+    canvas->drawCircle(50, 50, 45, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_059.cpp b/docs/examples/Canvas_059.cpp
new file mode 100644
index 0000000..1a8c606
--- /dev/null
+++ b/docs/examples/Canvas_059.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cfe4016241074477809dd45435be9cf4
+REG_FIDDLE(Canvas_059, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect testRect = {30, 30, 120, 129 };
+    SkRect clipRect = {30, 130, 120, 230 };
+    canvas->save();
+    canvas->clipRect(clipRect);
+    SkDebugf("quickReject %s\n", canvas->quickReject(testRect) ? "true" : "false");
+    canvas->restore();
+    canvas->rotate(10);
+    canvas->clipRect(clipRect);
+    SkDebugf("quickReject %s\n", canvas->quickReject(testRect) ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_060.cpp b/docs/examples/Canvas_060.cpp
new file mode 100644
index 0000000..6d682ef
--- /dev/null
+++ b/docs/examples/Canvas_060.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=56dcd14f943aea6f7d7aafe0de7e6c25
+REG_FIDDLE(Canvas_060, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint testPoints[] = {{30,  30}, {120,  30}, {120, 129} };
+    SkPoint clipPoints[] = {{30, 130}, {120, 130}, {120, 230} };
+    SkPath testPath, clipPath;
+    testPath.addPoly(testPoints, SK_ARRAY_COUNT(testPoints), true);
+    clipPath.addPoly(clipPoints, SK_ARRAY_COUNT(clipPoints), true);
+    canvas->save();
+    canvas->clipPath(clipPath);
+    SkDebugf("quickReject %s\n", canvas->quickReject(testPath) ? "true" : "false");
+    canvas->restore();
+    canvas->rotate(10);
+    canvas->clipPath(clipPath);
+    SkDebugf("quickReject %s\n", canvas->quickReject(testPath) ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_061.cpp b/docs/examples/Canvas_061.cpp
new file mode 100644
index 0000000..f78d530
--- /dev/null
+++ b/docs/examples/Canvas_061.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7f60cb030d3f9b2473adbe3e34b19d91
+REG_FIDDLE(Canvas_061, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas local(256, 256);
+    canvas = &local;
+    SkRect bounds = canvas->getLocalClipBounds();
+    SkDebugf("left:%g  top:%g  right:%g  bottom:%g\n",
+            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    SkPoint clipPoints[]  = {{30, 130}, {120, 130}, {120, 230} };
+    SkPath clipPath;
+    clipPath.addPoly(clipPoints, SK_ARRAY_COUNT(clipPoints), true);
+    canvas->clipPath(clipPath);
+    bounds = canvas->getLocalClipBounds();
+    SkDebugf("left:%g  top:%g  right:%g  bottom:%g\n",
+            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    canvas->scale(2, 2);
+    bounds = canvas->getLocalClipBounds();
+    SkDebugf("left:%g  top:%g  right:%g  bottom:%g\n",
+            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_062.cpp b/docs/examples/Canvas_062.cpp
new file mode 100644
index 0000000..76a94c0
--- /dev/null
+++ b/docs/examples/Canvas_062.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=85496614e90c66b020f8a70db8d06f4a
+REG_FIDDLE(Canvas_062, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas local(256, 256);
+    canvas = &local;
+    SkRect bounds;
+    SkDebugf("local bounds empty = %s\n", canvas->getLocalClipBounds(&bounds)
+             ? "false" : "true");
+    SkPath path;
+    canvas->clipPath(path);
+    SkDebugf("local bounds empty = %s\n", canvas->getLocalClipBounds(&bounds)
+             ? "false" : "true");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_063.cpp b/docs/examples/Canvas_063.cpp
new file mode 100644
index 0000000..8968963
--- /dev/null
+++ b/docs/examples/Canvas_063.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=556832ac5711af662a98c21c547185e9
+REG_FIDDLE(Canvas_063, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkCanvas device(256, 256);
+    canvas = &device;
+    SkIRect bounds = canvas->getDeviceClipBounds();
+    SkDebugf("left:%d  top:%d  right:%d  bottom:%d\n",
+            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    SkPoint clipPoints[]  = {{30, 130}, {120, 130}, {120, 230} };
+    SkPath clipPath;
+    clipPath.addPoly(clipPoints, SK_ARRAY_COUNT(clipPoints), true);
+    canvas->save();
+    canvas->clipPath(clipPath);
+    bounds = canvas->getDeviceClipBounds();
+    SkDebugf("left:%d  top:%d  right:%d  bottom:%d\n",
+            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    canvas->restore();
+    canvas->scale(1.f/2, 1.f/2);
+    canvas->clipPath(clipPath);
+    bounds = canvas->getDeviceClipBounds();
+    SkDebugf("left:%d  top:%d  right:%d  bottom:%d\n",
+            bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_064.cpp b/docs/examples/Canvas_064.cpp
new file mode 100644
index 0000000..4a0e625
--- /dev/null
+++ b/docs/examples/Canvas_064.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6abb99f849a1f0e33e1dedc00d1c4f7a
+REG_FIDDLE(Canvas_064, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect bounds;
+    SkDebugf("device bounds empty = %s\n", canvas->getDeviceClipBounds(&bounds)
+             ? "false" : "true");
+    SkPath path;
+    canvas->clipPath(path);
+    SkDebugf("device bounds empty = %s\n", canvas->getDeviceClipBounds(&bounds)
+             ? "false" : "true");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_065.cpp b/docs/examples/Canvas_065.cpp
new file mode 100644
index 0000000..81cdb27
--- /dev/null
+++ b/docs/examples/Canvas_065.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9cf94fead1e6b17d836c704b4eac269a
+REG_FIDDLE(Canvas_065, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->drawColor(SK_ColorRED);
+    canvas->clipRect(SkRect::MakeWH(150, 150));
+    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0xFF, 0x00), SkBlendMode::kPlus);
+    canvas->clipRect(SkRect::MakeWH(75, 75));
+    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0x00, 0xFF), SkBlendMode::kPlus);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_066.cpp b/docs/examples/Canvas_066.cpp
new file mode 100644
index 0000000..fe465c5
--- /dev/null
+++ b/docs/examples/Canvas_066.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8c4499e322f10153dcd9b0b9806233b9
+REG_FIDDLE(Canvas_066, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->save();
+    canvas->clipRect(SkRect::MakeWH(256, 128));
+    canvas->clear(SkColorSetARGB(0x80, 0xFF, 0x00, 0x00));
+    canvas->restore();
+    canvas->save();
+    canvas->clipRect(SkRect::MakeWH(150, 192));
+    canvas->clear(SkColorSetARGB(0x80, 0x00, 0xFF, 0x00));
+    canvas->restore();
+    canvas->clipRect(SkRect::MakeWH(75, 256));
+    canvas->clear(SkColorSetARGB(0x80, 0x00, 0x00, 0xFF));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_067.cpp b/docs/examples/Canvas_067.cpp
new file mode 100644
index 0000000..fd58d3b
--- /dev/null
+++ b/docs/examples/Canvas_067.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1cd076b9b1a7c976cdca72b93c4f42dd
+REG_FIDDLE(Canvas_067, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
+    SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
+    SkPaint     paint;
+    paint.setShader(SkGradientShader::MakeSweep(256, 256, colors, pos, SK_ARRAY_COUNT(colors)));
+    canvas->drawPaint(paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_068.cpp b/docs/examples/Canvas_068.cpp
new file mode 100644
index 0000000..94af004
--- /dev/null
+++ b/docs/examples/Canvas_068.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=292b4b2008961b6f612434d3121fc4ce
+REG_FIDDLE(Canvas_068, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+  SkPaint paint;
+  paint.setStyle(SkPaint::kStroke_Style);
+  paint.setStrokeWidth(10);
+  SkPoint points[] = {{64, 32}, {96, 96}, {32, 96}};
+  canvas->drawPoints(SkCanvas::kPoints_PointMode, 3, points, paint);
+  canvas->translate(128, 0);
+  canvas->drawPoints(SkCanvas::kLines_PointMode, 3, points, paint);
+  canvas->translate(0, 128);
+  canvas->drawPoints(SkCanvas::kPolygon_PointMode, 3, points, paint);
+  SkPath path;
+  path.addPoly(points, 3, false);
+  canvas->translate(-128, 0);
+  canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_069.cpp b/docs/examples/Canvas_069.cpp
new file mode 100644
index 0000000..ff1a3ec
--- /dev/null
+++ b/docs/examples/Canvas_069.cpp
@@ -0,0 +1,32 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=635d54b4716e226e93dfbc21ad40e77d
+REG_FIDDLE(Canvas_069, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(10);
+    paint.setColor(0x80349a45);
+    const SkPoint points[] = {{32, 16}, {48, 48}, {16, 32}};
+    const SkPaint::Join join[] = { SkPaint::kRound_Join,
+                                   SkPaint::kMiter_Join,
+                                   SkPaint::kBevel_Join };
+    int joinIndex = 0;
+    SkPath path;
+    path.addPoly(points, 3, false);
+    for (const auto cap : { SkPaint::kRound_Cap, SkPaint::kSquare_Cap, SkPaint::kButt_Cap } ) {
+        paint.setStrokeCap(cap);
+        paint.setStrokeJoin(join[joinIndex++]);
+        for (const auto mode : { SkCanvas::kPoints_PointMode,
+                                 SkCanvas::kLines_PointMode,
+                                 SkCanvas::kPolygon_PointMode } ) {
+            canvas->drawPoints(mode, 3, points, paint);
+            canvas->translate(64, 0);
+        }
+        canvas->drawPath(path, paint);
+        canvas->translate(-192, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_070.cpp b/docs/examples/Canvas_070.cpp
new file mode 100644
index 0000000..cbf6d9a
--- /dev/null
+++ b/docs/examples/Canvas_070.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3476b553e7b547b604a3f6969f02d933
+REG_FIDDLE(Canvas_070, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+  SkPaint paint;
+  paint.setAntiAlias(true);
+  paint.setColor(0x80349a45);
+  paint.setStyle(SkPaint::kStroke_Style);
+  paint.setStrokeWidth(100);
+  paint.setStrokeCap(SkPaint::kRound_Cap);
+  canvas->scale(1, 1.2f);
+  canvas->drawPoint(64, 96, paint);
+  canvas->scale(.6f, .8f);
+  paint.setColor(SK_ColorWHITE);
+  canvas->drawPoint(106, 120, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_071.cpp b/docs/examples/Canvas_071.cpp
new file mode 100644
index 0000000..c19018c
--- /dev/null
+++ b/docs/examples/Canvas_071.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1a0a839061c69d870acca2bcfbdf1a41
+REG_FIDDLE(Canvas_071, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+  SkPaint paint;
+  paint.setAntiAlias(true);
+  paint.setColor(0x80349a45);
+  paint.setStyle(SkPaint::kStroke_Style);
+  paint.setStrokeWidth(100);
+  paint.setStrokeCap(SkPaint::kSquare_Cap);
+  canvas->scale(1, 1.2f);
+  canvas->drawPoint({64, 96}, paint);
+  canvas->scale(.6f, .8f);
+  paint.setColor(SK_ColorWHITE);
+  canvas->drawPoint(106, 120, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_072.cpp b/docs/examples/Canvas_072.cpp
new file mode 100644
index 0000000..fcf1b0e
--- /dev/null
+++ b/docs/examples/Canvas_072.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d10ee4a265f278d02afe11ad889b293b
+REG_FIDDLE(Canvas_072, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(0xFF9a67be);
+    paint.setStrokeWidth(20);
+    canvas->skew(1, 0);
+    canvas->drawLine(32, 96, 32, 160, paint);
+    canvas->skew(-2, 0);
+    canvas->drawLine(288, 96, 288, 160, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_073.cpp b/docs/examples/Canvas_073.cpp
new file mode 100644
index 0000000..8a0af8f
--- /dev/null
+++ b/docs/examples/Canvas_073.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f8525816cb596dde1a3855446792c8e0
+REG_FIDDLE(Canvas_073, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(0xFF9a67be);
+    paint.setStrokeWidth(20);
+    canvas->skew(1, 0);
+    canvas->drawLine({32, 96}, {32, 160}, paint);
+    canvas->skew(-2, 0);
+    canvas->drawLine({288, 96}, {288, 160}, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_074.cpp b/docs/examples/Canvas_074.cpp
new file mode 100644
index 0000000..1b488bc
--- /dev/null
+++ b/docs/examples/Canvas_074.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=871b0da9b4a23de11ae7a772ce14aed3
+REG_FIDDLE(Canvas_074, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint rectPts[] = { {64, 48}, {192, 160} };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    paint.setStrokeJoin(SkPaint::kRound_Join);
+    SkMatrix rotator;
+    rotator.setRotate(30, 128, 128);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorMAGENTA } ) {
+        paint.setColor(color);
+        SkRect rect;
+        rect.set(rectPts[0], rectPts[1]);
+        canvas->drawRect(rect, paint);
+        rotator.mapPoints(rectPts, 2);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_075.cpp b/docs/examples/Canvas_075.cpp
new file mode 100644
index 0000000..bc4a4d0
--- /dev/null
+++ b/docs/examples/Canvas_075.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d3d8ca584134560750b1efa4a4c6e138
+REG_FIDDLE(Canvas_075, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 64, 48, 192, 160 };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    paint.setStrokeJoin(SkPaint::kRound_Join);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorMAGENTA } ) {
+        paint.setColor(color);
+        canvas->drawIRect(rect, paint);
+        canvas->rotate(30, 128, 128);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_076.cpp b/docs/examples/Canvas_076.cpp
new file mode 100644
index 0000000..37e8cb6
--- /dev/null
+++ b/docs/examples/Canvas_076.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=80309e0deca0f8add616cec7bec634ca
+REG_FIDDLE(Canvas_076, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    region.op( 10, 10, 50, 50, SkRegion::kUnion_Op);
+    region.op( 10, 50, 90, 90, SkRegion::kUnion_Op);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    paint.setStrokeJoin(SkPaint::kRound_Join);
+    canvas->drawRegion(region, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_077.cpp b/docs/examples/Canvas_077.cpp
new file mode 100644
index 0000000..f2bf141
--- /dev/null
+++ b/docs/examples/Canvas_077.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b6b86f8a022811cd29a9c6ab771df12
+REG_FIDDLE(Canvas_077, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(0xFF3f5f9f);
+    SkColor  kColor1 = SkColorSetARGB(0xff, 0xff, 0x7f, 0);
+    SkColor  g1Colors[] = { kColor1, SkColorSetA(kColor1, 0x20) };
+    SkPoint  g1Points[] = { { 0, 0 }, { 0, 100 } };
+    SkScalar pos[] = { 0.2f, 1.0f };
+    SkRect bounds = SkRect::MakeWH(80, 70);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setShader(SkGradientShader::MakeLinear(g1Points, g1Colors, pos, SK_ARRAY_COUNT(g1Colors),
+            SkShader::kClamp_TileMode));
+    canvas->drawOval(bounds , paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_078.cpp b/docs/examples/Canvas_078.cpp
new file mode 100644
index 0000000..8b89197
--- /dev/null
+++ b/docs/examples/Canvas_078.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=90fed1bb11efb43aada94113338c63d8
+REG_FIDDLE(Canvas_078, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRect outer = {30, 40, 210, 220};
+    SkRect radii = {30, 50, 70, 90 };
+    SkRRect rRect;
+    rRect.setNinePatch(outer, radii.fLeft, radii.fTop, radii.fRight, radii.fBottom);
+    canvas->drawRRect(rRect, paint);
+    paint.setColor(SK_ColorWHITE);
+    canvas->drawLine(outer.fLeft + radii.fLeft, outer.fTop,
+                     outer.fLeft + radii.fLeft, outer.fBottom, paint);
+    canvas->drawLine(outer.fRight - radii.fRight, outer.fTop,
+                     outer.fRight - radii.fRight, outer.fBottom, paint);
+    canvas->drawLine(outer.fLeft,  outer.fTop + radii.fTop,
+                     outer.fRight, outer.fTop + radii.fTop, paint);
+    canvas->drawLine(outer.fLeft,  outer.fBottom - radii.fBottom,
+                     outer.fRight, outer.fBottom - radii.fBottom, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_079.cpp b/docs/examples/Canvas_079.cpp
new file mode 100644
index 0000000..54e5ac2
--- /dev/null
+++ b/docs/examples/Canvas_079.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=02e33141f13da2f19aef7feb7117b541
+REG_FIDDLE(Canvas_079, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkRRect outer = SkRRect::MakeRect({20, 40, 210, 200});
+   SkRRect inner = SkRRect::MakeOval({60, 70, 170, 160});
+   SkPaint paint;
+   canvas->drawDRRect(outer, inner, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_080.cpp b/docs/examples/Canvas_080.cpp
new file mode 100644
index 0000000..9f8a904
--- /dev/null
+++ b/docs/examples/Canvas_080.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=30823cb4edf884d330285ea161664931
+REG_FIDDLE(Canvas_080, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkRRect outer = SkRRect::MakeRect({20, 40, 210, 200});
+   SkRRect inner = SkRRect::MakeRectXY({60, 70, 170, 160}, 10, 10);
+   SkPaint paint;
+   paint.setAntiAlias(true);
+   paint.setStyle(SkPaint::kStroke_Style);
+   paint.setStrokeWidth(20);
+   paint.setStrokeJoin(SkPaint::kRound_Join);
+   canvas->drawDRRect(outer, inner, paint);
+   paint.setStrokeWidth(1);
+   paint.setColor(SK_ColorWHITE);
+   canvas->drawDRRect(outer, inner, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_081.cpp b/docs/examples/Canvas_081.cpp
new file mode 100644
index 0000000..b966a80
--- /dev/null
+++ b/docs/examples/Canvas_081.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=841229e25ca9dfb68bd0dc4dfff356eb
+REG_FIDDLE(Canvas_081, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawCircle(128, 128, 90, paint);
+    paint.setColor(SK_ColorWHITE);
+    canvas->drawCircle(86, 86, 20, paint);
+    canvas->drawCircle(160, 76, 20, paint);
+    canvas->drawCircle(140, 150, 35, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_082.cpp b/docs/examples/Canvas_082.cpp
new file mode 100644
index 0000000..f5709ff
--- /dev/null
+++ b/docs/examples/Canvas_082.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9303ffae45ddd0b0a1f93d816a1762f4
+REG_FIDDLE(Canvas_082, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawCircle(128, 128, 90, paint);
+    paint.setColor(SK_ColorWHITE);
+    canvas->drawCircle({86, 86}, 20, paint);
+    canvas->drawCircle({160, 76}, 20, paint);
+    canvas->drawCircle({140, 150}, 35, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_083.cpp b/docs/examples/Canvas_083.cpp
new file mode 100644
index 0000000..5dae8b9
--- /dev/null
+++ b/docs/examples/Canvas_083.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=11f0fbe7b30d776913c2e7c92c02ff57
+REG_FIDDLE(Canvas_083, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRect oval = { 4, 4, 60, 60};
+    for (auto useCenter : { false, true } ) {
+        for (auto style : { SkPaint::kFill_Style, SkPaint::kStroke_Style } ) {
+            paint.setStyle(style);
+            for (auto degrees : { 45, 90, 180, 360} ) {
+                canvas->drawArc(oval, 0, degrees , useCenter, paint);
+                canvas->translate(64, 0);
+            }
+            canvas->translate(-256, 64);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_084.cpp b/docs/examples/Canvas_084.cpp
new file mode 100644
index 0000000..b815006
--- /dev/null
+++ b/docs/examples/Canvas_084.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e91dbe45974489b8962c815017b7914f
+REG_FIDDLE(Canvas_084, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(4);
+    SkRect oval = { 4, 4, 60, 60};
+    float intervals[] = { 5, 5 };
+    paint.setPathEffect(SkDashPathEffect::Make(intervals, 2, 2.5f));
+    for (auto degrees : { 270, 360, 540, 720 } ) {
+        canvas->drawArc(oval, 0, degrees, false, paint);
+        canvas->translate(64, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_085.cpp b/docs/examples/Canvas_085.cpp
new file mode 100644
index 0000000..1b664c5
--- /dev/null
+++ b/docs/examples/Canvas_085.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=199fe818c09026c114e165bff166a39f
+REG_FIDDLE(Canvas_085, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkVector radii[] = { {0, 20}, {10, 10}, {10, 20}, {10, 40} };
+    SkPaint paint;
+    paint.setStrokeWidth(15);
+    paint.setStrokeJoin(SkPaint::kRound_Join);
+    paint.setAntiAlias(true);
+    for (auto style : { SkPaint::kStroke_Style, SkPaint::kFill_Style  } ) {
+        paint.setStyle(style );
+        for (size_t i = 0; i < SK_ARRAY_COUNT(radii); ++i) {
+           canvas->drawRoundRect({10, 10, 60, 40}, radii[i].fX, radii[i].fY, paint);
+           canvas->translate(0, 60);
+        }
+        canvas->translate(80, -240);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_086.cpp b/docs/examples/Canvas_086.cpp
new file mode 100644
index 0000000..3e4f97d
--- /dev/null
+++ b/docs/examples/Canvas_086.cpp
@@ -0,0 +1,38 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fe2294131f422b8d6752f6a880f98ad9
+REG_FIDDLE(Canvas_086, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo(20, 20);
+    path.quadTo(60, 20, 60, 60);
+    path.close();
+    path.moveTo(60, 20);
+    path.quadTo(60, 60, 20, 60);
+    SkPaint paint;
+    paint.setStrokeWidth(10);
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (auto join: { SkPaint::kBevel_Join, SkPaint::kRound_Join, SkPaint::kMiter_Join } ) {
+        paint.setStrokeJoin(join);
+        for (auto cap: { SkPaint::kButt_Cap, SkPaint::kSquare_Cap, SkPaint::kRound_Cap  } ) {
+            paint.setStrokeCap(cap);
+            canvas->drawPath(path, paint);
+            canvas->translate(80, 0);
+        }
+        canvas->translate(-240, 60);
+    }
+    paint.setStyle(SkPaint::kFill_Style);
+    for (auto fill : { SkPath::kWinding_FillType,
+                       SkPath::kEvenOdd_FillType,
+                       SkPath::kInverseWinding_FillType } ) {
+        path.setFillType(fill);
+        canvas->save();
+        canvas->clipRect({0, 10, 80, 70});
+        canvas->drawPath(path, paint);
+        canvas->restore();
+        canvas->translate(80, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_087.cpp b/docs/examples/Canvas_087.cpp
new file mode 100644
index 0000000..3af5ae4
--- /dev/null
+++ b/docs/examples/Canvas_087.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=185746dc0faa6f1df30c4afe098646ff
+REG_FIDDLE(Canvas_087, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+   // sk_sp<SkImage> image;
+   SkImage* imagePtr = image.get();
+   canvas->drawImage(imagePtr, 0, 0);
+   SkPaint paint;
+   canvas->drawImage(imagePtr, 80, 0, &paint);
+   paint.setAlpha(0x80);
+   canvas->drawImage(imagePtr, 160, 0, &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_088.cpp b/docs/examples/Canvas_088.cpp
new file mode 100644
index 0000000..bc8f3b2
--- /dev/null
+++ b/docs/examples/Canvas_088.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a4e877e891b1be5faa2b7fd07f673a10
+REG_FIDDLE(Canvas_088, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+   // sk_sp<SkImage> image;
+   canvas->drawImage(image, 0, 0);
+   SkPaint paint;
+   canvas->drawImage(image, 80, 0, &paint);
+   paint.setAlpha(0x80);
+   canvas->drawImage(image, 160, 0, &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_089.cpp b/docs/examples/Canvas_089.cpp
new file mode 100644
index 0000000..9a70556
--- /dev/null
+++ b/docs/examples/Canvas_089.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5df49d1f4da37275a1f10ef7f1a749f0
+REG_FIDDLE(Canvas_089, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap redBorder;
+    redBorder.allocPixels(SkImageInfo::MakeN32Premul(4, 4));
+    SkCanvas checkRed(redBorder);
+    checkRed.clear(SK_ColorRED);
+    uint32_t checkers[][2] = { { SK_ColorBLACK, SK_ColorWHITE },
+                               { SK_ColorWHITE, SK_ColorBLACK } };
+    checkRed.writePixels(
+            SkImageInfo::MakeN32Premul(2, 2), (void*) checkers, sizeof(checkers[0]), 1, 1);
+    canvas->scale(16, 16);
+    canvas->drawBitmap(redBorder, 0, 0, nullptr);
+    canvas->resetMatrix();
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(redBorder);
+    SkPaint lowPaint;
+    lowPaint.setFilterQuality(kLow_SkFilterQuality);
+    for (auto constraint : { SkCanvas::kStrict_SrcRectConstraint,
+                             SkCanvas::kFast_SrcRectConstraint } ) {
+        canvas->translate(80, 0);
+        canvas->drawImageRect(image.get(), SkRect::MakeLTRB(1, 1, 3, 3),
+                SkRect::MakeLTRB(16, 16, 48, 48), &lowPaint, constraint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_090.cpp b/docs/examples/Canvas_090.cpp
new file mode 100644
index 0000000..ffa1f55
--- /dev/null
+++ b/docs/examples/Canvas_090.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bfd18e9cac896cdf94c9f154ccf94be8
+REG_FIDDLE(Canvas_090, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t pixels[][4] = {
+            { 0xFFFF0000, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000 },
+            { 0xFFFF0000, 0xFF000000, 0xFFFFFFFF, 0xFFFF0000 },
+            { 0xFFFF0000, 0xFFFFFFFF, 0xFF000000, 0xFFFF0000 },
+            { 0xFFFF0000, 0xFFFF0000, 0xFFFF0000, 0xFFFF0000 } };
+    SkBitmap redBorder;
+    redBorder.installPixels(SkImageInfo::MakeN32Premul(4, 4),
+            (void*) pixels, sizeof(pixels[0]));
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(redBorder);
+    SkPaint lowPaint;
+    for (auto constraint : {
+            SkCanvas::kFast_SrcRectConstraint,
+            SkCanvas::kStrict_SrcRectConstraint,
+            SkCanvas::kFast_SrcRectConstraint } ) {
+        canvas->drawImageRect(image.get(), SkRect::MakeLTRB(1, 1, 3, 3),
+                SkRect::MakeLTRB(16, 16, 48, 48), &lowPaint, constraint);
+        lowPaint.setFilterQuality(kLow_SkFilterQuality);
+        canvas->translate(80, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_091.cpp b/docs/examples/Canvas_091.cpp
new file mode 100644
index 0000000..f921d52
--- /dev/null
+++ b/docs/examples/Canvas_091.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7f92cd5c9b9f4b1ac3cd933b08037bfe
+REG_FIDDLE(Canvas_091, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    // sk_sp<SkImage> image;
+    for (auto i : { 1, 2, 4, 8 } ) {
+        canvas->drawImageRect(image.get(), SkIRect::MakeLTRB(0, 0, 100, 100),
+                SkRect::MakeXYWH(i * 20, i * 20, i * 20, i * 20), nullptr);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_092.cpp b/docs/examples/Canvas_092.cpp
new file mode 100644
index 0000000..b5d24c8
--- /dev/null
+++ b/docs/examples/Canvas_092.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3cf8fb639fef99993cafc064d550c739
+REG_FIDDLE(Canvas_092, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    // sk_sp<SkImage> image;
+    for (auto i : { 20, 40, 80, 160 } ) {
+        canvas->drawImageRect(image.get(), SkRect::MakeXYWH(i, i, i, i), nullptr);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_093.cpp b/docs/examples/Canvas_093.cpp
new file mode 100644
index 0000000..7e388c8
--- /dev/null
+++ b/docs/examples/Canvas_093.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d4b35a9d24c32c042bd1f529b8de3c0d
+REG_FIDDLE(Canvas_093, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t pixels[][2] = { { SK_ColorBLACK, SK_ColorWHITE },
+                             { SK_ColorWHITE, SK_ColorBLACK } };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),
+            (void*) pixels, sizeof(pixels[0]));
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+    SkPaint paint;
+    canvas->scale(4, 4);
+    for (auto alpha : { 50, 100, 150, 255 } ) {
+        paint.setAlpha(alpha);
+        canvas->drawImageRect(image, SkRect::MakeWH(2, 2), SkRect::MakeWH(8, 8), &paint);
+        canvas->translate(8, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_094.cpp b/docs/examples/Canvas_094.cpp
new file mode 100644
index 0000000..2c25302
--- /dev/null
+++ b/docs/examples/Canvas_094.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d307e7e1237f39fb54d80723e5449857
+REG_FIDDLE(Canvas_094, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t pixels[][2] = { { 0x00000000, 0x55555555},
+                             { 0xAAAAAAAA, 0xFFFFFFFF} };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),
+            (void*) pixels, sizeof(pixels[0]));
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+    SkPaint paint;
+    canvas->scale(4, 4);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
+        paint.setColorFilter(SkColorFilter::MakeModeFilter(color, SkBlendMode::kPlus));
+        canvas->drawImageRect(image, SkIRect::MakeWH(2, 2), SkRect::MakeWH(8, 8), &paint);
+        canvas->translate(8, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_095.cpp b/docs/examples/Canvas_095.cpp
new file mode 100644
index 0000000..4f5a475
--- /dev/null
+++ b/docs/examples/Canvas_095.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3a47ef94cb70144455f80333d8653e6c
+REG_FIDDLE(Canvas_095, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t pixels[][2] = { { 0x00000000, 0x55550000},
+                             { 0xAAAA0000, 0xFFFF0000} };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),
+            (void*) pixels, sizeof(pixels[0]));
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+    SkPaint paint;
+    canvas->scale(4, 4);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
+        paint.setColorFilter(SkColorFilter::MakeModeFilter(color, SkBlendMode::kPlus));
+        canvas->drawImageRect(image, SkRect::MakeWH(8, 8), &paint);
+        canvas->translate(8, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_096.cpp b/docs/examples/Canvas_096.cpp
new file mode 100644
index 0000000..6b8f02f
--- /dev/null
+++ b/docs/examples/Canvas_096.cpp
@@ -0,0 +1,31 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4f153cf1d0dbe1a95acf5badeec14dae
+REG_FIDDLE(Canvas_096, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect center = { 20, 10, 50, 40 };
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));
+    SkCanvas bitCanvas(bitmap);
+    SkPaint paint;
+    SkColor gray = 0xFF000000;
+    int left = 0;
+    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {
+        int top = 0;
+        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {
+            paint.setColor(gray);
+            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);
+            gray += 0x001f1f1f;
+            top = bottom;
+        }
+        left = right;
+    }
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+    SkImage* imagePtr = image.get();
+    for (auto dest: { 20, 30, 40, 60, 90 } ) {
+        canvas->drawImageNine(imagePtr, center, SkRect::MakeWH(dest, dest), nullptr);
+        canvas->translate(dest + 4, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_097.cpp b/docs/examples/Canvas_097.cpp
new file mode 100644
index 0000000..3aa922c
--- /dev/null
+++ b/docs/examples/Canvas_097.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d597d9af8d17fd93e634dd12017058e2
+REG_FIDDLE(Canvas_097, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect center = { 20, 10, 50, 40 };
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));
+    SkCanvas bitCanvas(bitmap);
+    SkPaint paint;
+    SkColor gray = 0xFF000000;
+    int left = 0;
+    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {
+        int top = 0;
+        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {
+            paint.setColor(gray);
+            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);
+            gray += 0x001f1f1f;
+            top = bottom;
+        }
+        left = right;
+    }
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+    for (auto dest: { 20, 30, 40, 60, 90 } ) {
+        canvas->drawImageNine(image, center, SkRect::MakeWH(dest, 110 - dest), nullptr);
+        canvas->translate(dest + 4, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_098.cpp b/docs/examples/Canvas_098.cpp
new file mode 100644
index 0000000..c119af6
--- /dev/null
+++ b/docs/examples/Canvas_098.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4a521be1f850058541e136a808c65e78
+REG_FIDDLE(Canvas_098, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t pixels[][8] = { { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},
+                            { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},
+                            { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00},
+                            { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF},
+                            { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+                            { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00},
+                            { 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00},
+                            { 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF} };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),
+            (void*) pixels, sizeof(pixels[0]));
+    SkPaint paint;
+    canvas->scale(4, 4);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {
+        paint.setColor(color);
+        canvas->drawBitmap(bitmap, 0, 0, &paint);
+        canvas->translate(12, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_099.cpp b/docs/examples/Canvas_099.cpp
new file mode 100644
index 0000000..ad6db01
--- /dev/null
+++ b/docs/examples/Canvas_099.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7d04932f2a259cc70d6e45cd25a6feb6
+REG_FIDDLE(Canvas_099, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t pixels[][8] = { { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},
+                            { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},
+                            { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00},
+                            { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF},
+                            { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+                            { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00},
+                            { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},
+                            { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00} };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),
+            (void*) pixels, sizeof(pixels[0]));
+    SkPaint paint;
+    paint.setMaskFilter(SkMaskFilter::MakeBlur(kSolid_SkBlurStyle, 6));
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {
+        paint.setColor(color);
+        canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(32, 32), &paint);
+        canvas->translate(48, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_100.cpp b/docs/examples/Canvas_100.cpp
new file mode 100644
index 0000000..0f5ecb0
--- /dev/null
+++ b/docs/examples/Canvas_100.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0a3c6d2459566e58cee7d4910655ee21
+REG_FIDDLE(Canvas_100, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t pixels[][8] = { { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},
+                            { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},
+                            { 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF},
+                            { 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0xFF},
+                            { 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF},
+                            { 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF},
+                            { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},
+                            { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00} };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),
+            (void*) pixels, sizeof(pixels[0]));
+    SkPaint paint;
+    paint.setFilterQuality(kHigh_SkFilterQuality);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00, 0xFF7f007f} ) {
+        paint.setColor(color);
+        canvas->drawBitmapRect(bitmap, SkIRect::MakeWH(8, 8), SkRect::MakeWH(32, 32), &paint);
+        canvas->translate(48.25f, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_101.cpp b/docs/examples/Canvas_101.cpp
new file mode 100644
index 0000000..88b2e58
--- /dev/null
+++ b/docs/examples/Canvas_101.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bdbeac3c97f60a63987b1cc8e1f1e91e
+REG_FIDDLE(Canvas_101, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t pixels[][2] = { { 0x00000000, 0x55550000},
+                             { 0xAAAA0000, 0xFFFF0000} };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeN32Premul(2, 2),
+            (void*) pixels, sizeof(pixels[0]));
+    SkPaint paint;
+    canvas->scale(4, 4);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
+        paint.setColorFilter(SkColorFilter::MakeModeFilter(color, SkBlendMode::kPlus));
+        canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), &paint);
+        canvas->translate(8, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_102.cpp b/docs/examples/Canvas_102.cpp
new file mode 100644
index 0000000..8570852
--- /dev/null
+++ b/docs/examples/Canvas_102.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e99e7be0d8f67dfacbecf85df585433d
+REG_FIDDLE(Canvas_102, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect center = { 20, 10, 50, 40 };
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));
+    SkCanvas bitCanvas(bitmap);
+    SkPaint paint;
+    SkColor gray = 0xFF000000;
+    int left = 0;
+    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {
+        int top = 0;
+        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {
+            paint.setColor(gray);
+            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);
+            gray += 0x001f1f1f;
+            top = bottom;
+        }
+        left = right;
+    }
+    for (auto dest: { 20, 30, 40, 60, 90 } ) {
+        canvas->drawBitmapNine(bitmap, center, SkRect::MakeWH(dest, 110 - dest), nullptr);
+        canvas->translate(dest + 4, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_103.cpp b/docs/examples/Canvas_103.cpp
new file mode 100644
index 0000000..79ab1a9
--- /dev/null
+++ b/docs/examples/Canvas_103.cpp
@@ -0,0 +1,37 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c5bfa944e17ba4a4400dc799f032069c
+REG_FIDDLE(Canvas_103, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect center = { 20, 10, 50, 40 };
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));
+    SkCanvas bitCanvas(bitmap);
+    SkPaint paint;
+    SkColor gray = 0xFF000000;
+    int left = 0;
+    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {
+        int top = 0;
+        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {
+            paint.setColor(gray);
+            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);
+            gray += 0x001f1f1f;
+            top = bottom;
+        }
+        left = right;
+    }
+    const int xDivs[] = { center.fLeft, center.fRight };
+    const int yDivs[] = { center.fTop, center.fBottom };
+    SkCanvas::Lattice::RectType fillTypes[3][3];
+    memset(fillTypes, 0, sizeof(fillTypes));
+    fillTypes[1][1] = SkCanvas::Lattice::kTransparent;
+    SkColor dummy[9];  // temporary pending bug fix
+    SkCanvas::Lattice lattice = { xDivs, yDivs, fillTypes[0], SK_ARRAY_COUNT(xDivs),
+         SK_ARRAY_COUNT(yDivs), nullptr, dummy };
+    for (auto dest: { 20, 30, 40, 60, 90 } ) {
+        canvas->drawBitmapLattice(bitmap, lattice, SkRect::MakeWH(dest, 110 - dest), nullptr);
+        canvas->translate(dest + 4, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_104.cpp b/docs/examples/Canvas_104.cpp
new file mode 100644
index 0000000..5e21f43
--- /dev/null
+++ b/docs/examples/Canvas_104.cpp
@@ -0,0 +1,31 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4f153cf1d0dbe1a95acf5badeec14dae
+REG_FIDDLE(Canvas_104, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect center = { 20, 10, 50, 40 };
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(60, 60));
+    SkCanvas bitCanvas(bitmap);
+    SkPaint paint;
+    SkColor gray = 0xFF000000;
+    int left = 0;
+    for (auto right: { center.fLeft, center.fRight, bitmap.width() } ) {
+        int top = 0;
+        for (auto bottom: { center.fTop, center.fBottom, bitmap.height() } ) {
+            paint.setColor(gray);
+            bitCanvas.drawIRect(SkIRect::MakeLTRB(left, top, right, bottom), paint);
+            gray += 0x001f1f1f;
+            top = bottom;
+        }
+        left = right;
+    }
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+    SkImage* imagePtr = image.get();
+    for (auto dest: { 20, 30, 40, 60, 90 } ) {
+        canvas->drawImageNine(imagePtr, center, SkRect::MakeWH(dest, dest), nullptr);
+        canvas->translate(dest + 4, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_105.cpp b/docs/examples/Canvas_105.cpp
new file mode 100644
index 0000000..5078d79
--- /dev/null
+++ b/docs/examples/Canvas_105.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=55f5e59350622c5e2834d1c85789f732
+REG_FIDDLE(Canvas_105, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkFont font;
+    float textSizes[] = { 12, 18, 24, 36 };
+    for (auto size: textSizes ) {
+        font.setSize(size);
+        canvas->drawString("Aa", 10, 20, font, paint);
+        canvas->translate(0, size * 2);
+    }
+    font = SkFont();
+    float yPos = 20;
+    for (auto size: textSizes ) {
+        float scale = size / 12.f;
+        canvas->resetMatrix();
+        canvas->translate(100, 0);
+        canvas->scale(scale, scale);
+        canvas->drawString("Aa", 10 / scale, yPos / scale, font, paint);
+        yPos += size * 2;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_106.cpp b/docs/examples/Canvas_106.cpp
new file mode 100644
index 0000000..e772e0f
--- /dev/null
+++ b/docs/examples/Canvas_106.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=85442cf8d0bce6b5a777853bc36a4dc4
+REG_FIDDLE(Canvas_106, 256, 48, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkFont font;
+    canvas->drawString("a small hello", 20, 20, font, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_107.cpp b/docs/examples/Canvas_107.cpp
new file mode 100644
index 0000000..dc2ce26
--- /dev/null
+++ b/docs/examples/Canvas_107.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=435178c09feb3bfec5e35d983609a013
+REG_FIDDLE(Canvas_107, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkString string("a small hello");
+    canvas->drawString(string, 20, 20, SkFont(), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_108.cpp b/docs/examples/Canvas_108.cpp
new file mode 100644
index 0000000..cce8a80
--- /dev/null
+++ b/docs/examples/Canvas_108.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bf0b2402533a23b6392e0676b7a8414c
+REG_FIDDLE(Canvas_108, 256, 120, false, 0) {
+void draw(SkCanvas* canvas) {
+  const char hello[] = "HeLLo!";
+  const SkPoint pos[] = { {40, 100}, {82, 95}, {115, 110}, {130, 95}, {145, 85},
+    {172, 100} };
+  SkPaint paint;
+  paint.setTextSize(60);
+  canvas->drawPosText(hello, strlen(hello), pos, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_109.cpp b/docs/examples/Canvas_109.cpp
new file mode 100644
index 0000000..7fe4214
--- /dev/null
+++ b/docs/examples/Canvas_109.cpp
@@ -0,0 +1,13 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=95c6a7ef82993a8d2add676080e9438a
+REG_FIDDLE(Canvas_109, 256, 40, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkScalar xpos[] = { 20, 40, 80, 160 };
+    SkPaint paint;
+    canvas->drawPosTextH("XXXX", 4, xpos, 20, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_110.cpp b/docs/examples/Canvas_110.cpp
new file mode 100644
index 0000000..34fcca0
--- /dev/null
+++ b/docs/examples/Canvas_110.cpp
@@ -0,0 +1,26 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=935c8f8b9782d297a73d7186f6ef7945
+REG_FIDDLE(Canvas_110, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    const int iterations = 26;
+    SkRSXform transforms[iterations];
+    char alphabet[iterations];
+    SkScalar angle = 0;
+    SkScalar scale = 1;
+    for (size_t i = 0; i < SK_ARRAY_COUNT(transforms); ++i) {
+        const SkScalar s = SkScalarSin(angle) * scale;
+        const SkScalar c = SkScalarCos(angle) * scale;
+        transforms[i] = SkRSXform::Make(-c, -s, -s * 16, c * 16);
+        angle += .45;
+        scale += .2;
+        alphabet[i] = 'A' + i;
+    }
+    SkPaint paint;
+    canvas->translate(110, 138);
+    canvas->drawTextRSXform(alphabet, sizeof(alphabet), transforms, nullptr, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_111.cpp b/docs/examples/Canvas_111.cpp
new file mode 100644
index 0000000..0594843
--- /dev/null
+++ b/docs/examples/Canvas_111.cpp
@@ -0,0 +1,33 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=005502b502c1282cb8d306d6c8d998fb
+REG_FIDDLE(Canvas_111, 256, 120, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder textBlobBuilder;
+    const char bunny[] = "/(^x^)\\";
+    const int len = sizeof(bunny) - 1;
+    uint16_t glyphs[len];
+    SkPaint paint;
+    paint.textToGlyphs(bunny, len, glyphs);
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    SkFont font;
+    int runs[] = { 3, 1, 3 };
+    SkPoint textPos = { 20, 100 };
+    int glyphIndex = 0;
+    for (auto runLen : runs) {
+        font.setSize(1 == runLen ? 20 : 50);
+        const SkTextBlobBuilder::RunBuffer& run =
+                textBlobBuilder.allocRun(font, runLen, textPos.fX, textPos.fY);
+        memcpy(run.glyphs, &glyphs[glyphIndex], sizeof(glyphs[0]) * runLen);
+        paint.setTextSize(1 == runLen ? 20 : 50);
+        textPos.fX += paint.measureText(&glyphs[glyphIndex], sizeof(glyphs[0]) * runLen, nullptr);
+        glyphIndex += runLen;
+    }
+    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();
+    paint.reset();
+    canvas->drawTextBlob(blob.get(), 0, 0, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_112.cpp b/docs/examples/Canvas_112.cpp
new file mode 100644
index 0000000..ebde973
--- /dev/null
+++ b/docs/examples/Canvas_112.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1cae21e7b63b24de3eca0bbd9be1936b
+REG_FIDDLE(Canvas_112, 256, 120, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder textBlobBuilder;
+    SkFont font;
+    font.setSize(50);
+    const SkTextBlobBuilder::RunBuffer& run =
+            textBlobBuilder.allocRun(font, 1, 20, 100);
+    run.glyphs[0] = 20;
+    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();
+    SkPaint paint;
+    paint.setColor(SK_ColorBLUE);
+    canvas->drawTextBlob(blob.get(), 0, 0, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_113.cpp b/docs/examples/Canvas_113.cpp
new file mode 100644
index 0000000..01aed9f
--- /dev/null
+++ b/docs/examples/Canvas_113.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=83918a23fcffd47f59a1ef662c85a24c
+REG_FIDDLE(Canvas_113, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
+        SkPaint paint;
+        paint.setColor(color);
+        recordingCanvas->drawRect({10, 10, 30, 40}, paint);
+        recordingCanvas->translate(10, 10);
+        recordingCanvas->scale(1.2f, 1.4f);
+    }
+    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
+    canvas->drawPicture(playback);
+    canvas->scale(2, 2);
+    canvas->translate(50, 0);
+    canvas->drawPicture(playback);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_114.cpp b/docs/examples/Canvas_114.cpp
new file mode 100644
index 0000000..6c4c9f3
--- /dev/null
+++ b/docs/examples/Canvas_114.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=83918a23fcffd47f59a1ef662c85a24c
+REG_FIDDLE(Canvas_114, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
+        SkPaint paint;
+        paint.setColor(color);
+        recordingCanvas->drawRect({10, 10, 30, 40}, paint);
+        recordingCanvas->translate(10, 10);
+        recordingCanvas->scale(1.2f, 1.4f);
+    }
+    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
+    canvas->drawPicture(playback);
+    canvas->scale(2, 2);
+    canvas->translate(50, 0);
+    canvas->drawPicture(playback);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_115.cpp b/docs/examples/Canvas_115.cpp
new file mode 100644
index 0000000..a40c744
--- /dev/null
+++ b/docs/examples/Canvas_115.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=759e4e5bac680838added8f70884dcdc
+REG_FIDDLE(Canvas_115, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPictureRecorder recorder;
+    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
+        paint.setColor(color);
+        recordingCanvas->drawRect({10, 10, 30, 40}, paint);
+        recordingCanvas->translate(10, 10);
+        recordingCanvas->scale(1.2f, 1.4f);
+    }
+    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
+    const SkPicture* playbackPtr = playback.get();
+    SkMatrix matrix;
+    matrix.reset();
+    for (auto alpha : { 70, 140, 210 } ) {
+    paint.setAlpha(alpha);
+    canvas->drawPicture(playbackPtr, &matrix, &paint);
+    matrix.preTranslate(70, 70);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_116.cpp b/docs/examples/Canvas_116.cpp
new file mode 100644
index 0000000..63e13d8
--- /dev/null
+++ b/docs/examples/Canvas_116.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c4ff59439dd2fc871925d4eeb0c84ca1
+REG_FIDDLE(Canvas_116, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPictureRecorder recorder;
+    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
+        paint.setColor(color);
+        recordingCanvas->drawRect({10, 10, 30, 40}, paint);
+        recordingCanvas->translate(10, 10);
+        recordingCanvas->scale(1.2f, 1.4f);
+    }
+    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
+    SkMatrix matrix;
+    matrix.reset();
+    for (auto alpha : { 70, 140, 210 } ) {
+    paint.setAlpha(alpha);
+    canvas->drawPicture(playback, &matrix, &paint);
+    matrix.preTranslate(70, 70);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_117.cpp b/docs/examples/Canvas_117.cpp
new file mode 100644
index 0000000..862ef5c
--- /dev/null
+++ b/docs/examples/Canvas_117.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f48b22eaad1bb7adcc3faaa321754af6
+REG_FIDDLE(Canvas_117, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPoint points[] = { { 0, 0 }, { 250, 0 }, { 100, 100 }, { 0, 250 } };
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorCYAN };
+    auto vertices = SkVertices::MakeCopy(SkVertices::kTriangleFan_VertexMode,
+            SK_ARRAY_COUNT(points), points, nullptr, colors);
+    canvas->drawVertices(vertices.get(), SkBlendMode::kSrc, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_118.cpp b/docs/examples/Canvas_118.cpp
new file mode 100644
index 0000000..c0c913f
--- /dev/null
+++ b/docs/examples/Canvas_118.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e8bdae9bea3227758989028424fcac3d
+REG_FIDDLE(Canvas_118, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPoint points[] = { { 0, 0 }, { 250, 0 }, { 100, 100 }, { 0, 250 } };
+    SkPoint texs[] = { { 0, 0 }, { 0, 250 }, { 250, 250 }, { 250, 0 } };
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorCYAN };
+    paint.setShader(SkGradientShader::MakeLinear(points, colors, nullptr, 4,
+            SkShader::kClamp_TileMode));
+    auto vertices = SkVertices::MakeCopy(SkVertices::kTriangleFan_VertexMode,
+            SK_ARRAY_COUNT(points), points, texs, colors);
+    canvas->drawVertices(vertices, SkBlendMode::kDarken, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_119.cpp b/docs/examples/Canvas_119.cpp
new file mode 100644
index 0000000..a064649
--- /dev/null
+++ b/docs/examples/Canvas_119.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=accb545d67984ced168f5be6ab824795
+REG_FIDDLE(Canvas_119, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    // SkBitmap source = cmbkygk;
+    SkPaint paint;
+    paint.setFilterQuality(kLow_SkFilterQuality);
+    paint.setAntiAlias(true);
+    SkPoint cubics[] = { { 3, 1 },    { 4, 2 }, { 5, 1 },    { 7, 3 },
+                      /* { 7, 3 }, */ { 6, 4 }, { 7, 5 },    { 5, 7 },
+                      /* { 5, 7 }, */ { 4, 6 }, { 3, 7 },    { 1, 5 },
+                      /* { 1, 5 }, */ { 2, 4 }, { 1, 3 }, /* { 3, 1 } */ };
+    SkColor colors[] = { 0xbfff0000, 0xbf0000ff, 0xbfff00ff, 0xbf00ffff };
+    SkPoint texCoords[] = { { -30, -30 }, { 162, -30}, { 162, 162}, { -30, 162} };
+    paint.setShader(SkShader::MakeBitmapShader(source, SkShader::kClamp_TileMode,
+                                                       SkShader::kClamp_TileMode, nullptr));
+    canvas->scale(15, 15);
+    for (auto blend : { SkBlendMode::kSrcOver, SkBlendMode::kModulate, SkBlendMode::kXor } ) {
+        canvas->drawPatch(cubics, colors, texCoords, blend, paint);
+        canvas->translate(4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_120.cpp b/docs/examples/Canvas_120.cpp
new file mode 100644
index 0000000..9676064
--- /dev/null
+++ b/docs/examples/Canvas_120.cpp
@@ -0,0 +1,32 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4e8b7409531c9211a2afcf632005a38c
+REG_FIDDLE(Canvas_120, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint cubics[] = { { 3, 1 },    { 4, 2 }, { 5, 1 },    { 7, 3 },
+                      /* { 7, 3 }, */ { 6, 4 }, { 7, 5 },    { 5, 7 },
+                      /* { 5, 7 }, */ { 4, 6 }, { 3, 7 },    { 1, 5 },
+                      /* { 1, 5 }, */ { 2, 4 }, { 1, 3 }, /* { 3, 1 } */ };
+    SkColor colors[] = { SK_ColorRED, SK_ColorBLUE, SK_ColorYELLOW, SK_ColorCYAN };
+    canvas->scale(30, 30);
+    canvas->drawPatch(cubics, colors, nullptr, paint);
+    SkPoint text[] = { {3,0.9f}, {4,2.5f}, {5,0.9f}, {7.5f,3.2f}, {5.5f,4.2f},
+            {7.5f,5.2f}, {5,7.5f}, {4,5.9f}, {3,7.5f}, {0.5f,5.2f}, {2.5f,4.2f},
+            {0.5f,3.2f} };
+    paint.setTextSize(18.f / 30);
+    for (int i = 0; i< 10; ++i) {
+       char digit = '0' + i;
+       canvas->drawText(&digit, 1, text[i].fX, text[i].fY, paint);
+    }
+    canvas->drawString("10", text[10].fX, text[10].fY, paint);
+    canvas->drawString("11", text[11].fX, text[11].fY, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, 12, cubics, paint);
+    canvas->drawLine(cubics[11].fX, cubics[11].fY, cubics[0].fX, cubics[0].fY, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_121.cpp b/docs/examples/Canvas_121.cpp
new file mode 100644
index 0000000..673ad1b
--- /dev/null
+++ b/docs/examples/Canvas_121.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3412c2a16cb529af0e04878d264451f2
+REG_FIDDLE(Canvas_121, 256, 256, false, 6) {
+void draw(SkCanvas* canvas) {
+    // SkBitmap source = checkerboard;
+    SkPaint paint;
+    paint.setFilterQuality(kLow_SkFilterQuality);
+    paint.setAntiAlias(true);
+    SkPoint cubics[] = { { 3, 1 },    { 4, 2 }, { 5, 1 },    { 7, 3 },
+                      /* { 7, 3 }, */ { 6, 4 }, { 7, 5 },    { 5, 7 },
+                      /* { 5, 7 }, */ { 4, 6 }, { 3, 7 },    { 1, 5 },
+                      /* { 1, 5 }, */ { 2, 4 }, { 1, 3 }, /* { 3, 1 } */ };
+    SkPoint texCoords[] = { { 0, 0 }, { 0, 62}, { 62, 62}, { 62, 0 } };
+    paint.setShader(SkShader::MakeBitmapShader(source, SkShader::kClamp_TileMode,
+                                                       SkShader::kClamp_TileMode, nullptr));
+    canvas->scale(30, 30);
+    canvas->drawPatch(cubics, nullptr, texCoords, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_122.cpp b/docs/examples/Canvas_122.cpp
new file mode 100644
index 0000000..0922438
--- /dev/null
+++ b/docs/examples/Canvas_122.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1df575f9b8132306ce0552a2554ed132
+REG_FIDDLE(Canvas_122, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+  // SkBitmap source = mandrill;
+  SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 200, 100 } };
+  SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };
+  SkColor colors[] = { 0x7f55aa00, 0x7f3333bf };
+  const SkImage* imagePtr = image.get();
+  canvas->drawAtlas(imagePtr, xforms, tex, colors, 2, SkBlendMode::kSrcOver, nullptr, nullptr);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_123.cpp b/docs/examples/Canvas_123.cpp
new file mode 100644
index 0000000..e320ccb
--- /dev/null
+++ b/docs/examples/Canvas_123.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0e66a8f230a8d531bcef9f5ebdc5aac1
+REG_FIDDLE(Canvas_123, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+  // SkBitmap source = mandrill;
+  SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 200, 100 } };
+  SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };
+  SkColor colors[] = { 0x7f55aa00, 0x7f3333bf };
+  SkPaint paint;
+  paint.setAlpha(127);
+  canvas->drawAtlas(image, xforms, tex, colors, 2, SkBlendMode::kPlus, nullptr, &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_124.cpp b/docs/examples/Canvas_124.cpp
new file mode 100644
index 0000000..775736d
--- /dev/null
+++ b/docs/examples/Canvas_124.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8dc0d0fdeab20bbc21cac6874ddbefcd
+REG_FIDDLE(Canvas_124, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+  // sk_sp<SkImage> image = mandrill;
+  SkRSXform xforms[] = { { .5f, 0, 0, 0 }, {0, .5f, 200, 100 } };
+  SkRect tex[] = { { 0, 0, 250, 250 }, { 0, 0, 250, 250 } };
+  const SkImage* imagePtr = image.get();
+  canvas->drawAtlas(imagePtr, xforms, tex, 2, nullptr, nullptr);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_125.cpp b/docs/examples/Canvas_125.cpp
new file mode 100644
index 0000000..509e849
--- /dev/null
+++ b/docs/examples/Canvas_125.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c093c2b14bd3e6171ede7cd4049d9b57
+REG_FIDDLE(Canvas_125, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+  // sk_sp<SkImage> image = mandrill;
+  SkRSXform xforms[] = { { 1, 0, 0, 0 }, {0, 1, 300, 100 } };
+  SkRect tex[] = { { 0, 0, 200, 200 }, { 200, 0, 400, 200 } };
+  canvas->drawAtlas(image, xforms, tex, 2, nullptr, nullptr);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_126.cpp b/docs/examples/Canvas_126.cpp
new file mode 100644
index 0000000..bdef217
--- /dev/null
+++ b/docs/examples/Canvas_126.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3a4dfcd08838866b5cfc0d82489195ba
+REG_FIDDLE(Canvas_126, 256, 100, false, 0) {
+struct MyDrawable : public SkDrawable {
+    SkRect onGetBounds() override { return SkRect::MakeWH(50, 100);  }
+    void onDraw(SkCanvas* canvas) override {
+       SkPath path;
+       path.conicTo(10, 90, 50, 90, 0.9f);
+       SkPaint paint;
+       paint.setColor(SK_ColorBLUE);
+       canvas->drawRect(path.getBounds(), paint);
+       paint.setAntiAlias(true);
+       paint.setColor(SK_ColorWHITE);
+       canvas->drawPath(path, paint);
+    }
+};
+
+void draw(SkCanvas* canvas) {
+    sk_sp<SkDrawable> drawable(new MyDrawable);
+  SkMatrix matrix;
+  matrix.setTranslate(10, 10);
+  canvas->drawDrawable(drawable.get(), &matrix);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_127.cpp b/docs/examples/Canvas_127.cpp
new file mode 100644
index 0000000..b9b379f
--- /dev/null
+++ b/docs/examples/Canvas_127.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1bdc07ad3b154c89b771722c2fcaee3f
+REG_FIDDLE(Canvas_127, 256, 100, false, 0) {
+struct MyDrawable : public SkDrawable {
+    SkRect onGetBounds() override { return SkRect::MakeWH(50, 100);  }
+    void onDraw(SkCanvas* canvas) override {
+       SkPath path;
+       path.conicTo(10, 90, 50, 90, 0.9f);
+       SkPaint paint;
+       paint.setColor(SK_ColorBLUE);
+       canvas->drawRect(path.getBounds(), paint);
+       paint.setAntiAlias(true);
+       paint.setColor(SK_ColorWHITE);
+       canvas->drawPath(path, paint);
+    }
+};
+
+void draw(SkCanvas* canvas) {
+    sk_sp<SkDrawable> drawable(new MyDrawable);
+  canvas->drawDrawable(drawable.get(), 10, 10);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_128.cpp b/docs/examples/Canvas_128.cpp
new file mode 100644
index 0000000..c6ac7bf
--- /dev/null
+++ b/docs/examples/Canvas_128.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=00b430bd80d740e19c6d020a940f56d5
+REG_FIDDLE(Canvas_128, 256, 1, false, 0) {
+void draw(SkCanvas* canvas) {
+    const char text[] = "Click this link!";
+    SkRect bounds;
+    SkPaint paint;
+    paint.setTextSize(40);
+    (void)paint.measureText(text, strlen(text), &bounds);
+    const char url[] = "https://www.google.com/";
+    sk_sp<SkData> urlData(SkData::MakeWithCString(url));
+    canvas->drawAnnotation(bounds, "url_key", urlData.get());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_129.cpp b/docs/examples/Canvas_129.cpp
new file mode 100644
index 0000000..ba9c70a
--- /dev/null
+++ b/docs/examples/Canvas_129.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=00b430bd80d740e19c6d020a940f56d5
+REG_FIDDLE(Canvas_129, 256, 1, false, 0) {
+void draw(SkCanvas* canvas) {
+    const char text[] = "Click this link!";
+    SkRect bounds;
+    SkPaint paint;
+    paint.setTextSize(40);
+    (void)paint.measureText(text, strlen(text), &bounds);
+    const char url[] = "https://www.google.com/";
+    sk_sp<SkData> urlData(SkData::MakeWithCString(url));
+    canvas->drawAnnotation(bounds, "url_key", urlData.get());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Canvas_130.cpp b/docs/examples/Canvas_130.cpp
new file mode 100644
index 0000000..1c3fe19
--- /dev/null
+++ b/docs/examples/Canvas_130.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f106f146a58c8604308d4d8d7086d2f5
+REG_FIDDLE(Canvas_130, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("clip is%s empty\n", canvas->isClipEmpty() ? "" : " not");
+    SkPath path;
+    canvas->clipPath(path);
+    SkDebugf("clip is%s empty\n", canvas->isClipEmpty() ? "" : " not");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Canvas_131.cpp b/docs/examples/Canvas_131.cpp
new file mode 100644
index 0000000..b3cb84f
--- /dev/null
+++ b/docs/examples/Canvas_131.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9894bfb476c78a8f6c8f49fbbca3d50d
+REG_FIDDLE(Canvas_131, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("clip is%s rect\n", canvas->isClipRect() ? "" : " not");
+    canvas->clipRect({0, 0, 0, 0});
+    SkDebugf("clip is%s rect\n", canvas->isClipRect() ? "" : " not");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color4f_000.cpp b/docs/examples/Color4f_000.cpp
new file mode 100644
index 0000000..57c954a
--- /dev/null
+++ b/docs/examples/Color4f_000.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e5b34bcb7f80f2ed890cdacaa059db0d
+REG_FIDDLE(Color4f_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor4f colorRed = { 1, 0, 0, 1 };
+    SkColor4f colorNamedRed = SkColor4f::FromColor(SK_ColorRED);
+    SkDebugf("colorRed %c= colorNamedRed", colorRed == colorNamedRed ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color4f_001.cpp b/docs/examples/Color4f_001.cpp
new file mode 100644
index 0000000..e8b744f
--- /dev/null
+++ b/docs/examples/Color4f_001.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=82f1a9b4c2b27aa547061786d1f33dab
+REG_FIDDLE(Color4f_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor4f colorGray = { .5, .5, .5, 1 };
+    SkColor4f colorNamedGray = SkColor4f::FromColor(SK_ColorGRAY);
+    SkDebugf("colorGray %c= colorNamedGray ", colorGray != colorNamedGray ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color4f_002.cpp b/docs/examples/Color4f_002.cpp
new file mode 100644
index 0000000..763b3d4
--- /dev/null
+++ b/docs/examples/Color4f_002.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=229057023515224358a36acf15508cf6
+REG_FIDDLE(Color4f_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor4f color = SkColor4f::FromColor(0x884488CC);
+    SkDebugf("red=%g green=%g blue=%g alpha=%g\n", color.fR, color.fG, color.fB, color.fA);
+    const float* array = color.vec();
+    SkDebugf("[0]=%g [1]=%g [2]=%g [3]=%g\n", array[0], array[1], array[2], array[3]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color4f_003.cpp b/docs/examples/Color4f_003.cpp
new file mode 100644
index 0000000..2995871
--- /dev/null
+++ b/docs/examples/Color4f_003.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7420bf0a7cae5c6577c4c4a4613e7e7e
+REG_FIDDLE(Color4f_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor4f color = SkColor4f::FromColor(0x884488CC);
+    SkDebugf("red=%g green=%g blue=%g alpha=%g\n", color.fR, color.fG, color.fB, color.fA);
+    float* array = color.vec();
+    array[3] = 1;
+    SkDebugf("[0]=%g [1]=%g [2]=%g [3]=%g\n", array[0], array[1], array[2], array[3]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color4f_004.cpp b/docs/examples/Color4f_004.cpp
new file mode 100644
index 0000000..a1d7db0
--- /dev/null
+++ b/docs/examples/Color4f_004.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=33b029064e8d1928e42a587c953d0e4e
+REG_FIDDLE(Color4f_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t red = 77, green = 101, blue = 153, alpha = 43;
+    SkColor argb = SkColorSetARGB(alpha, red, green, blue);
+    SkColor4f color4f = SkColor4f::FromColor(argb);
+    SkDebugf("red=%g green=%g blue=%g alpha=%g\n", color4f.fR, color4f.fG, color4f.fB, color4f.fA);
+    SkColor fromColor4f = color4f.toSkColor();
+    SkDebugf("red=%d green=%d blue=%d alpha=%d\n", SkColorGetR(fromColor4f),
+             SkColorGetG(fromColor4f), SkColorGetB(fromColor4f), SkColorGetA(fromColor4f));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color4f_005.cpp b/docs/examples/Color4f_005.cpp
new file mode 100644
index 0000000..d169a22
--- /dev/null
+++ b/docs/examples/Color4f_005.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=edc5fd18d961f7607d2bcbf7f7d427e5
+REG_FIDDLE(Color4f_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    float red = 0.07f, green = 0.13f, blue = 0.32f, alpha = 0.17f;
+    SkColor4f color4f = { red, green, blue, alpha };
+    SkColor argb = color4f.toSkColor();
+    SkDebugf("red=%d green=%d blue=%d alpha=%d\n", SkColorGetR(argb),
+             SkColorGetG(argb), SkColorGetB(argb), SkColorGetA(argb));
+    SkColor4f fromSkColor = SkColor4f::FromColor(argb);
+    SkDebugf("red=%g green=%g blue=%g alpha=%g\n", fromSkColor.fR, fromSkColor.fG,
+                                                   fromSkColor.fB, fromSkColor.fA);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_000.cpp b/docs/examples/Color_000.cpp
new file mode 100644
index 0000000..2717d39
--- /dev/null
+++ b/docs/examples/Color_000.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=35888f0869e01a6e03b5b93bba563734
+REG_FIDDLE(Color_000, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->drawColor(SK_ColorRED);
+    canvas->clipRect(SkRect::MakeWH(150, 150));
+    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0xFF, 0x00));
+    canvas->clipRect(SkRect::MakeWH(75, 75));
+    canvas->drawColor(SkColorSetARGB(0x80, 0x00, 0x00, 0xFF));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_001.cpp b/docs/examples/Color_001.cpp
new file mode 100644
index 0000000..32851f1
--- /dev/null
+++ b/docs/examples/Color_001.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dad12dd912197cd5edd789ac0801bf8a
+REG_FIDDLE(Color_001, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->drawColor(SK_ColorRED);
+    canvas->clipRect(SkRect::MakeWH(150, 150));
+    canvas->drawColor(SkColorSetRGB(0x00, 0xFF, 0x00));
+    canvas->clipRect(SkRect::MakeWH(75, 75));
+    canvas->drawColor(SkColorSetRGB(0x00, 0x00, 0xFF));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_002.cpp b/docs/examples/Color_002.cpp
new file mode 100644
index 0000000..9c33491
--- /dev/null
+++ b/docs/examples/Color_002.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=896ce0316b489608a95af5439ca2aab1
+REG_FIDDLE(Color_002, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorRED);
+    for (int alpha = 255; alpha >= 0; alpha -= 17) {
+        paint.setAlpha(alpha);
+        canvas->drawRect({5, 5, 100, 20}, paint);
+        SkAlpha alphaInPaint = SkColorGetA(paint.getColor());
+        canvas->drawString(std::to_string(alphaInPaint).c_str(), 110, 18, SkFont(), paint);
+        canvas->translate(0, 15);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_003.cpp b/docs/examples/Color_003.cpp
new file mode 100644
index 0000000..1dc93f9
--- /dev/null
+++ b/docs/examples/Color_003.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d6da38577f189eaa6d9df75f6c3ed252
+REG_FIDDLE(Color_003, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    SkPaint bgPaint;
+    bgPaint.setColor(0xafffffff);
+    canvas->drawRect({20, 50, 80, 70}, bgPaint);
+    uint8_t red = SkColorGetR(source.getColor(226, 128));
+    canvas->drawString(std::to_string(red).c_str(), 40, 65, SkPaint());
+    canvas->drawLine(80, 70, 226, 128, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Color_004.cpp b/docs/examples/Color_004.cpp
new file mode 100644
index 0000000..5b91273
--- /dev/null
+++ b/docs/examples/Color_004.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=535d38b2c019299d915170f7b03d5fea
+REG_FIDDLE(Color_004, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    SkPaint bgPaint;
+    bgPaint.setColor(0xafffffff);
+    canvas->drawRect({20, 50, 80, 70}, bgPaint);
+    uint8_t green = SkColorGetG(source.getColor(57, 192));
+    canvas->drawString(std::to_string(green).c_str(), 40, 65, SkPaint());
+    canvas->drawLine(80, 70, 57, 192, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Color_005.cpp b/docs/examples/Color_005.cpp
new file mode 100644
index 0000000..c00d4c0
--- /dev/null
+++ b/docs/examples/Color_005.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9ee27675284faea375611dc88123a2c5
+REG_FIDDLE(Color_005, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    SkPaint bgPaint;
+    bgPaint.setColor(0xafffffff);
+    canvas->drawRect({20, 50, 80, 70}, bgPaint);
+    uint8_t blue = SkColorGetB(source.getColor(168, 170));
+    canvas->drawString(std::to_string(blue).c_str(), 40, 65, SkPaint());
+    canvas->drawLine(80, 70, 168, 170, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Color_006.cpp b/docs/examples/Color_006.cpp
new file mode 100644
index 0000000..58f1858
--- /dev/null
+++ b/docs/examples/Color_006.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=18f6f376f771f5ffa56d5e5b2ebd20fb
+REG_FIDDLE(Color_006, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    for (int y = 0; y < 256; y += 16) {
+       for (int x = 0; x < 256; x += 16) {
+         SkColor color = source.getColor(x + 8, y + 8);
+         SkPaint paint;
+         paint.setColor(SkColorSetA(color, x + y));
+         canvas->drawRect(SkRect::MakeXYWH(x, y, 16, 16), paint);
+      }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_007.cpp b/docs/examples/Color_007.cpp
new file mode 100644
index 0000000..b08ea6d
--- /dev/null
+++ b/docs/examples/Color_007.cpp
@@ -0,0 +1,38 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bc9c7ea424d10bbcd1e5a88770d4794e
+REG_FIDDLE(Color_007, 256, 128, false, 1) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> srcPixels;
+    srcPixels.resize(source.height() * source.rowBytes());
+    SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width(), source.height()),
+                    &srcPixels.front(), source.rowBytes());
+    source.readPixels(pixmap, 0, 0);
+    for (int y = 0; y < 16; ++y) {
+        for (int x = 0; x < 16; ++x) {
+            int32_t* blockStart = &srcPixels.front() + y * source.width() * 16 + x * 16;
+            size_t transparentCount = 0;
+            for (int fillY = 0; fillY < source.height() / 16; ++fillY) {
+                for (int fillX = 0; fillX < source.width() / 16; ++fillX) {
+                    const SkColor color = SkUnPreMultiply::PMColorToColor(blockStart[fillX]);
+                    transparentCount += SkColorGetA(color) == SK_AlphaTRANSPARENT;
+                }
+                blockStart += source.width();
+            }
+            if (transparentCount > 200) {
+                blockStart = &srcPixels.front() + y * source.width() * 16 + x * 16;
+                for (int fillY = 0; fillY < source.height() / 16; ++fillY) {
+                    for (int fillX = 0; fillX < source.width() / 16; ++fillX) {
+                        blockStart[fillX] = SK_ColorRED;
+                    }
+                    blockStart += source.width();
+                }
+            }
+        }
+    }
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_008.cpp b/docs/examples/Color_008.cpp
new file mode 100644
index 0000000..07e1831
--- /dev/null
+++ b/docs/examples/Color_008.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0424f67ebc2858e8fd04ae3367b115ff
+REG_FIDDLE(Color_008, 256, 128, false, 1) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> srcPixels;
+    srcPixels.resize(source.height() * source.rowBytes());
+    SkPixmap pixmap(SkImageInfo::MakeN32Premul(source.width(), source.height()),
+                    &srcPixels.front(), source.rowBytes());
+    source.readPixels(pixmap, 0, 0);
+    for (int y = 0; y < source.height(); ++y) {
+        for (int x = 0; x < source.width(); ++x) {
+            SkPMColor pixel = srcPixels[y * source.width() + x];
+            const SkColor color = SkUnPreMultiply::PMColorToColor(pixel);
+            if (SkColorGetA(color) == SK_AlphaOPAQUE) {
+                srcPixels[y * source.width() + x] = SK_ColorGREEN;
+            }
+        }
+    }
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_009.cpp b/docs/examples/Color_009.cpp
new file mode 100644
index 0000000..8f383c7
--- /dev/null
+++ b/docs/examples/Color_009.cpp
@@ -0,0 +1,48 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1c2e38321464818847f953ddd45cb5a1
+REG_FIDDLE(Color_009, 256, 256, false, 0) {
+#define SKIA_COLOR_PAIR(name) "SK_Color" #name, SK_Color##name
+
+void draw(SkCanvas* canvas) {
+    struct ColorCompare {
+        const char* fSVGName;
+        SkColor fSVGColor;
+        const char* fSkiaName;
+        SkColor fSkiaColor;
+    } colorCompare[] = {  // see https://www.w3.org/TR/SVG/types.html#ColorKeywords
+        {"black",     SkColorSetRGB(  0,   0,   0),    SKIA_COLOR_PAIR(BLACK) },
+        {"darkgray",  SkColorSetRGB(169, 169, 169),    SKIA_COLOR_PAIR(DKGRAY) },
+        {"gray",      SkColorSetRGB(128, 128, 128),    SKIA_COLOR_PAIR(GRAY) },
+        {"lightgray", SkColorSetRGB(211, 211, 211),    SKIA_COLOR_PAIR(LTGRAY) },
+        {"white",     SkColorSetRGB(255, 255, 255),    SKIA_COLOR_PAIR(WHITE) },
+        {"red",       SkColorSetRGB(255,   0,   0),    SKIA_COLOR_PAIR(RED) },
+        {"green",     SkColorSetRGB(  0, 128,   0),    SKIA_COLOR_PAIR(GREEN) },
+        {"blue",      SkColorSetRGB(  0,   0, 255),    SKIA_COLOR_PAIR(BLUE) },
+        {"yellow",    SkColorSetRGB(255, 255,   0),    SKIA_COLOR_PAIR(YELLOW) },
+        {"aqua",      SkColorSetRGB(  0, 255, 255),    SKIA_COLOR_PAIR(CYAN) },
+        {"fuchsia",   SkColorSetRGB(255,   0, 255),    SKIA_COLOR_PAIR(MAGENTA) },
+    };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(14);
+    for (auto compare : colorCompare) {
+        paint.setStyle(SkPaint::kFill_Style);
+        paint.setColor(compare.fSVGColor);
+        canvas->drawRect({5, 5, 15, 15}, paint);
+        paint.setColor(SK_ColorBLACK);
+        canvas->drawString(compare.fSVGName, 20, 16, paint);
+        paint.setColor(compare.fSkiaColor);
+        canvas->drawRect({105, 5, 115, 15}, paint);
+        paint.setColor(SK_ColorBLACK);
+        canvas->drawString(compare.fSkiaName, 120, 16, paint);
+        paint.setStyle(SkPaint::kStroke_Style);
+        canvas->drawRect({5, 5, 15, 15}, paint);
+        canvas->drawRect({105, 5, 115, 15}, paint);
+        canvas->translate(0, 20);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Color_010.cpp b/docs/examples/Color_010.cpp
new file mode 100644
index 0000000..89458a2
--- /dev/null
+++ b/docs/examples/Color_010.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9ca1e2a5b9b4c92ecf4409d0813867d6
+REG_FIDDLE(Color_010, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<uint32_t> srcPixels;
+    constexpr int width = 256;
+    constexpr int height = 256;
+    srcPixels.resize(width * height);
+    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);
+    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());
+    pixmap.erase(SK_ColorTRANSPARENT);
+    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );
+    pixmap.erase(SK_ColorTRANSPARENT, { 48, 48, 168, 168 } );
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawBitmap(bitmap, 48, 48);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_011.cpp b/docs/examples/Color_011.cpp
new file mode 100644
index 0000000..b6ce520
--- /dev/null
+++ b/docs/examples/Color_011.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6971489f28291f08e429cc6ccc73b09b
+REG_FIDDLE(Color_011, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    std::vector<uint32_t> srcPixels;
+    constexpr int width = 256;
+    constexpr int height = 256;
+    srcPixels.resize(width * height);
+    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);
+    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());
+    pixmap.erase(SK_ColorTRANSPARENT);
+    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );
+    pixmap.erase(SK_ColorBLACK, { 48, 48, 168, 168 } );
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawBitmap(bitmap, 48, 48);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_012.cpp b/docs/examples/Color_012.cpp
new file mode 100644
index 0000000..e5e1601
--- /dev/null
+++ b/docs/examples/Color_012.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fce650f997e802d4e55edf62b8437a2d
+REG_FIDDLE(Color_012, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    std::vector<uint32_t> srcPixels;
+    constexpr int width = 256;
+    constexpr int height = 256;
+    srcPixels.resize(width * height);
+    SkImageInfo imageInfo = SkImageInfo::MakeN32Premul(width, height);
+    SkPixmap pixmap(imageInfo, &srcPixels.front(), imageInfo.minRowBytes());
+    pixmap.erase(SK_ColorTRANSPARENT);
+    pixmap.erase(SK_ColorRED, { 24, 24, 192, 192 } );
+    pixmap.erase(SK_ColorWHITE, { 48, 48, 168, 168 } );
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawBitmap(bitmap, 48, 48);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_013.cpp b/docs/examples/Color_013.cpp
new file mode 100644
index 0000000..ddc0a78
--- /dev/null
+++ b/docs/examples/Color_013.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4fb2da4a3d9b14ca4ac24eefb0f5126a
+REG_FIDDLE(Color_013, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    SkPaint bgPaint;
+    bgPaint.setColor(0xafffffff);
+    canvas->drawRect({20, 30, 110, 90}, bgPaint);
+    SkScalar hsv[3];
+    SkColor c = source.getColor(226, 128);
+    SkRGBToHSV(SkColorGetR(c), SkColorGetG(c), SkColorGetB(c), hsv);
+    canvas->drawString(("h: " + std::to_string(hsv[0]).substr(0, 6)).c_str(), 27, 45, SkPaint());
+    canvas->drawString(("s: " + std::to_string(hsv[1]).substr(0, 6)).c_str(), 27, 65, SkPaint());
+    canvas->drawString(("v: " + std::to_string(hsv[2]).substr(0, 6)).c_str(), 27, 85, SkPaint());
+    canvas->drawLine(110, 90, 226, 128, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Color_014.cpp b/docs/examples/Color_014.cpp
new file mode 100644
index 0000000..6436337
--- /dev/null
+++ b/docs/examples/Color_014.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1e0370f12c8aab5b84f9e824074f1e5a
+REG_FIDDLE(Color_014, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    for (int y = 0; y < 256; ++y) {
+       for (int x = 0; x < 256; ++x) {
+         SkScalar hsv[3];
+         SkColorToHSV(source.getColor(x, y), hsv);
+         hsv[1] = 1 - hsv[1];
+         SkPaint paint;
+         paint.setColor(SkHSVToColor(hsv));
+         canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);
+      }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_015.cpp b/docs/examples/Color_015.cpp
new file mode 100644
index 0000000..6b55948
--- /dev/null
+++ b/docs/examples/Color_015.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=311a59931ac340b90f202cd6ac399a0a
+REG_FIDDLE(Color_015, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    for (int y = 0; y < 256; ++y) {
+       for (int x = 0; x < 256; ++x) {
+         SkColor color = source.getColor(x, y);
+         SkScalar hsv[3];
+         SkColorToHSV(color, hsv);
+         hsv[0] = hsv[0] + 90 >= 360 ? hsv[0] - 270 : hsv[0] + 90;
+         SkPaint paint;
+         paint.setColor(SkHSVToColor((x + y) % 256, hsv));
+         canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);
+      }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_016.cpp b/docs/examples/Color_016.cpp
new file mode 100644
index 0000000..3df3f73
--- /dev/null
+++ b/docs/examples/Color_016.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d355a17547908cdbc2c38720974b5d11
+REG_FIDDLE(Color_016, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->drawBitmap(source, 0, 0);
+    for (int y = 0; y < 256; ++y) {
+       for (int x = 0; x < 256; ++x) {
+         SkColor color = source.getColor(x, y);
+         SkScalar hsv[3];
+         SkColorToHSV(color, hsv);
+         hsv[0] = hsv[0] + 90 >= 360 ? hsv[0] - 270 : hsv[0] + 90;
+         SkPaint paint;
+         paint.setColor(SkHSVToColor(hsv));
+         canvas->drawRect(SkRect::MakeXYWH(x, y, 1, 1), paint);
+      }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Color_017.cpp b/docs/examples/Color_017.cpp
new file mode 100644
index 0000000..6dfd7c1
--- /dev/null
+++ b/docs/examples/Color_017.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=756345484fd48ca0ea7b6cec350f73b8
+REG_FIDDLE(Color_017, 300, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPMColor premultiplied = SkPreMultiplyARGB(160, 128, 160, 192);
+    canvas->drawString("Unpremultiplied:", 20, 20, SkPaint());
+    canvas->drawString("alpha=160 red=128 green=160 blue=192", 20, 40, SkPaint());
+    canvas->drawString("Premultiplied:", 20, 80, SkPaint());
+    std::string str = "alpha=" + std::to_string(SkColorGetA(premultiplied));
+    str += " red=" + std::to_string(SkColorGetR(premultiplied));
+    str += " green=" + std::to_string(SkColorGetG(premultiplied));
+    str += " blue=" + std::to_string(SkColorGetB(premultiplied));
+    canvas->drawString(str.c_str(), 20, 100, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Color_018.cpp b/docs/examples/Color_018.cpp
new file mode 100644
index 0000000..81d0f04
--- /dev/null
+++ b/docs/examples/Color_018.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0bcc0f86a2aefc899f3500503dce6968
+REG_FIDDLE(Color_018, 300, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor unpremultiplied = SkColorSetARGB(160, 128, 160, 192);
+    SkPMColor premultiplied = SkPreMultiplyColor(unpremultiplied);
+    canvas->drawString("Unpremultiplied:", 20, 20, SkPaint());
+    std::string str = "alpha=" + std::to_string(SkColorGetA(unpremultiplied));
+    str += " red=" + std::to_string(SkColorGetR(unpremultiplied));
+    str += " green=" + std::to_string(SkColorGetG(unpremultiplied));
+    str += " blue=" + std::to_string(SkColorGetB(unpremultiplied));
+    canvas->drawString(str.c_str(), 20, 40, SkPaint());
+    canvas->drawString("Premultiplied:", 20, 80, SkPaint());
+    str = "alpha=" + std::to_string(SkColorGetA(premultiplied));
+    str += " red=" + std::to_string(SkColorGetR(premultiplied));
+    str += " green=" + std::to_string(SkColorGetG(premultiplied));
+    str += " blue=" + std::to_string(SkColorGetB(premultiplied));
+    canvas->drawString(str.c_str(), 20, 100, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Font_000.cpp b/docs/examples/Font_000.cpp
new file mode 100644
index 0000000..23e6339
--- /dev/null
+++ b/docs/examples/Font_000.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_000, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_001.cpp b/docs/examples/Font_001.cpp
new file mode 100644
index 0000000..75f1299
--- /dev/null
+++ b/docs/examples/Font_001.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_001, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_002.cpp b/docs/examples/Font_002.cpp
new file mode 100644
index 0000000..35d3eb3
--- /dev/null
+++ b/docs/examples/Font_002.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_002, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_003.cpp b/docs/examples/Font_003.cpp
new file mode 100644
index 0000000..d98e5c7
--- /dev/null
+++ b/docs/examples/Font_003.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_003, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_004.cpp b/docs/examples/Font_004.cpp
new file mode 100644
index 0000000..08f51b9
--- /dev/null
+++ b/docs/examples/Font_004.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_004, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_005.cpp b/docs/examples/Font_005.cpp
new file mode 100644
index 0000000..8ea371f
--- /dev/null
+++ b/docs/examples/Font_005.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_005, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_006.cpp b/docs/examples/Font_006.cpp
new file mode 100644
index 0000000..5e0836c
--- /dev/null
+++ b/docs/examples/Font_006.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_006, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_007.cpp b/docs/examples/Font_007.cpp
new file mode 100644
index 0000000..fa2e6d3
--- /dev/null
+++ b/docs/examples/Font_007.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_007, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_008.cpp b/docs/examples/Font_008.cpp
new file mode 100644
index 0000000..15a345a
--- /dev/null
+++ b/docs/examples/Font_008.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_008, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_009.cpp b/docs/examples/Font_009.cpp
new file mode 100644
index 0000000..bf229e0
--- /dev/null
+++ b/docs/examples/Font_009.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_009, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_010.cpp b/docs/examples/Font_010.cpp
new file mode 100644
index 0000000..c9cc4d1
--- /dev/null
+++ b/docs/examples/Font_010.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_010, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_011.cpp b/docs/examples/Font_011.cpp
new file mode 100644
index 0000000..fd367c7
--- /dev/null
+++ b/docs/examples/Font_011.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_011, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_012.cpp b/docs/examples/Font_012.cpp
new file mode 100644
index 0000000..8aac62a
--- /dev/null
+++ b/docs/examples/Font_012.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_012, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_013.cpp b/docs/examples/Font_013.cpp
new file mode 100644
index 0000000..728de64
--- /dev/null
+++ b/docs/examples/Font_013.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_013, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_014.cpp b/docs/examples/Font_014.cpp
new file mode 100644
index 0000000..82b6c04
--- /dev/null
+++ b/docs/examples/Font_014.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_014, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_015.cpp b/docs/examples/Font_015.cpp
new file mode 100644
index 0000000..25fc44f
--- /dev/null
+++ b/docs/examples/Font_015.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_015, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_016.cpp b/docs/examples/Font_016.cpp
new file mode 100644
index 0000000..4bec9cf
--- /dev/null
+++ b/docs/examples/Font_016.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_016, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_017.cpp b/docs/examples/Font_017.cpp
new file mode 100644
index 0000000..4650d73
--- /dev/null
+++ b/docs/examples/Font_017.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_017, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_018.cpp b/docs/examples/Font_018.cpp
new file mode 100644
index 0000000..7dc7049
--- /dev/null
+++ b/docs/examples/Font_018.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_018, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_019.cpp b/docs/examples/Font_019.cpp
new file mode 100644
index 0000000..e2a6f96
--- /dev/null
+++ b/docs/examples/Font_019.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_019, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_020.cpp b/docs/examples/Font_020.cpp
new file mode 100644
index 0000000..d1523f7
--- /dev/null
+++ b/docs/examples/Font_020.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_020, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_021.cpp b/docs/examples/Font_021.cpp
new file mode 100644
index 0000000..1c46e4f
--- /dev/null
+++ b/docs/examples/Font_021.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_021, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_022.cpp b/docs/examples/Font_022.cpp
new file mode 100644
index 0000000..1930dc7
--- /dev/null
+++ b/docs/examples/Font_022.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_022, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_023.cpp b/docs/examples/Font_023.cpp
new file mode 100644
index 0000000..58d2eb5
--- /dev/null
+++ b/docs/examples/Font_023.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_023, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_024.cpp b/docs/examples/Font_024.cpp
new file mode 100644
index 0000000..63e5ec7
--- /dev/null
+++ b/docs/examples/Font_024.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_024, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_025.cpp b/docs/examples/Font_025.cpp
new file mode 100644
index 0000000..a9da112
--- /dev/null
+++ b/docs/examples/Font_025.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_025, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_026.cpp b/docs/examples/Font_026.cpp
new file mode 100644
index 0000000..d5f9d47
--- /dev/null
+++ b/docs/examples/Font_026.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_026, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_027.cpp b/docs/examples/Font_027.cpp
new file mode 100644
index 0000000..7ec3e16
--- /dev/null
+++ b/docs/examples/Font_027.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_027, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_028.cpp b/docs/examples/Font_028.cpp
new file mode 100644
index 0000000..fc82a12
--- /dev/null
+++ b/docs/examples/Font_028.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_028, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_029.cpp b/docs/examples/Font_029.cpp
new file mode 100644
index 0000000..fba981a
--- /dev/null
+++ b/docs/examples/Font_029.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_029, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_030.cpp b/docs/examples/Font_030.cpp
new file mode 100644
index 0000000..ba53e69
--- /dev/null
+++ b/docs/examples/Font_030.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_030, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_031.cpp b/docs/examples/Font_031.cpp
new file mode 100644
index 0000000..d402cec
--- /dev/null
+++ b/docs/examples/Font_031.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_031, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_032.cpp b/docs/examples/Font_032.cpp
new file mode 100644
index 0000000..ba94ef2
--- /dev/null
+++ b/docs/examples/Font_032.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_032, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_033.cpp b/docs/examples/Font_033.cpp
new file mode 100644
index 0000000..8b44256
--- /dev/null
+++ b/docs/examples/Font_033.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3cad18678254526be66ef162eecd1d23
+REG_FIDDLE(Font_033, 280, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(50);
+    const char str[] = "Breakfast";
+    const int count = sizeof(str) - 1;
+    canvas->drawText(str, count, 25, 50, paint);
+    SkScalar measuredWidth;
+    SkFont font;
+    font.setSize(50);
+    int partialBytes = font.breakText(str, count, kUTF8_SkTextEncoding,
+            100, &measuredWidth);
+    canvas->drawText(str, partialBytes, 25, 100, paint);
+    canvas->drawLine(25, 60, 25 + 100, 60, paint);
+    canvas->drawLine(25, 110, 25 + measuredWidth, 110, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Font_034.cpp b/docs/examples/Font_034.cpp
new file mode 100644
index 0000000..b0b72d9
--- /dev/null
+++ b/docs/examples/Font_034.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_034, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_035.cpp b/docs/examples/Font_035.cpp
new file mode 100644
index 0000000..e6eade1
--- /dev/null
+++ b/docs/examples/Font_035.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_035, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_036.cpp b/docs/examples/Font_036.cpp
new file mode 100644
index 0000000..6b4f555
--- /dev/null
+++ b/docs/examples/Font_036.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_036, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_037.cpp b/docs/examples/Font_037.cpp
new file mode 100644
index 0000000..7c53560
--- /dev/null
+++ b/docs/examples/Font_037.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_037, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/Font_038.cpp b/docs/examples/Font_038.cpp
new file mode 100644
index 0000000..8b36d3c
--- /dev/null
+++ b/docs/examples/Font_038.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=882e8e0103048009a25cfc20400492f7
+REG_FIDDLE(Font_038, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    // incomplete
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_000.cpp b/docs/examples/IPoint_000.cpp
new file mode 100644
index 0000000..e454ad7
--- /dev/null
+++ b/docs/examples/IPoint_000.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e5cf5159525bd3140f288a95fe641fae
+REG_FIDDLE(IPoint_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint pt1 = {45, 66};
+    SkIPoint pt2 = SkIPoint::Make(45, 66);
+    SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_001.cpp b/docs/examples/IPoint_001.cpp
new file mode 100644
index 0000000..d16b2ec
--- /dev/null
+++ b/docs/examples/IPoint_001.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eed4185294f8a8216fc354e6ee6b2e3a
+REG_FIDDLE(IPoint_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint pt1 = {45, 66};
+    SkDebugf("pt1.fX %c= pt1.x()\n", pt1.fX == pt1.x() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_002.cpp b/docs/examples/IPoint_002.cpp
new file mode 100644
index 0000000..d349617
--- /dev/null
+++ b/docs/examples/IPoint_002.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=35c41b8ba7cebf8c9a7a8494e610e14d
+REG_FIDDLE(IPoint_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint pt1 = {45, 66};
+    SkDebugf("pt1.fY %c= pt1.y()\n", pt1.fY == pt1.y() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_003.cpp b/docs/examples/IPoint_003.cpp
new file mode 100644
index 0000000..cfca3be
--- /dev/null
+++ b/docs/examples/IPoint_003.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=658c1df611b4577cc7e0bb384e95737e
+REG_FIDDLE(IPoint_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint pt = { 0, -0};
+    SkDebugf("pt.isZero() == %s\n", pt.isZero() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_004.cpp b/docs/examples/IPoint_004.cpp
new file mode 100644
index 0000000..c07b31d
--- /dev/null
+++ b/docs/examples/IPoint_004.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=165418b5718d79d8f1682a8a0ee32ba0
+REG_FIDDLE(IPoint_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint pt1, pt2 = { SK_MinS32, SK_MaxS32 };
+    pt1.set(SK_MinS32, SK_MaxS32);
+    SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_005.cpp b/docs/examples/IPoint_005.cpp
new file mode 100644
index 0000000..cd4bc04
--- /dev/null
+++ b/docs/examples/IPoint_005.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b30d4780475d113a7fed3637af7f0db1
+REG_FIDDLE(IPoint_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint test[] = { {0, -0}, {-1, -2},
+                       { SK_MaxS32, SK_MinS32 },
+                       { SK_NaN32, SK_NaN32 } };
+    for (const SkIPoint& pt : test) {
+        SkIPoint negPt = -pt;
+        SkDebugf("pt: %d, %d  negate: %d, %d\n", pt.fX, pt.fY, negPt.fX, negPt.fY);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_006.cpp b/docs/examples/IPoint_006.cpp
new file mode 100644
index 0000000..e7e515b
--- /dev/null
+++ b/docs/examples/IPoint_006.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4eb2d95c9e9a66f05296e345bb68bd51
+REG_FIDDLE(IPoint_006, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {
+        for (size_t i = 0; i < count - 1; ++i) {
+            SkPoint p0, p1;
+            p0.iset(pts[i]);
+            p1.iset(pts[i + 1]);
+            canvas->drawLine(p0, p1, paint);
+        }
+    };
+    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->scale(30, 15);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+    points[1] += {1, 1};
+    points[2] += {-1, -1};
+    paint.setColor(SK_ColorRED);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_007.cpp b/docs/examples/IPoint_007.cpp
new file mode 100644
index 0000000..16963ec
--- /dev/null
+++ b/docs/examples/IPoint_007.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a01e533dc7ab34ed728dc4e7a5f1f0ee
+REG_FIDDLE(IPoint_007, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {
+        for (size_t i = 0; i < count - 1; ++i) {
+            SkPoint p0, p1;
+            p0.iset(pts[i]);
+            p1.iset(pts[i + 1]);
+            canvas->drawLine(p0, p1, paint);
+        }
+    };
+    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->scale(30, 15);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+    points[1] -= {1, 1};
+    points[2] -= {-1, -1};
+    paint.setColor(SK_ColorRED);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_008.cpp b/docs/examples/IPoint_008.cpp
new file mode 100644
index 0000000..dbecb3b
--- /dev/null
+++ b/docs/examples/IPoint_008.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=64f575d36439d5b69aaed14ffeff1cc4
+REG_FIDDLE(IPoint_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint test[] = { {0, -0}, {-1, -2}, {SK_MaxS32, -1}, {SK_NaN32, -1} };
+    for (const SkIPoint& pt : test) {
+        SkDebugf("pt: %d, %d  %c= pt\n", pt.fX, pt.fY, pt.equals(pt.fX, pt.fY) ? '=' : '!');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_009.cpp b/docs/examples/IPoint_009.cpp
new file mode 100644
index 0000000..3952135
--- /dev/null
+++ b/docs/examples/IPoint_009.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=37ffe2817d720f99e6c252332ce70460
+REG_FIDDLE(IPoint_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint test[] = { {0, -0}, {-1, -2}, {SK_MaxS32, -1}, {SK_NaN32, -1} };
+    for (const SkIPoint& pt : test) {
+        SkDebugf("pt: %d, %d  %c= pt\n", pt.fX, pt.fY, pt == pt ? '=' : '!');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_010.cpp b/docs/examples/IPoint_010.cpp
new file mode 100644
index 0000000..cfd975a
--- /dev/null
+++ b/docs/examples/IPoint_010.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dd89dc48dff69b53d99530b120f204bc
+REG_FIDDLE(IPoint_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint test[] = { {0, -0}, {-1, -2}, {SK_MaxS32, -1}, {SK_NaN32, -1} };
+    for (const SkIPoint& pt : test) {
+        SkDebugf("pt: %d, %d  %c= pt\n", pt.fX, pt.fY, pt != pt ? '!' : '=');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_011.cpp b/docs/examples/IPoint_011.cpp
new file mode 100644
index 0000000..3990bbc
--- /dev/null
+++ b/docs/examples/IPoint_011.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e626e26bf557857b824aa7d03f723e0f
+REG_FIDDLE(IPoint_011, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {
+        for (size_t i = 0; i < count - 1; ++i) {
+            SkPoint p0, p1;
+            p0.iset(pts[i]);
+            p1.iset(pts[i + 1]);
+            canvas->drawLine(p0, p1, paint);
+        }
+    };
+    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->scale(30, 15);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+    points[1] += points[0] - points[3];
+    points[2] -= points[1] - points[0];
+    paint.setColor(SK_ColorRED);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IPoint_012.cpp b/docs/examples/IPoint_012.cpp
new file mode 100644
index 0000000..7176db6
--- /dev/null
+++ b/docs/examples/IPoint_012.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=63f4cba971c6d8434595906f865b5a29
+REG_FIDDLE(IPoint_012, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto draw_lines = [=](const SkIPoint pts[], size_t count, SkPaint& paint) -> void {
+        for (size_t i = 0; i < count - 1; ++i) {
+            SkPoint p0, p1;
+            p0.iset(pts[i]);
+            p1.iset(pts[i + 1]);
+            canvas->drawLine(p0, p1, paint);
+        }
+    };
+    SkIPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 } };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->scale(30, 15);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+    SkIPoint mod = {4, 1};
+    for (auto& point : points) {
+        point = point + mod;
+        mod.fX -= 1;
+        mod.fY += 1;
+    }
+    paint.setColor(SK_ColorRED);
+    draw_lines(points, SK_ARRAY_COUNT(points), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_000.cpp b/docs/examples/IRect_000.cpp
new file mode 100644
index 0000000..6941bdc
--- /dev/null
+++ b/docs/examples/IRect_000.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0ade3971c1d2616564992e286966ec8a
+REG_FIDDLE(IRect_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = SkIRect::MakeEmpty();
+    SkDebugf("MakeEmpty isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+    rect.offset(10, 10);
+    SkDebugf("offset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+    rect.inset(10, 10);
+    SkDebugf("inset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+    rect.outset(20, 20);
+    SkDebugf("outset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_001.cpp b/docs/examples/IRect_001.cpp
new file mode 100644
index 0000000..56520ba
--- /dev/null
+++ b/docs/examples/IRect_001.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e36827a1a6ae2b1c26e7a8a08f325a07
+REG_FIDDLE(IRect_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect1 = SkIRect::MakeWH(25, 35);
+    SkIRect rect2 = SkIRect::MakeSize({25, 35});
+    SkIRect rect3 = SkIRect::MakeXYWH(0, 0, 25, 35);
+    SkIRect rect4 = SkIRect::MakeLTRB(0, 0, 25, 35);
+    SkDebugf("all %s" "equal\n", rect1 == rect2 && rect2 == rect3 && rect3 == rect4 ?
+             "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_002.cpp b/docs/examples/IRect_002.cpp
new file mode 100644
index 0000000..69b5321
--- /dev/null
+++ b/docs/examples/IRect_002.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c6586ff8d24869c780169b0d19c75df6
+REG_FIDDLE(IRect_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkSize size = {25.5f, 35.5f};
+    SkIRect rect = SkIRect::MakeSize(size.toRound());
+    SkDebugf("round width: %d  height: %d\n", rect.width(), rect.height());
+    rect = SkIRect::MakeSize(size.toFloor());
+    SkDebugf("floor width: %d  height: %d\n", rect.width(), rect.height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_003.cpp b/docs/examples/IRect_003.cpp
new file mode 100644
index 0000000..92fdaa2
--- /dev/null
+++ b/docs/examples/IRect_003.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ec1473b700c594f2df9749a12a06b89b
+REG_FIDDLE(IRect_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = SkIRect::MakeLTRB(5, 35, 15, 25);
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect.sort();
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_004.cpp b/docs/examples/IRect_004.cpp
new file mode 100644
index 0000000..72fb980
--- /dev/null
+++ b/docs/examples/IRect_004.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=598ee14350bd1d961cae6b36fa3df17e
+REG_FIDDLE(IRect_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = SkIRect::MakeXYWH(5, 35, -15, 25);
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect.sort();
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_005.cpp b/docs/examples/IRect_005.cpp
new file mode 100644
index 0000000..9cae9c5
--- /dev/null
+++ b/docs/examples/IRect_005.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=caf38ea4431bc246ba198f6a8c2b0f01
+REG_FIDDLE(IRect_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 5, 10, 25 };
+    SkDebugf("unsorted.fLeft: %d unsorted.left(): %d\n", unsorted.fLeft, unsorted.left());
+    SkIRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fLeft: %d sorted.left(): %d\n", sorted.fLeft, sorted.left());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_006.cpp b/docs/examples/IRect_006.cpp
new file mode 100644
index 0000000..c21356c
--- /dev/null
+++ b/docs/examples/IRect_006.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cbec1ae6530e95943775450b1d11f19e
+REG_FIDDLE(IRect_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fTop: %d unsorted.top(): %d\n", unsorted.fTop, unsorted.top());
+    SkIRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fTop: %d sorted.top(): %d\n", sorted.fTop, sorted.top());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_007.cpp b/docs/examples/IRect_007.cpp
new file mode 100644
index 0000000..ec10f3b
--- /dev/null
+++ b/docs/examples/IRect_007.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=97e210976f1ee0387b30c70635cf114f
+REG_FIDDLE(IRect_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fRight: %d unsorted.right(): %d\n", unsorted.fRight, unsorted.right());
+    SkIRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fRight: %d sorted.right(): %d\n", sorted.fRight, sorted.right());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_008.cpp b/docs/examples/IRect_008.cpp
new file mode 100644
index 0000000..162b2b8
--- /dev/null
+++ b/docs/examples/IRect_008.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c32afebc296054a181621648a184b8e3
+REG_FIDDLE(IRect_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fBottom: %d unsorted.bottom(): %d\n", unsorted.fBottom, unsorted.bottom());
+    SkIRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fBottom: %d sorted.bottom(): %d\n", sorted.fBottom, sorted.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_009.cpp b/docs/examples/IRect_009.cpp
new file mode 100644
index 0000000..7c46dca
--- /dev/null
+++ b/docs/examples/IRect_009.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2a59cbfd1330a0db520d6ebb2b7c68c7
+REG_FIDDLE(IRect_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 5, 10, 25 };
+    SkDebugf("unsorted.fLeft: %d unsorted.x(): %d\n", unsorted.fLeft, unsorted.x());
+    SkIRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fLeft: %d sorted.x(): %d\n", sorted.fLeft, sorted.x());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_010.cpp b/docs/examples/IRect_010.cpp
new file mode 100644
index 0000000..7962761
--- /dev/null
+++ b/docs/examples/IRect_010.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6ea461e71f7fc80605818fbf493caa63
+REG_FIDDLE(IRect_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fTop: %d unsorted.y(): %d\n", unsorted.fTop, unsorted.y());
+    SkIRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fTop: %d sorted.y(): %d\n", sorted.fTop, sorted.y());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_011.cpp b/docs/examples/IRect_011.cpp
new file mode 100644
index 0000000..4769848
--- /dev/null
+++ b/docs/examples/IRect_011.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4acfbe051805940210c8916a94794142
+REG_FIDDLE(IRect_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted width: %d\n", unsorted.width());
+    SkIRect large = { -2147483647, 1, 2147483644, 2 };
+    SkDebugf("large width: %d\n", large.width());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_012.cpp b/docs/examples/IRect_012.cpp
new file mode 100644
index 0000000..98dccee
--- /dev/null
+++ b/docs/examples/IRect_012.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=63977f97999bbd6eecfdcc7575d75492
+REG_FIDDLE(IRect_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect large = { -2147483647, 1, 2147483644, 2 };
+    SkDebugf("width: %d width64: %lld\n", large.width(), large.width64());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_013.cpp b/docs/examples/IRect_013.cpp
new file mode 100644
index 0000000..adfc509
--- /dev/null
+++ b/docs/examples/IRect_013.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0175bae87fafcd9433ae661574695586
+REG_FIDDLE(IRect_013, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect unsorted = { 15, 25, 10, 20 };
+    SkDebugf("unsorted height: %d\n", unsorted.height());
+    SkIRect large = { 1, -2147483647, 2, 2147483644 };
+    SkDebugf("large height: %d\n", large.height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_014.cpp b/docs/examples/IRect_014.cpp
new file mode 100644
index 0000000..1bf700b
--- /dev/null
+++ b/docs/examples/IRect_014.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=02dd98716e54bbd8c2f0ff23b7ef98cf
+REG_FIDDLE(IRect_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect large = { 1, -2147483647, 2, 2147483644 };
+    SkDebugf("height: %d height64: %lld\n", large.height(), large.height64());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_015.cpp b/docs/examples/IRect_015.cpp
new file mode 100644
index 0000000..d0138f5
--- /dev/null
+++ b/docs/examples/IRect_015.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b3224641cb3053a7b8a5798b6cd1cf6
+REG_FIDDLE(IRect_015, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkIRect& rect) -> void {
+        SkISize size = rect.size();
+        SkDebugf("%s ", prefix);
+        SkDebugf("rect: %d, %d, %d, %d  ", rect.left(), rect.top(), rect.right(), rect.bottom());
+        SkDebugf("size: %d, %d\n", size.width(), size.height());
+    };
+    SkIRect rect = {20, 30, 40, 50};
+    debugster("original", rect);
+    rect.offset(20, 20);
+    debugster("  offset", rect);
+    rect.outset(20, 20);
+    debugster("  outset", rect);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_016.cpp b/docs/examples/IRect_016.cpp
new file mode 100644
index 0000000..a0b5d02
--- /dev/null
+++ b/docs/examples/IRect_016.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=edaad064b6de249b7a7c768dfa000adc
+REG_FIDDLE(IRect_016, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};
+    for (auto rect : tests) {
+        SkDebugf("rect: {%d, %d, %d, %d} is" "%s empty\n", rect.left(), rect.top(), rect.right(),
+                 rect.bottom(), rect.isEmpty() ? "" : " not");
+        rect.sort();
+        SkDebugf("sorted: {%d, %d, %d, %d} is" "%s empty\n", rect.left(), rect.top(), rect.right(),
+                 rect.bottom(), rect.isEmpty() ? "" : " not");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_017.cpp b/docs/examples/IRect_017.cpp
new file mode 100644
index 0000000..a2c2a41
--- /dev/null
+++ b/docs/examples/IRect_017.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eb905faa1084ccab3ad0605df4c27ea4
+REG_FIDDLE(IRect_017, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};
+    for (auto rect : tests) {
+        SkDebugf("rect: {%d, %d, %d, %d} is" "%s empty\n", rect.left(), rect.top(), rect.right(),
+                rect.bottom(), rect.isEmpty64() ? "" : " not");
+        rect.sort();
+        SkDebugf("sorted: {%d, %d, %d, %d} is" "%s empty\n", rect.left(), rect.top(), rect.right(),
+                rect.bottom(), rect.isEmpty64() ? "" : " not");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_018.cpp b/docs/examples/IRect_018.cpp
new file mode 100644
index 0000000..2c9bd89
--- /dev/null
+++ b/docs/examples/IRect_018.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bd8f028d9051062816c9116fea4237b2
+REG_FIDDLE(IRect_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect test = {0, 0, 2, 2};
+    SkIRect sorted = test.makeSorted();
+    SkDebugf("test %c= sorted\n", test == sorted ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_019.cpp b/docs/examples/IRect_019.cpp
new file mode 100644
index 0000000..144a4b4
--- /dev/null
+++ b/docs/examples/IRect_019.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6c4acd8aa203f632b7d85cae672abf4d
+REG_FIDDLE(IRect_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect test = {2, 2, 0, 0};
+    SkIRect sorted = test.makeSorted();
+    SkDebugf("test %c= sorted\n", test != sorted ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_020.cpp b/docs/examples/IRect_020.cpp
new file mode 100644
index 0000000..a42cf95
--- /dev/null
+++ b/docs/examples/IRect_020.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=94039c3cc9e911c8ab2993d56fd06210
+REG_FIDDLE(IRect_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = {3, 4, 1, 2};
+    for (int i = 0; i < 2; ++i) {
+    SkDebugf("rect: {%d, %d, %d, %d} is %s" "empty\n", rect.fLeft, rect.fTop,
+             rect.fRight, rect.fBottom, rect.isEmpty() ? "" : "not ");
+    rect.setEmpty();
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_021.cpp b/docs/examples/IRect_021.cpp
new file mode 100644
index 0000000..094ec31
--- /dev/null
+++ b/docs/examples/IRect_021.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1912c37076b7f3bf6aebfa167e971bec
+REG_FIDDLE(IRect_021, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect1 = {3, 4, 1, 2};
+    SkDebugf("rect1: {%d, %d, %d, %d}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
+    SkIRect rect2;
+    rect2.set(3, 4, 1, 2);
+    SkDebugf("rect2: {%d, %d, %d, %d}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_022.cpp b/docs/examples/IRect_022.cpp
new file mode 100644
index 0000000..8a4a284
--- /dev/null
+++ b/docs/examples/IRect_022.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ead6bdcf2ae77ec19a1c5a96f5b31af8
+REG_FIDDLE(IRect_022, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect1 = {3, 4, 1, 2};
+    SkDebugf("rect1: {%d, %d, %d, %d}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
+    SkIRect rect2;
+    rect2.setLTRB(3, 4, 1, 2);
+    SkDebugf("rect2: {%d, %d, %d, %d}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_023.cpp b/docs/examples/IRect_023.cpp
new file mode 100644
index 0000000..5ab3100
--- /dev/null
+++ b/docs/examples/IRect_023.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0e1db8c86678c004e504f47641b44b17
+REG_FIDDLE(IRect_023, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect;
+    rect.setXYWH(5, 35, -15, 25);
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect.sort();
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_024.cpp b/docs/examples/IRect_024.cpp
new file mode 100644
index 0000000..6faab14
--- /dev/null
+++ b/docs/examples/IRect_024.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=737c747df07ddf392c05970440de0927
+REG_FIDDLE(IRect_024, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 50, 20, 60 };
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect = rect.makeOffset(15, 32);
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_025.cpp b/docs/examples/IRect_025.cpp
new file mode 100644
index 0000000..07c19be
--- /dev/null
+++ b/docs/examples/IRect_025.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1db94b2c76e0a7a71856532335fa56b6
+REG_FIDDLE(IRect_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 50, 20, 60 };
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect = rect.makeInset(15, 32);
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_026.cpp b/docs/examples/IRect_026.cpp
new file mode 100644
index 0000000..09d1e6c
--- /dev/null
+++ b/docs/examples/IRect_026.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=240e2953e3455c08f6d89255feff8416
+REG_FIDDLE(IRect_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 50, 20, 60 };
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect = rect.makeOutset(15, 32);
+    SkDebugf("rect: %d, %d, %d, %d  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_027.cpp b/docs/examples/IRect_027.cpp
new file mode 100644
index 0000000..cfb1e94
--- /dev/null
+++ b/docs/examples/IRect_027.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=77e633b2174ffae923c038b303418b50
+REG_FIDDLE(IRect_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 14, 50, 73 };
+    rect.offset(5, 13);
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_028.cpp b/docs/examples/IRect_028.cpp
new file mode 100644
index 0000000..202ef37
--- /dev/null
+++ b/docs/examples/IRect_028.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=31a4c575499e76def651eb65994876f0
+REG_FIDDLE(IRect_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 14, 50, 73 };
+    rect.offset({5, 13});
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_029.cpp b/docs/examples/IRect_029.cpp
new file mode 100644
index 0000000..1e7777b
--- /dev/null
+++ b/docs/examples/IRect_029.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a2734ff23b35653956a3002e5c29ff91
+REG_FIDDLE(IRect_029, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 14, 50, 73 };
+    rect.offsetTo(15, 27);
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_030.cpp b/docs/examples/IRect_030.cpp
new file mode 100644
index 0000000..4c0cbca
--- /dev/null
+++ b/docs/examples/IRect_030.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9debaded1aa8bdf5077a4de0b3015b8f
+REG_FIDDLE(IRect_030, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 14, 50, 73 };
+    rect.inset(5, 13);
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_031.cpp b/docs/examples/IRect_031.cpp
new file mode 100644
index 0000000..bd4d7f7
--- /dev/null
+++ b/docs/examples/IRect_031.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3fc62ca29428195f33a3a02b3eb74e4f
+REG_FIDDLE(IRect_031, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 14, 50, 73 };
+    rect.outset(5, 13);
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_032.cpp b/docs/examples/IRect_032.cpp
new file mode 100644
index 0000000..c086571
--- /dev/null
+++ b/docs/examples/IRect_032.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8dc91284493dd012cca3d0ce4c66bda4
+REG_FIDDLE(IRect_032, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 8, 11, 19, 22 };
+    rect.adjust(2, -1, 1, -2);
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_033.cpp b/docs/examples/IRect_033.cpp
new file mode 100644
index 0000000..13b17d1
--- /dev/null
+++ b/docs/examples/IRect_033.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a7958a4e0668f5cf805a8e78eb57f51d
+REG_FIDDLE(IRect_033, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 40, 60 };
+    SkIPoint pts[] = { { 30, 50}, { 40, 50}, { 30, 60} };
+    for (auto pt : pts) {
+        SkDebugf("rect: (%d, %d, %d, %d) %s (%d, %d)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 rect.contains(pt.x(), pt.y()) ? "contains" : "does not contain", pt.x(), pt.y());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_034.cpp b/docs/examples/IRect_034.cpp
new file mode 100644
index 0000000..794d4b3
--- /dev/null
+++ b/docs/examples/IRect_034.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eae55f284818d9965ec5834747d14a48
+REG_FIDDLE(IRect_034, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 40, 60 };
+    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
+    for (auto contained : tests) {
+        bool success = rect.contains(
+                       contained.left(), contained.top(), contained.right(), contained.bottom());
+        SkDebugf("rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 success ? "contains" : "does not contain",
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_035.cpp b/docs/examples/IRect_035.cpp
new file mode 100644
index 0000000..0c4cb4f
--- /dev/null
+++ b/docs/examples/IRect_035.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ee0185db622602b4eb19583c2f42c734
+REG_FIDDLE(IRect_035, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 40, 60 };
+    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
+    for (auto contained : tests) {
+        SkDebugf("rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 rect.contains(contained) ? "contains" : "does not contain",
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_036.cpp b/docs/examples/IRect_036.cpp
new file mode 100644
index 0000000..64cc462
--- /dev/null
+++ b/docs/examples/IRect_036.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=acbd79ffb304f332e4b38ef18e19663e
+REG_FIDDLE(IRect_036, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 40, 60 };
+    SkRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
+    for (auto contained : tests) {
+        SkDebugf("rect: (%d, %d, %d, %d) %s (%g, %g, %g, %g)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 rect.contains(contained) ? "contains" : "does not contain",
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_037.cpp b/docs/examples/IRect_037.cpp
new file mode 100644
index 0000000..cb6ab2f
--- /dev/null
+++ b/docs/examples/IRect_037.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fef2a36bee224e92500199fa9d3cbb8b
+REG_FIDDLE(IRect_037, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 40, 60 };
+    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
+    for (auto contained : tests) {
+        bool success = rect.containsNoEmptyCheck(
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+        SkDebugf("rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 success ? "contains" : "does not contain",
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_038.cpp b/docs/examples/IRect_038.cpp
new file mode 100644
index 0000000..4faaf27
--- /dev/null
+++ b/docs/examples/IRect_038.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8f91f58001d9c10420eb146fbc169af4
+REG_FIDDLE(IRect_038, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 40, 60 };
+    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
+    for (auto contained : tests) {
+        SkDebugf("rect: (%d, %d, %d, %d) %s (%d, %d, %d, %d)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 rect.containsNoEmptyCheck(contained) ? "contains" : "does not contain",
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_039.cpp b/docs/examples/IRect_039.cpp
new file mode 100644
index 0000000..29a7d16
--- /dev/null
+++ b/docs/examples/IRect_039.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ea233f5d5d1ae0e76fc6f2eb371c927a
+REG_FIDDLE(IRect_039, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect leftRect =  { 10, 40, 50, 80 };
+    SkIRect rightRect = { 30, 60, 70, 90 };
+    SkDebugf("%s intersection: ", leftRect.intersect(rightRect) ? "" : "no ");
+    SkDebugf("%d, %d, %d, %d\n", leftRect.left(), leftRect.top(),
+                                 leftRect.right(), leftRect.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_040.cpp b/docs/examples/IRect_040.cpp
new file mode 100644
index 0000000..f65c06a
--- /dev/null
+++ b/docs/examples/IRect_040.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b2db0573aacf99ca52776c5522459d02
+REG_FIDDLE(IRect_040, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect result;
+    bool intersected = result.intersect({ 10, 40, 50, 80 }, { 30, 60, 70, 90 });
+    SkDebugf("%s intersection: %d, %d, %d, %d\n", intersected ? "" : "no ",
+             result.left(), result.top(), result.right(), result.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_041.cpp b/docs/examples/IRect_041.cpp
new file mode 100644
index 0000000..901d569
--- /dev/null
+++ b/docs/examples/IRect_041.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d35fbc9fdea71df8b8a12fd3da50d11c
+REG_FIDDLE(IRect_041, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect result;
+    if (result.intersectNoEmptyCheck({ 10, 40, 50, 80 }, { 30, 60, 70, 90 })) {
+        SkDebugf("intersection: %d, %d, %d, %d\n",
+                 result.left(), result.top(), result.right(), result.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_042.cpp b/docs/examples/IRect_042.cpp
new file mode 100644
index 0000000..609964e
--- /dev/null
+++ b/docs/examples/IRect_042.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=200422990eded2f754ab9893118f2645
+REG_FIDDLE(IRect_042, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect leftRect =  { 10, 40, 50, 80 };
+    SkDebugf("%s intersection: ", leftRect.intersect(30, 60, 70, 90) ? "" : "no ");
+    SkDebugf("%d, %d, %d, %d\n", leftRect.left(), leftRect.top(),
+                                 leftRect.right(), leftRect.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_043.cpp b/docs/examples/IRect_043.cpp
new file mode 100644
index 0000000..299df66
--- /dev/null
+++ b/docs/examples/IRect_043.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0c67cf8981389efc7108369fb9b7976b
+REG_FIDDLE(IRect_043, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("%s intersection", SkIRect::Intersects({10, 40, 50, 80}, {30, 60, 70, 90}) ? "" : "no ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_044.cpp b/docs/examples/IRect_044.cpp
new file mode 100644
index 0000000..5aafdd3
--- /dev/null
+++ b/docs/examples/IRect_044.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dba234d15162fb5b26e1a96529ca6a2a
+REG_FIDDLE(IRect_044, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("%s intersection", SkIRect::IntersectsNoEmptyCheck(
+            {10, 40, 50, 80}, {30, 60, 70, 90}) ? "" : "no ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_045.cpp b/docs/examples/IRect_045.cpp
new file mode 100644
index 0000000..0d1ea1f
--- /dev/null
+++ b/docs/examples/IRect_045.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c00ef06289d21db70340e465690e0e08
+REG_FIDDLE(IRect_045, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 20, 15, 25};
+    rect.join(50, 60, 55, 65);
+    SkDebugf("join: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_046.cpp b/docs/examples/IRect_046.cpp
new file mode 100644
index 0000000..55e03c0
--- /dev/null
+++ b/docs/examples/IRect_046.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=75fd81c1d3512e63890d085593018876
+REG_FIDDLE(IRect_046, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 10, 20, 15, 25};
+    rect.join({50, 60, 55, 65});
+    SkDebugf("join: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_047.cpp b/docs/examples/IRect_047.cpp
new file mode 100644
index 0000000..a5892ab
--- /dev/null
+++ b/docs/examples/IRect_047.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fa12547fcfd4c1aef3db1a1f6aae0fe4
+REG_FIDDLE(IRect_047, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 20, 10 };
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    rect.sort();
+    SkDebugf("sorted: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_048.cpp b/docs/examples/IRect_048.cpp
new file mode 100644
index 0000000..69633de
--- /dev/null
+++ b/docs/examples/IRect_048.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=de89926c374aa16427916900b89a3441
+REG_FIDDLE(IRect_048, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rect = { 30, 50, 20, 10 };
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    SkIRect sort = rect.makeSorted();
+    SkDebugf("sorted: %d, %d, %d, %d\n", sort.fLeft, sort.fTop, sort.fRight, sort.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/IRect_049.cpp b/docs/examples/IRect_049.cpp
new file mode 100644
index 0000000..14f1917
--- /dev/null
+++ b/docs/examples/IRect_049.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=65e0b9b52e907902630577941fb3ed6d
+REG_FIDDLE(IRect_049, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const SkIRect& rect = SkIRect::EmptyIRect();
+    SkDebugf("rect: %d, %d, %d, %d\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_000.cpp b/docs/examples/ImageInfo_000.cpp
new file mode 100644
index 0000000..9591910
--- /dev/null
+++ b/docs/examples/ImageInfo_000.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=79146a1a41d58d22582fdc567c6ffe4e
+REG_FIDDLE(ImageInfo_000, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPMColor color = SkPreMultiplyARGB(255, 50, 100, 150);
+    SkString s;
+    s.printf("%u %u %u %u", SkColorGetA(color), SkColorGetR(color),
+                            SkColorGetG(color), SkColorGetB(color));
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString(s, 10, 62, paint);
+    canvas->scale(50, 50);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kOpaque_SkAlphaType);
+    if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_001.cpp b/docs/examples/ImageInfo_001.cpp
new file mode 100644
index 0000000..9b63150
--- /dev/null
+++ b/docs/examples/ImageInfo_001.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ad696b39c915803d566e96896ec3a36c
+REG_FIDDLE(ImageInfo_001, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPMColor color = SkPreMultiplyARGB(150, 50, 100, 150);
+    SkString s;
+    s.printf("%u %u %u %u", SkColorGetA(color), SkColorGetR(color),
+                            SkColorGetG(color), SkColorGetB(color));
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString(s, 10, 62, paint);
+    canvas->scale(50, 50);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kPremul_SkAlphaType);
+    if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_002.cpp b/docs/examples/ImageInfo_002.cpp
new file mode 100644
index 0000000..c80bb14
--- /dev/null
+++ b/docs/examples/ImageInfo_002.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b8216a9e5ff5bc61a0e46eba7d36307b
+REG_FIDDLE(ImageInfo_002, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkColor color = SkColorSetARGB(150, 50, 100, 255);
+    SkString s;
+    s.printf("%u %u %u %u", SkColorGetA(color), SkColorGetR(color),
+                            SkColorGetG(color), SkColorGetB(color));
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString(s, 10, 62, paint);
+    canvas->scale(50, 50);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(1, 1, kN32_SkColorType, kUnpremul_SkAlphaType);
+    if (bitmap.installPixels(imageInfo, (void*) &color, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_003.cpp b/docs/examples/ImageInfo_003.cpp
new file mode 100644
index 0000000..b530ca2
--- /dev/null
+++ b/docs/examples/ImageInfo_003.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=21ae21e4ce53d2018e042dd457997300
+REG_FIDDLE(ImageInfo_003, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kAlpha_8_SkColorType, kOpaque_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    SkPaint orangePaint;
+    orangePaint.setARGB(0xFF, 0xFF, 0xA5, 0x00);
+    canvas->drawBitmap(bitmap, 0, 0, &orangePaint);
+    uint8_t alpha8[] = { 0xFF, 0xBB, 0x77, 0x33 };
+    SkPixmap alphaPixmap(imageInfo, &alpha8, imageInfo.minRowBytes());
+    if (bitmap.writePixels(alphaPixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 2, 2, &orangePaint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_004.cpp b/docs/examples/ImageInfo_004.cpp
new file mode 100644
index 0000000..58e263d
--- /dev/null
+++ b/docs/examples/ImageInfo_004.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7e7c46bb4572e21e13529ff364eb0a9c
+REG_FIDDLE(ImageInfo_004, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_565_SkColorType, kOpaque_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto pack565 = [](unsigned r, unsigned g, unsigned b) -> uint16_t {
+        return (b << 0) | (g << 5) | (r << 11);
+    };
+    uint16_t red565[] =  { pack565(0x1F, 0x00, 0x00), pack565(0x17, 0x00, 0x00),
+                           pack565(0x0F, 0x00, 0x00), pack565(0x07, 0x00, 0x00) };
+    uint16_t blue565[] = { pack565(0x00, 0x00, 0x1F), pack565(0x00, 0x00, 0x17),
+                           pack565(0x00, 0x00, 0x0F), pack565(0x00, 0x00, 0x07) };
+    SkPixmap redPixmap(imageInfo, &red565, imageInfo.minRowBytes());
+    if (bitmap.writePixels(redPixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    SkPixmap bluePixmap(imageInfo, &blue565, imageInfo.minRowBytes());
+    if (bitmap.writePixels(bluePixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_005.cpp b/docs/examples/ImageInfo_005.cpp
new file mode 100644
index 0000000..4278eaf
--- /dev/null
+++ b/docs/examples/ImageInfo_005.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=33a360c3404ac21db801943336843d8e
+REG_FIDDLE(ImageInfo_005, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto pack4444 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint16_t {
+        return (a << 0) | (b << 4) | (g << 8) | (r << 12);
+    };
+    uint16_t red4444[] =  { pack4444(0xF, 0xF, 0x0, 0x0), pack4444(0xF, 0xb, 0x0, 0x0),
+                            pack4444(0xF, 0x7, 0x0, 0x0), pack4444(0xF, 0x3, 0x0, 0x0) };
+    uint16_t blue4444[] = { pack4444(0xF, 0x0, 0x0, 0xF), pack4444(0xF, 0x0, 0x0, 0xb),
+                            pack4444(0xF, 0x0, 0x0, 0x7), pack4444(0xF, 0x0, 0x0, 0x3) };
+    SkPixmap redPixmap(imageInfo, &red4444, imageInfo.minRowBytes());
+    if (bitmap.writePixels(redPixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    SkPixmap bluePixmap(imageInfo, &blue4444, imageInfo.minRowBytes());
+    if (bitmap.writePixels(bluePixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_006.cpp b/docs/examples/ImageInfo_006.cpp
new file mode 100644
index 0000000..740b9a1
--- /dev/null
+++ b/docs/examples/ImageInfo_006.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=947922a19d59893fe7f9d9ee1954379b
+REG_FIDDLE(ImageInfo_006, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto pack8888 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint32_t {
+        return (r << 0) | (g << 8) | (b << 16) | (a << 24);
+    };
+    uint32_t red8888[] = { pack8888(0xFF, 0xFF, 0x0, 0x0), pack8888(0xFF, 0xbb, 0x0, 0x0),
+                           pack8888(0xFF, 0x77, 0x0, 0x0), pack8888(0xFF, 0x33, 0x0, 0x0) };
+    uint32_t blue8888[] = { pack8888(0xFF, 0x0, 0x0, 0x0FF), pack8888(0xFF, 0x0, 0x0, 0x0bb),
+                            pack8888(0xFF, 0x0, 0x0, 0x077), pack8888(0xFF, 0x0, 0x0, 0x033) };
+    SkPixmap redPixmap(imageInfo, &red8888, imageInfo.minRowBytes());
+    if (bitmap.writePixels(redPixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    SkPixmap bluePixmap(imageInfo, &blue8888, imageInfo.minRowBytes());
+    if (bitmap.writePixels(bluePixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_007.cpp b/docs/examples/ImageInfo_007.cpp
new file mode 100644
index 0000000..dd21616
--- /dev/null
+++ b/docs/examples/ImageInfo_007.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4260d6cc15db2c60c07f6fdc8d9ae425
+REG_FIDDLE(ImageInfo_007, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_888x_SkColorType, kOpaque_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto pack888 = [](unsigned r, unsigned g, unsigned b) -> uint32_t {
+        return (r << 0) | (g << 8) | (b << 16);
+    };
+    uint32_t red888[] =  { pack888(0xFF, 0x00, 0x00), pack888(0xbb, 0x00, 0x00),
+        pack888(0x77, 0x00, 0x00), pack888(0x33, 0x00, 0x00) };
+    uint32_t blue888[] = { pack888(0x00, 0x00, 0xFF), pack888(0x00, 0x00, 0xbb),
+        pack888(0x00, 0x00, 0x77), pack888(0x00, 0x00, 0x33) };
+    if (bitmap.installPixels(imageInfo, (void*) red888, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    if (bitmap.installPixels(imageInfo, (void*) blue888, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_008.cpp b/docs/examples/ImageInfo_008.cpp
new file mode 100644
index 0000000..f8a6b58
--- /dev/null
+++ b/docs/examples/ImageInfo_008.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=945ce5344fce5470f8604b2e06e9f9ae
+REG_FIDDLE(ImageInfo_008, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto pack8888 = [](unsigned a, unsigned r, unsigned g, unsigned b) -> uint32_t {
+        return (b << 0) | (g << 8) | (r << 16) | (a << 24);
+    };
+    uint32_t red8888[] = { pack8888(0xFF, 0xFF, 0x0, 0x0), pack8888(0xFF, 0xbb, 0x0, 0x0),
+                           pack8888(0xFF, 0x99, 0x0, 0x0), pack8888(0xFF, 0x55, 0x0, 0x0) };
+    uint32_t blue8888[] = { pack8888(0xFF, 0x0, 0x0, 0x0FF), pack8888(0xFF, 0x0, 0x0, 0x0bb),
+                            pack8888(0xFF, 0x0, 0x0, 0x099), pack8888(0xFF, 0x0, 0x0, 0x055) };
+    SkPixmap redPixmap(imageInfo, &red8888, imageInfo.minRowBytes());
+    if (bitmap.writePixels(redPixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    SkPixmap bluePixmap(imageInfo, &blue8888, imageInfo.minRowBytes());
+    if (bitmap.writePixels(bluePixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_009.cpp b/docs/examples/ImageInfo_009.cpp
new file mode 100644
index 0000000..e36509f
--- /dev/null
+++ b/docs/examples/ImageInfo_009.cpp
@@ -0,0 +1,33 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1282dc1127ce1b0061544619ae4de0f0
+REG_FIDDLE(ImageInfo_009, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_1010102_SkColorType, kOpaque_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto pack1010102 = [](unsigned r, unsigned g, unsigned b, unsigned a) -> uint32_t {
+        return (r << 0) | (g << 10) | (b << 20) | (a << 30);
+    };
+    uint32_t redBits[] =  { pack1010102(0x3FF, 0x000, 0x000, 0x3),
+                            pack1010102(0x2ff, 0x000, 0x000, 0x3),
+                            pack1010102(0x1ff, 0x000, 0x000, 0x3),
+                            pack1010102(0x0ff, 0x000, 0x000, 0x3) };
+    uint32_t blueBits[] = { pack1010102(0x000, 0x000, 0x3FF, 0x3),
+                            pack1010102(0x000, 0x000, 0x2ff, 0x3),
+                            pack1010102(0x000, 0x000, 0x1ff, 0x3),
+                            pack1010102(0x000, 0x000, 0x0ff, 0x3) };
+    if (bitmap.installPixels(imageInfo, (void*) redBits, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    SkPixmap bluePixmap(imageInfo, &blueBits, imageInfo.minRowBytes());
+    if (bitmap.installPixels(imageInfo, (void*) blueBits, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_010.cpp b/docs/examples/ImageInfo_010.cpp
new file mode 100644
index 0000000..fbcc19a
--- /dev/null
+++ b/docs/examples/ImageInfo_010.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=92f81aa0459230459600a01e79ccff29
+REG_FIDDLE(ImageInfo_010, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGB_101010x_SkColorType, kOpaque_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto pack101010x = [](unsigned r, unsigned g, unsigned b) -> uint32_t {
+        return (r << 0) | (g << 10) | (b << 20);
+    };
+    uint32_t redBits[] =  { pack101010x(0x3FF, 0x000, 0x000), pack101010x(0x2ff, 0x000, 0x000),
+    pack101010x(0x1ff, 0x000, 0x000), pack101010x(0x0ff, 0x000, 0x000) };
+    uint32_t blueBits[] = { pack101010x(0x000, 0x000, 0x3FF), pack101010x(0x000, 0x000, 0x2ff),
+    pack101010x(0x000, 0x000, 0x1ff), pack101010x(0x000, 0x000, 0x0ff) };
+    if (bitmap.installPixels(imageInfo, (void*) redBits, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    SkPixmap bluePixmap(imageInfo, &blueBits, imageInfo.minRowBytes());
+    if (bitmap.installPixels(imageInfo, (void*) blueBits, imageInfo.minRowBytes())) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_011.cpp b/docs/examples/ImageInfo_011.cpp
new file mode 100644
index 0000000..0d54ca4
--- /dev/null
+++ b/docs/examples/ImageInfo_011.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=93da0eb0b6722a4f33dc7dae094abf0b
+REG_FIDDLE(ImageInfo_011, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    uint8_t gray8[] = { 0xFF, 0xBB, 0x77, 0x33 };
+    SkPixmap grayPixmap(imageInfo, &gray8, imageInfo.minRowBytes());
+    if (bitmap.writePixels(grayPixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_012.cpp b/docs/examples/ImageInfo_012.cpp
new file mode 100644
index 0000000..0ab5ee3
--- /dev/null
+++ b/docs/examples/ImageInfo_012.cpp
@@ -0,0 +1,52 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dd81527bbdf5eaae7dd21ac04ab84f9e
+REG_FIDDLE(ImageInfo_012, 256, 96, false, 0) {
+union FloatUIntUnion {
+    uint32_t fUInt;
+    float    fFloat;
+};
+uint16_t FloatToHalf(float f) {
+    static const FloatUIntUnion magic = { 15 << 23 };
+    static const uint32_t round_mask = ~0xfffu;
+    FloatUIntUnion floatUnion;
+    floatUnion.fFloat = f;
+    uint32_t sign = floatUnion.fUInt & 0x80000000u;
+    floatUnion.fUInt ^= sign;
+    floatUnion.fUInt &= round_mask;
+    floatUnion.fFloat *= magic.fFloat;
+    floatUnion.fUInt -= round_mask;
+    return (floatUnion.fUInt >> 13) | (sign >> 16);
+}
+
+void draw(SkCanvas* canvas) {
+    canvas->scale(16, 16);
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(2, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
+    bitmap.allocPixels(imageInfo);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorGREEN);
+    canvas->drawBitmap(bitmap, 0, 0);
+    auto H = [](float c) -> uint16_t {
+        return FloatToHalf(c);
+    };
+                             //     R        G        B        A
+    uint16_t red_f16[][4] =  { { H(1.0), H(0.0), H(0.0), H(1.0) },
+                               { H(.75), H(0.0), H(0.0), H(1.0) },
+                               { H(.50), H(0.0), H(0.0), H(1.0) },
+                               { H(.25), H(0.0), H(0.0), H(1.0) } };
+    uint16_t blue_f16[][4] = { { H(0.0), H(0.0), H(1.0), H(1.0) },
+                               { H(0.0), H(0.0), H(.75), H(1.0) },
+                               { H(0.0), H(0.0), H(.50), H(1.0) },
+                               { H(0.0), H(0.0), H(.25), H(1.0) } };
+    SkPixmap redPixmap(imageInfo, red_f16, imageInfo.minRowBytes());
+    if (bitmap.writePixels(redPixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 2, 2);
+    }
+    SkPixmap bluePixmap(imageInfo, blue_f16, imageInfo.minRowBytes());
+    if (bitmap.writePixels(bluePixmap, 0, 0)) {
+        canvas->drawBitmap(bitmap, 4, 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_013.cpp b/docs/examples/ImageInfo_013.cpp
new file mode 100644
index 0000000..88c2c26
--- /dev/null
+++ b/docs/examples/ImageInfo_013.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=09ef49d07cb7005ba3e34d5ea53896f5
+REG_FIDDLE(ImageInfo_013, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                             "RGBA_F16" };
+    SkPaint paint;
+    SkFont font(SkTypeface::MakeFromName("monospace", SkFontStyle()), 10);
+    int y = 15;
+    canvas->drawString("    colorType  bytes", 10, y, font, paint);
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        int result = SkColorTypeBytesPerPixel(colorType);
+        SkString string;
+        string.printf("%13s %4d", colors[(int) colorType], result);
+        canvas->drawString(string, 10, y += 14, font, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_014.cpp b/docs/examples/ImageInfo_014.cpp
new file mode 100644
index 0000000..b77f235
--- /dev/null
+++ b/docs/examples/ImageInfo_014.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9b3eb5aaa0dfea9feee54e7650fa5446
+REG_FIDDLE(ImageInfo_014, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                             "RGBA_F16" };
+    SkPaint paint;
+    SkFont font(SkTypeface::MakeFromName("monospace", SkFontStyle()), 10);
+    int y = 15;
+    canvas->drawString("    colorType  bytes", 10, y, font, paint);
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        bool result = SkColorTypeIsAlwaysOpaque(colorType);
+        SkString string;
+        string.printf("%13s %6s", colors[(int) colorType], result ? "true" : "false");
+        canvas->drawString(string, 10, y += 14, font, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_015.cpp b/docs/examples/ImageInfo_015.cpp
new file mode 100644
index 0000000..9048824
--- /dev/null
+++ b/docs/examples/ImageInfo_015.cpp
@@ -0,0 +1,34 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=befac1c29ed21507d367e4d824383a04
+REG_FIDDLE(ImageInfo_015, 256, 640, false, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                             "RGBA_F16" };
+    const char* alphas[] = {"Unknown ", "Opaque  ", "Premul  ", "Unpremul"};
+    SkAlphaType alphaTypes[] = { kUnknown_SkAlphaType, kOpaque_SkAlphaType, kPremul_SkAlphaType,
+    kUnpremul_SkAlphaType
+                               };
+    SkPaint paint;
+    SkFont font(SkTypeface::MakeFromName("monospace", SkFontStyle()), 10);
+    int y = 15;
+    canvas->drawString("   colorType   alphaType  canonical", 10, y, font, paint);
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        for (SkAlphaType alphaType : alphaTypes) {
+            SkAlphaType canonicalAlphaType  = kUnknown_SkAlphaType;
+            bool result = SkColorTypeValidateAlphaType(colorType, alphaType, &canonicalAlphaType);
+            SkString string;
+            string.printf("%13s %10s %10s", colors[(int) colorType], alphas[(int) alphaType],
+                     result ? alphas[(int) canonicalAlphaType] : "------  ");
+            canvas->drawString(string, 10, y += 14, font, paint);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_016.cpp b/docs/examples/ImageInfo_016.cpp
new file mode 100644
index 0000000..b26855c
--- /dev/null
+++ b/docs/examples/ImageInfo_016.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f206f698e7a8db3d84334c26b1a702dc
+REG_FIDDLE(ImageInfo_016, 256, 32, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo imageInfo;
+    size_t rowBytes;
+    SkIPoint origin;
+    (void) canvas->accessTopLayerPixels(&imageInfo, &rowBytes, &origin);
+    const char* alphaType[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
+    SkString string;
+    string.printf("k%s_SkAlphaType", alphaType[(int) imageInfo.alphaType()]);
+    SkPaint paint;
+    canvas->drawString(string, 20, 20, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_017.cpp b/docs/examples/ImageInfo_017.cpp
new file mode 100644
index 0000000..6f19b5e
--- /dev/null
+++ b/docs/examples/ImageInfo_017.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9f47f9c2a99473f5b1113db48096d586
+REG_FIDDLE(ImageInfo_017, 256, 48, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
+                            { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
+                            { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
+                            { 0x90, 0x81, 0xC5, 0x71, 0x33 },
+                            { 0x75, 0x55, 0x44, 0x40, 0x30 }};
+    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->scale(8, 8);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_018.cpp b/docs/examples/ImageInfo_018.cpp
new file mode 100644
index 0000000..c6f081a
--- /dev/null
+++ b/docs/examples/ImageInfo_018.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=78cea0c4cac205b61ad6f6c982cbd888
+REG_FIDDLE(ImageInfo_018, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32(16, 16, kPremul_SkAlphaType));
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorWHITE);
+    SkPaint paint;
+    offscreen.drawString("g", 0, 10, paint);
+    canvas->scale(8, 8);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_019.cpp b/docs/examples/ImageInfo_019.cpp
new file mode 100644
index 0000000..fe4e74e
--- /dev/null
+++ b/docs/examples/ImageInfo_019.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=de418ccb42471d1589508ef3955f8c53
+REG_FIDDLE(ImageInfo_019, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    const int width = 256;
+    const int height = 32;
+    SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
+    SkColor  gradColors[] = { 0xFFAA0055, 0xFF11CC88 };
+    SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 } };
+    SkPaint gradPaint;
+    gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
+                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType));
+    SkCanvas offScreen(bitmap);
+    offScreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
+    canvas->drawBitmap(bitmap, 0, 0);
+    bitmap.allocPixels(SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType));
+    SkCanvas sRGBOffscreen(bitmap);
+    sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
+    canvas->drawBitmap(bitmap, 0, 48);
+    SkBitmap noColorSpaceBitmap;
+    noColorSpaceBitmap.setInfo(SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType));
+    noColorSpaceBitmap.setPixels(bitmap.getAddr(0, 0));
+    canvas->drawBitmap(noColorSpaceBitmap, 0, 96);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_020.cpp b/docs/examples/ImageInfo_020.cpp
new file mode 100644
index 0000000..87c6f76
--- /dev/null
+++ b/docs/examples/ImageInfo_020.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=525650a67e19fdd8ca9f72b7eda65174
+REG_FIDDLE(ImageInfo_020, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(18, 18));
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorWHITE);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(15);
+    offscreen.drawString("\xF0\x9F\x98\xB8", 1, 15, paint);
+    canvas->scale(6, 6);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_021.cpp b/docs/examples/ImageInfo_021.cpp
new file mode 100644
index 0000000..f16bf20
--- /dev/null
+++ b/docs/examples/ImageInfo_021.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b9026d7f39029756bd7cab9542c64f4e
+REG_FIDDLE(ImageInfo_021, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul({18, 18}));
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorWHITE);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(15);
+    offscreen.drawString("\xF0\x9F\x98\xB9", 1, 15, paint);
+    canvas->scale(6, 6);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_022.cpp b/docs/examples/ImageInfo_022.cpp
new file mode 100644
index 0000000..1d6e025
--- /dev/null
+++ b/docs/examples/ImageInfo_022.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=547388991687b8e10d482d8b1c82777d
+REG_FIDDLE(ImageInfo_022, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t pixels[][8] = { { 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00},
+                            { 0x00, 0x7f, 0xff, 0x3f, 0x3f, 0x7f, 0x3f, 0x00},
+                            { 0x3f, 0xff, 0x7f, 0x00, 0x7f, 0xff, 0x7f, 0x00},
+                            { 0x00, 0x3f, 0x00, 0x00, 0x3f, 0x7f, 0x3f, 0x00},
+                            { 0x3f, 0x7f, 0x7f, 0x3f, 0x00, 0x00, 0x00, 0x00},
+                            { 0x7f, 0xff, 0xff, 0x7f, 0x00, 0x3f, 0x7f, 0x3f},
+                            { 0x7f, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0xff, 0x7f},
+                            { 0x3f, 0x7f, 0x7f, 0x3f, 0x00, 0x3f, 0x7f, 0x3f} };
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeA8(8, 8),
+            (void*) pixels, sizeof(pixels[0]));
+    SkPaint paint;
+    canvas->scale(4, 4);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xFF007F00} ) {
+        paint.setColor(color);
+        canvas->drawBitmap(bitmap, 0, 0, &paint);
+        canvas->translate(12, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_023.cpp b/docs/examples/ImageInfo_023.cpp
new file mode 100644
index 0000000..8d3cc5c
--- /dev/null
+++ b/docs/examples/ImageInfo_023.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=75f13a78b28b08c72baf32b7d868de1c
+REG_FIDDLE(ImageInfo_023, 384, 32, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info;  // default constructor
+    SkString string;
+    string.printf("SkImageInfo() %c= SkImageInfo::MakeUnknown(0, 0)",
+                  info == SkImageInfo::MakeUnknown(0, 0) ? '=' : '!');
+    SkPaint paint;
+    canvas->drawString(string, 0, 12, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_024.cpp b/docs/examples/ImageInfo_024.cpp
new file mode 100644
index 0000000..1eb2b66
--- /dev/null
+++ b/docs/examples/ImageInfo_024.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a1af7696ae0cdd6f379546dd1f211b7a
+REG_FIDDLE(ImageInfo_024, 384, 32, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info;  // default constructor
+    SkString string;
+    string.printf("SkImageInfo() %c= SkImageInfo::MakeUnknown()",
+                  info == SkImageInfo::MakeUnknown() ? '=' : '!');
+    SkPaint paint;
+    canvas->drawString(string, 0, 12, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_025.cpp b/docs/examples/ImageInfo_025.cpp
new file mode 100644
index 0000000..69aad08
--- /dev/null
+++ b/docs/examples/ImageInfo_025.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e2491817695290d0218be77f091b8460
+REG_FIDDLE(ImageInfo_025, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->translate(10, 10);
+    canvas->drawBitmap(source, 0, 0);
+    SkImageInfo imageInfo = source.info();
+    canvas->translate(0, imageInfo.height());
+    SkPaint paint;
+    canvas->drawLine(0, 10, imageInfo.width(), 10, paint);
+    canvas->drawString("width", imageInfo.width() / 2 - 15, 25, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_026.cpp b/docs/examples/ImageInfo_026.cpp
new file mode 100644
index 0000000..019fc3a
--- /dev/null
+++ b/docs/examples/ImageInfo_026.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=72c35baaeddca1d912edf93d19429c8e
+REG_FIDDLE(ImageInfo_026, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->translate(10, 20);
+    canvas->drawBitmap(source, 0, 0);
+    SkImageInfo imageInfo = source.info();
+    SkPaint paint;
+    canvas->drawLine(imageInfo.width() + 10, 0, imageInfo.width() + 10, imageInfo.height(), paint);
+    canvas->drawString("height", imageInfo.width() + 15, imageInfo.height() / 2, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_027.cpp b/docs/examples/ImageInfo_027.cpp
new file mode 100644
index 0000000..a7e96ca
--- /dev/null
+++ b/docs/examples/ImageInfo_027.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=06ecc3ce7f35cc7f930cbc2a662e3105
+REG_FIDDLE(ImageInfo_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkImageInfo info = SkImageInfo::MakeA8(16, 32);
+    SkDebugf("color type: k" "%s" "_SkColorType\n", colors[info.colorType()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_028.cpp b/docs/examples/ImageInfo_028.cpp
new file mode 100644
index 0000000..6d7acd2
--- /dev/null
+++ b/docs/examples/ImageInfo_028.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5c1d2499a4056b6cff38c1cf924158a1
+REG_FIDDLE(ImageInfo_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+    SkImageInfo info = SkImageInfo::MakeA8(16, 32);
+    SkDebugf("alpha type: k" "%s" "_SkAlphaType\n", alphas[info.alphaType()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_029.cpp b/docs/examples/ImageInfo_029.cpp
new file mode 100644
index 0000000..c4c9189
--- /dev/null
+++ b/docs/examples/ImageInfo_029.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5602b816d7cf75e3851274ef36a4c10f
+REG_FIDDLE(ImageInfo_029, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
+            SkColorSpace::MakeSRGBLinear());
+    SkColorSpace* colorSpace = info.colorSpace();
+    SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n",
+            colorSpace->gammaCloseToSRGB() ? "true" : "false",
+            colorSpace->gammaIsLinear() ? "true" : "false",
+            colorSpace->isSRGB() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_030.cpp b/docs/examples/ImageInfo_030.cpp
new file mode 100644
index 0000000..e342ae6
--- /dev/null
+++ b/docs/examples/ImageInfo_030.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=33f65524736736fd91802b4198ba6fa8
+REG_FIDDLE(ImageInfo_030, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info1 = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
+            SkColorSpace::MakeSRGBLinear());
+    SkImageInfo info2 = SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
+            info1.refColorSpace());
+    SkColorSpace* colorSpace = info2.colorSpace();
+    SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n",
+            colorSpace->gammaCloseToSRGB() ? "true" : "false",
+            colorSpace->gammaIsLinear() ? "true" : "false",
+            colorSpace->isSRGB() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_031.cpp b/docs/examples/ImageInfo_031.cpp
new file mode 100644
index 0000000..4929b86
--- /dev/null
+++ b/docs/examples/ImageInfo_031.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b8757200da5be0b43763cf79feb681a7
+REG_FIDDLE(ImageInfo_031, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (int width : { 0, 2 } ) {
+        for (int height : { 0, 2 } ) {
+             SkImageInfo imageInfo= SkImageInfo::MakeA8(width, height);
+             SkDebugf("width: %d height: %d empty: %s\n", width, height,
+                      imageInfo.isEmpty() ? "true" : "false");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_032.cpp b/docs/examples/ImageInfo_032.cpp
new file mode 100644
index 0000000..fa13092
--- /dev/null
+++ b/docs/examples/ImageInfo_032.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e9bd4f02b6cfb3ac864cb7fee7d7299c
+REG_FIDDLE(ImageInfo_032, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int height = 2;
+    const int width = 2;
+    SkBitmap bitmap;
+    SkImageInfo imageInfo = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);
+    bitmap.setInfo(imageInfo);
+    for (int index = 0; index < 2; ++index) {
+        bitmap.allocPixels();
+        bitmap.eraseColor(0x00000000);
+        SkDebugf("isOpaque: %s\n", imageInfo.isOpaque() ? "true" : "false");
+        bitmap.eraseColor(0xFFFFFFFF);
+        SkDebugf("isOpaque: %s\n", imageInfo.isOpaque() ? "true" : "false");
+        imageInfo = imageInfo.makeAlphaType(kOpaque_SkAlphaType);
+        bitmap.setInfo(imageInfo);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_033.cpp b/docs/examples/ImageInfo_033.cpp
new file mode 100644
index 0000000..b7dda33
--- /dev/null
+++ b/docs/examples/ImageInfo_033.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d5547cd2b302822aa85b7b0ae3f48458
+REG_FIDDLE(ImageInfo_033, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int height = 2;
+    const int width = 2;
+    SkImageInfo imageInfo = SkImageInfo::Make(width, height, kN32_SkColorType, kPremul_SkAlphaType);
+    SkISize dimensions = imageInfo.dimensions();
+    SkIRect bounds = imageInfo.bounds();
+    SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
+    SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_034.cpp b/docs/examples/ImageInfo_034.cpp
new file mode 100644
index 0000000..cf7954b
--- /dev/null
+++ b/docs/examples/ImageInfo_034.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a818be8945cd0c18f99ffe53e90afa48
+REG_FIDDLE(ImageInfo_034, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(.5f, .5f);
+    SkImageInfo imageInfo = source.info();
+    SkIRect bounds = imageInfo.bounds();
+    for (int x : { 0, bounds.width() } ) {
+        for (int y : { 0, bounds.height() } ) {
+            canvas->drawBitmap(source, x, y);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_035.cpp b/docs/examples/ImageInfo_035.cpp
new file mode 100644
index 0000000..d4a5099
--- /dev/null
+++ b/docs/examples/ImageInfo_035.cpp
@@ -0,0 +1,34 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=22df72732e898a11773fbfe07388a546
+REG_FIDDLE(ImageInfo_035, 256, 144, false, 0) {
+void draw(SkCanvas* canvas) {
+    const int width = 256;
+    const int height = 64;
+    auto drawLabel = [=](const char* what, bool closeToSRGB) -> void {
+        SkString string;
+        string.printf("%s gamma is %s" "close to sRGB", what, closeToSRGB ? "" : "not ");
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        canvas->drawString(string, 20, 56, paint);
+    };
+    SkColor  gradColors[] = { 0xFFFF7F00, 0xFF00FF7F,  0xFF0000FF, 0xFF7F7FFF };
+    SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 }, { width * 2, 0 }, { width * 3, 0 } };
+    SkPaint gradPaint;
+    gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
+                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
+    canvas->drawRect(SkRect::MakeWH(width, height), gradPaint);
+    drawLabel("canvas", canvas->imageInfo().gammaCloseToSRGB());
+    SkBitmap bitmap;
+    SkImageInfo offscreenInfo = SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType);
+    bitmap.allocPixels(offscreenInfo);
+    SkCanvas sRGBOffscreen(bitmap);
+    sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
+    canvas->translate(0, 80);
+    canvas->drawBitmap(bitmap, 0, 0);
+    drawLabel("offscreen", offscreenInfo.gammaCloseToSRGB());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_036.cpp b/docs/examples/ImageInfo_036.cpp
new file mode 100644
index 0000000..f86c157
--- /dev/null
+++ b/docs/examples/ImageInfo_036.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cd203a3f9c5fb68272f21f302dd54fbc
+REG_FIDDLE(ImageInfo_036, 256, 144, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo canvasImageInfo = canvas->imageInfo();
+    SkRect canvasBounds = SkRect::Make(canvasImageInfo.bounds());
+    canvas->drawBitmapRect(source, source.bounds(), canvasBounds, nullptr);
+    SkImageInfo insetImageInfo =
+              canvasImageInfo.makeWH(canvasBounds.width() / 2, canvasBounds.height() / 2);
+    SkBitmap inset;
+    inset.allocPixels(insetImageInfo);
+    SkCanvas offscreen(inset);
+    offscreen.drawBitmapRect(source, source.bounds(), SkRect::Make(inset.bounds()), nullptr);
+    canvas->drawBitmap(inset, canvasBounds.width() / 4, canvasBounds.height() / 4);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_037.cpp b/docs/examples/ImageInfo_037.cpp
new file mode 100644
index 0000000..e75e23d
--- /dev/null
+++ b/docs/examples/ImageInfo_037.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e72db006f1bea26feceaef8727ff9818
+REG_FIDDLE(ImageInfo_037, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    const int width = 256;
+    const int height = 128;
+    SkColor pixels[height][width];
+    for (int y = 0; y < height; ++y) {
+        for (int x = 0; x < width; ++x) {
+            int red = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 4 + y) * 0.03f)));
+            int blue = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 3 + y) * 0.04f)));
+            int green = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 2 + y) * 0.05f)));
+            int alpha = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 1 + y) * 0.006f)));
+            pixels[y][x] =
+                SkColorSetARGB(alpha, red * alpha / 255, green * alpha / 255, blue * alpha / 255);
+        }
+    }
+    SkBitmap bitmap;
+    SkImageInfo info = SkImageInfo::Make(width, height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+    bitmap.installPixels(info, (void*) pixels, sizeof(SkColor) * width);
+    canvas->drawBitmap(source, 0, 0);
+    canvas->drawBitmap(bitmap, 0, 0);
+    SkImageInfo unpremulInfo = info.makeAlphaType(kUnpremul_SkAlphaType);
+    bitmap.installPixels(unpremulInfo, (void*) pixels, sizeof(SkColor) * width);
+    canvas->drawBitmap(bitmap, 0, 128);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_038.cpp b/docs/examples/ImageInfo_038.cpp
new file mode 100644
index 0000000..ea2d76c
--- /dev/null
+++ b/docs/examples/ImageInfo_038.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3ac267b08b12dc83c95f91d8dd5d70ee
+REG_FIDDLE(ImageInfo_038, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    const int width = 256;
+    const int height = 128;
+    SkColor pixels[height][width];
+    for (int y = 0; y < height; ++y) {
+        for (int x = 0; x < width; ++x) {
+            int red = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 4 + y) * 0.03f)));
+            int blue = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 3 + y) * 0.04f)));
+            int green = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarSin((x * 2 + y) * 0.05f)));
+            int alpha = SkScalarRoundToInt(255 * SkScalarAbs(SkScalarCos((x * 1 + y) * 0.006f)));
+            pixels[y][x] =
+                SkColorSetARGB(alpha, red * alpha / 255, green * alpha / 255, blue * alpha / 255);
+        }
+    }
+    SkBitmap bitmap;
+    SkImageInfo info = SkImageInfo::Make(width, height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+    bitmap.installPixels(info, (void*) pixels, sizeof(SkColor) * width);
+    canvas->drawBitmap(source, 0, 0);
+    canvas->drawBitmap(bitmap, 0, 0);
+    SkImageInfo rgbaInfo = info.makeColorType(kRGBA_8888_SkColorType);
+    bitmap.installPixels(rgbaInfo, (void*) pixels, sizeof(SkColor) * width);
+    canvas->drawBitmap(bitmap, 0, 128);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_039.cpp b/docs/examples/ImageInfo_039.cpp
new file mode 100644
index 0000000..7e90937
--- /dev/null
+++ b/docs/examples/ImageInfo_039.cpp
@@ -0,0 +1,42 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fe3c5a755d3dde29bba058a583f18901
+REG_FIDDLE(ImageInfo_039, 256, 224, false, 0) {
+void draw(SkCanvas* canvas) {
+    const int width = 256;
+    const int height = 64;
+    auto drawLabel = [=](const char* what, bool closeToSRGB) -> void {
+        SkString string;
+        string.printf("%s gamma is %s" "close to sRGB", what, closeToSRGB ? "" : "not ");
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        canvas->drawString(string, 20, 56, paint);
+    };
+    SkColor  gradColors[] = { 0xFFFF7F00, 0xFF00FF7F,  0xFF0000FF, 0xFF7F7FFF };
+    SkPoint  gradPoints[] = { { 0, 0 }, { width, 0 }, { width * 2, 0 }, { width * 3, 0 } };
+    SkPaint gradPaint;
+    gradPaint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
+            SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
+    canvas->drawRect(SkRect::MakeWH(width, height), gradPaint);
+    drawLabel("canvas", canvas->imageInfo().gammaCloseToSRGB());
+    SkBitmap bitmap;
+    SkImageInfo offscreenInfo = SkImageInfo::MakeS32(width, height, kPremul_SkAlphaType);
+    bitmap.allocPixels(offscreenInfo);
+    SkCanvas sRGBOffscreen(bitmap);
+    sRGBOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
+    canvas->translate(0, 80);
+    canvas->drawBitmap(bitmap, 0, 0);
+    drawLabel("offscreen", offscreenInfo.gammaCloseToSRGB());
+    SkImageInfo linearGamma =
+            offscreenInfo.makeColorSpace(offscreenInfo.colorSpace()->makeLinearGamma());
+    bitmap.allocPixels(linearGamma);
+    SkCanvas lgOffscreen(bitmap);
+    lgOffscreen.drawRect(SkRect::MakeWH(width, height), gradPaint);
+    canvas->translate(0, 80);
+    canvas->drawBitmap(bitmap, 0, 0);
+    drawLabel("linear", linearGamma.gammaCloseToSRGB());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/ImageInfo_040.cpp b/docs/examples/ImageInfo_040.cpp
new file mode 100644
index 0000000..26497ca
--- /dev/null
+++ b/docs/examples/ImageInfo_040.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9b6de4a07b2316228e9340e5a3b82134
+REG_FIDDLE(ImageInfo_040, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        SkImageInfo info = SkImageInfo::Make(1, 1, colorType, kOpaque_SkAlphaType);
+        SkDebugf("color: k" "%s" "_SkColorType" "%*s" "bytesPerPixel: %d\n",
+                colors[colorType], 13 - strlen(colors[colorType]), " ",
+                info.bytesPerPixel());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_041.cpp b/docs/examples/ImageInfo_041.cpp
new file mode 100644
index 0000000..a483f73
--- /dev/null
+++ b/docs/examples/ImageInfo_041.cpp
@@ -0,0 +1,37 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e47b911f94fc629f756a829e523a2a89
+REG_FIDDLE(ImageInfo_041, 256, 256, true, 0) {
+const char* color_type(SkColorType ct) {
+    switch (ct) {
+        case kUnknown_SkColorType:      return "Unknown";
+        case kAlpha_8_SkColorType:      return "Alpha_8";
+        case kRGB_565_SkColorType:      return "RGB_565";
+        case kARGB_4444_SkColorType:    return "ARGB_4444";
+        case kRGBA_8888_SkColorType:    return "RGBA_8888";
+        case kRGB_888x_SkColorType:     return "RGB_888x";
+        case kBGRA_8888_SkColorType:    return "BGRA_8888";
+        case kRGBA_1010102_SkColorType: return "RGBA_1010102";
+        case kRGB_101010x_SkColorType:  return "RGB_101010x";
+        case kGray_8_SkColorType:       return "Gray_8";
+        case kRGBA_F16Norm_SkColorType: return "RGBA_F16Norm";
+        case kRGBA_F16_SkColorType:     return "RGBA_F16";
+        case kRGBA_F32_SkColorType:     return "RGBA_F32";
+        default: SkASSERT(false); return nullptr;
+    }
+}
+void draw(SkCanvas* canvas) {
+    for (SkColorType colorType : {
+    kUnknown_SkColorType, kAlpha_8_SkColorType, kRGB_565_SkColorType,
+    kARGB_4444_SkColorType, kRGBA_8888_SkColorType, kRGB_888x_SkColorType,
+    kBGRA_8888_SkColorType, kRGBA_1010102_SkColorType, kRGB_101010x_SkColorType,
+    kGray_8_SkColorType, kRGBA_F16_SkColorType
+                                 } ) {
+        SkImageInfo info = SkImageInfo::Make(1, 1, colorType, kOpaque_SkAlphaType);
+        SkDebugf("color: k" "%s" "_SkColorType" "%*s" "shiftPerPixel: %d\n",
+                color_type(colorType), 14 - strlen(color_type(colorType)), " ",
+                info.shiftPerPixel());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_042.cpp b/docs/examples/ImageInfo_042.cpp
new file mode 100644
index 0000000..284e238
--- /dev/null
+++ b/docs/examples/ImageInfo_042.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4b5d3904476726a39f1c3e276d6b6ba7
+REG_FIDDLE(ImageInfo_042, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (int shift = 24; shift < 32; ++shift) {
+        int width = 1 << shift;
+        SkImageInfo imageInfo =
+                SkImageInfo::Make(width, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
+        uint64_t minRowBytes = imageInfo.minRowBytes64();
+        bool widthTooLarge = (uint64_t) (int32_t) minRowBytes != minRowBytes;
+        SkDebugf("RGBA_F16 width %d (0x%08x) %s\n",
+                width, width, widthTooLarge ? "too large" : "OK");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_043.cpp b/docs/examples/ImageInfo_043.cpp
new file mode 100644
index 0000000..f189ea7
--- /dev/null
+++ b/docs/examples/ImageInfo_043.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=897230ecfb36095486beca324fd369f9
+REG_FIDDLE(ImageInfo_043, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (int shift = 24; shift < 32; ++shift) {
+        int width = 1 << shift;
+        SkImageInfo imageInfo =
+                SkImageInfo::Make(width, 1, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
+        size_t minRowBytes = imageInfo.minRowBytes();
+        bool widthTooLarge = !minRowBytes;
+        SkDebugf("RGBA_F16 width %d (0x%08x) %s\n",
+                width, width, widthTooLarge ? "too large" : "OK");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_044.cpp b/docs/examples/ImageInfo_044.cpp
new file mode 100644
index 0000000..dcfad33
--- /dev/null
+++ b/docs/examples/ImageInfo_044.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=818e4e1191e39d2a642902cbf253b399
+REG_FIDDLE(ImageInfo_044, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t pixels[][12] = { { 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00},
+                             { 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00},
+                             { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00},
+                             { 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF},
+                             { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+                             { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00},
+                             { 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00},
+                             { 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00} };
+    SkImageInfo imageInfo = SkImageInfo::MakeA8(8, 8);
+    SkBitmap bitmap;
+    bitmap.installPixels(imageInfo, (void*) pixels, sizeof(pixels[0]));
+    SkPaint paint;
+    paint.setColor(SK_ColorRED);
+    canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(32, 32), &paint);
+    size_t offset = imageInfo.computeOffset(2, 3, sizeof(pixels[0]));
+    pixels[0][offset] = 0x7F;
+    offset = imageInfo.computeOffset(5, 3, sizeof(pixels[0]));
+    pixels[0][offset] = 0x7F;
+    bitmap.installPixels(imageInfo, (void*) pixels, sizeof(pixels[0]));
+    canvas->drawBitmapRect(bitmap, SkRect::MakeWH(8, 8), SkRect::MakeWH(128, 128), &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_045.cpp b/docs/examples/ImageInfo_045.cpp
new file mode 100644
index 0000000..7a5df3d
--- /dev/null
+++ b/docs/examples/ImageInfo_045.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=53c212c4f2449df0b0eedbc6227b6ab7
+REG_FIDDLE(ImageInfo_045, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info1 = SkImageInfo::Make(10, 20, kGray_8_SkColorType, kPremul_SkAlphaType);
+    SkImageInfo info2 = SkImageInfo::Make(20, 10, kAlpha_8_SkColorType, kUnpremul_SkAlphaType);
+    SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
+    info2 = info2.makeWH(10, 20);
+    SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
+    info2 = info2.makeColorType(kGray_8_SkColorType);
+    SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
+    info2 = info2.makeAlphaType(kPremul_SkAlphaType);
+    SkDebugf("info1 %c= info2\n", info1 == info2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_046.cpp b/docs/examples/ImageInfo_046.cpp
new file mode 100644
index 0000000..1eda067
--- /dev/null
+++ b/docs/examples/ImageInfo_046.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8c039fde0a476ac1aa62bf9de5d61c77
+REG_FIDDLE(ImageInfo_046, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info1 = SkImageInfo::Make(10, 20, kGray_8_SkColorType, kPremul_SkAlphaType);
+    SkImageInfo info2 = SkImageInfo::Make(20, 10, kAlpha_8_SkColorType, kUnpremul_SkAlphaType);
+    SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
+    info2 = info2.makeWH(10, 20);
+    SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
+    info2 = info2.makeColorType(kGray_8_SkColorType);
+    SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
+    info2 = info2.makeAlphaType(kPremul_SkAlphaType);
+    SkDebugf("info1 %c= info2\n", info1 != info2 ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_047.cpp b/docs/examples/ImageInfo_047.cpp
new file mode 100644
index 0000000..7075ff2
--- /dev/null
+++ b/docs/examples/ImageInfo_047.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9def507d2295f7051effd0c83bb04436
+REG_FIDDLE(ImageInfo_047, 256, 130, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
+    const size_t size = info.computeByteSize(100000);
+    SkAutoTMalloc<SkPMColor> storage(size);
+    SkPMColor* pixels = storage.get();
+    SkBitmap bitmap;
+    bitmap.setInfo(info);
+    bitmap.setPixels(pixels);
+    bitmap.eraseColor(SK_ColorRED);
+    canvas->scale(50, 50);
+    canvas->rotate(8);
+    canvas->drawBitmap(bitmap, 2, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_048.cpp b/docs/examples/ImageInfo_048.cpp
new file mode 100644
index 0000000..3d5fde7
--- /dev/null
+++ b/docs/examples/ImageInfo_048.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fc18640fdde437cb35338aed7c68d399
+REG_FIDDLE(ImageInfo_048, 256, 130, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
+    const size_t size = info.computeMinByteSize();
+    SkAutoTMalloc<SkPMColor> storage(size);
+    SkPMColor* pixels = storage.get();
+    SkBitmap bitmap;
+    bitmap.setInfo(info);
+    bitmap.setPixels(pixels);
+    bitmap.eraseColor(SK_ColorRED);
+    canvas->scale(50, 50);
+    canvas->rotate(8);
+    canvas->drawBitmap(bitmap, 2, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_049.cpp b/docs/examples/ImageInfo_049.cpp
new file mode 100644
index 0000000..be9451f
--- /dev/null
+++ b/docs/examples/ImageInfo_049.cpp
@@ -0,0 +1,18 @@
+#if 0  // disabled
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6a63dfdd62ab77ff57783af8c33d7b78
+REG_FIDDLE(ImageInfo_049, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    if (sizeof(size_t) == 8) {
+        SkImageInfo info = SkImageInfo::MakeN32Premul(2, 1000000000);
+        for (size_t rowBytes = 100000000; rowBytes < 10000000000000LL; rowBytes *= 10) {
+            const size_t size = info.computeByteSize(rowBytes);
+            SkDebugf("rowBytes:%llu size:%llu overflowed:%s\n", rowBytes, size,
+                     SkImageInfo::ByteSizeOverflowed(size) ? "true" : "false");
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // disabled
diff --git a/docs/examples/ImageInfo_050.cpp b/docs/examples/ImageInfo_050.cpp
new file mode 100644
index 0000000..6d974cf
--- /dev/null
+++ b/docs/examples/ImageInfo_050.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c6b0f6a3f493cb08d9abcdefe12de245
+REG_FIDDLE(ImageInfo_050, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(16, 8);
+    for (size_t rowBytes = 60; rowBytes < 72; rowBytes += sizeof(SkPMColor)) {
+        SkDebugf("validRowBytes(%llu): %s\n", rowBytes, info.validRowBytes(rowBytes) ?
+                 "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/ImageInfo_051.cpp b/docs/examples/ImageInfo_051.cpp
new file mode 100644
index 0000000..5adf7ba
--- /dev/null
+++ b/docs/examples/ImageInfo_051.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ab7e73786805c936de386b6c1ebe1f13
+REG_FIDDLE(ImageInfo_051, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(16, 8);
+    SkImageInfo copy = info;
+    SkDebugf("info %c= copy\n", info == copy ? '=' : '!');
+    copy.reset();
+    SkDebugf("info %c= reset copy\n", info == copy ? '=' : '!');
+    SkDebugf("SkImageInfo() %c= reset copy\n", SkImageInfo() == copy ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_000.cpp b/docs/examples/Image_000.cpp
new file mode 100644
index 0000000..79f5e25
--- /dev/null
+++ b/docs/examples/Image_000.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=513afec5795a9504ebf6af5373d16b6b
+REG_FIDDLE(Image_000, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
+                            { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
+                            { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
+                            { 0x90, 0x81, 0xC5, 0x71, 0x33 },
+                            { 0x75, 0x55, 0x44, 0x40, 0x30 }};
+    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
+    *pixmap.writable_addr8(2, 2) = 0x00;
+    canvas->scale(10, 10);
+    canvas->drawBitmap(bitmap, 0, 0);
+    canvas->drawImage(image, 10, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_001.cpp b/docs/examples/Image_001.cpp
new file mode 100644
index 0000000..12b3d0a
--- /dev/null
+++ b/docs/examples/Image_001.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=22e7ce79ab2fe94252d23319f2258127
+REG_FIDDLE(Image_001, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    size_t rowBytes = image->width() * SkColorTypeBytesPerPixel(kRGBA_8888_SkColorType);
+    sk_sp<SkData> data = SkData::MakeUninitialized(rowBytes * image->height());
+    SkImageInfo dstInfo = SkImageInfo::MakeN32(image->width(), image->height(),
+                                               kPremul_SkAlphaType);
+    image->readPixels(dstInfo, data->writable_data(), rowBytes, 0, 0, SkImage::kAllow_CachingHint);
+    sk_sp<SkImage> raw = SkImage::MakeRasterData(dstInfo.makeColorType(kRGBA_8888_SkColorType),
+                                                 data, rowBytes);
+    canvas->drawImage(image, 0, 0);
+    canvas->drawImage(raw.get(), 128, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_002.cpp b/docs/examples/Image_002.cpp
new file mode 100644
index 0000000..be5ae12
--- /dev/null
+++ b/docs/examples/Image_002.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=275356b65d18c8868f4434137350cddc
+REG_FIDDLE(Image_002, 256, 256, true, 0) {
+static void releaseProc(const void* pixels, SkImage::ReleaseContext context) {
+     int* countPtr = static_cast<int*>(context);
+     *countPtr += 1;
+}
+
+void draw(SkCanvas* canvas) {
+    SkColor color = 0;
+    SkPixmap pixmap(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), &color, 4);
+    int releaseCount = 0;
+    sk_sp<SkImage> image(SkImage::MakeFromRaster(pixmap, releaseProc, &releaseCount));
+    SkDebugf("before reset: %d\n", releaseCount);
+    image.reset();
+    SkDebugf("after reset: %d\n", releaseCount);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_003.cpp b/docs/examples/Image_003.cpp
new file mode 100644
index 0000000..2047a7f
--- /dev/null
+++ b/docs/examples/Image_003.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cf2cf53321e4e6a77c2841bfbc0ef707
+REG_FIDDLE(Image_003, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t storage[][5] = {{ 0xCA, 0xDA, 0xCA, 0xC9, 0xA3 },
+                            { 0xAC, 0xA8, 0x89, 0xA7, 0x87 },
+                            { 0x9B, 0xB5, 0xE5, 0x95, 0x46 },
+                            { 0x90, 0x81, 0xC5, 0x71, 0x33 },
+                            { 0x75, 0x55, 0x44, 0x40, 0x30 }};
+    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kOpaque_SkAlphaType);
+    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    sk_sp<SkImage> image1 = SkImage::MakeFromBitmap(bitmap);
+    bitmap.setImmutable();
+    sk_sp<SkImage> image2 = SkImage::MakeFromBitmap(bitmap);
+    *pixmap.writable_addr8(2, 2) = 0x00;
+    canvas->scale(10, 10);
+    canvas->drawImage(image1, 0, 0);
+    canvas->drawImage(image2, 10, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_004.cpp b/docs/examples/Image_004.cpp
new file mode 100644
index 0000000..820e552
--- /dev/null
+++ b/docs/examples/Image_004.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c2fec0746f88ca34d7dce59dd9bdef9e
+REG_FIDDLE(Image_004, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    recorder.beginRecording(100, 100)->drawColor(SK_ColorRED);
+    auto picture = recorder.finishRecordingAsPicture();
+    auto gen = SkImageGenerator::MakeFromPicture({100, 100}, picture, nullptr, nullptr,
+                                                 SkImage::BitDepth::kU8, SkColorSpace::MakeSRGB());
+    sk_sp<SkImage> image = SkImage::MakeFromGenerator(std::move(gen));
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_005.cpp b/docs/examples/Image_005.cpp
new file mode 100644
index 0000000..dfd4988
--- /dev/null
+++ b/docs/examples/Image_005.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=894f732ed6409b1f392bc5481421d0e9
+REG_FIDDLE(Image_005, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    int x = 0;
+    for (int quality : { 100, 50, 10, 1} ) {
+        sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, quality);
+        sk_sp<SkImage> image = SkImage::MakeFromEncoded(encodedData);
+        canvas->drawImage(image, x, 0);
+        x += 64;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_006.cpp b/docs/examples/Image_006.cpp
new file mode 100644
index 0000000..3868f1d
--- /dev/null
+++ b/docs/examples/Image_006.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=94e9296c53bad074bf2a48ff885dac13
+REG_FIDDLE(Image_006, 256, 128, false, 3) {
+void draw(SkCanvas* canvas) {
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+       return;
+    }
+    canvas->scale(.25f, .25f);
+    int x = 0;
+    for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
+        sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
+               origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr);
+        canvas->drawImage(image, x, 0);
+    x += 512;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_007.cpp b/docs/examples/Image_007.cpp
new file mode 100644
index 0000000..c5dd725
--- /dev/null
+++ b/docs/examples/Image_007.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2b1e46354d823dbb53fa6af570135329
+REG_FIDDLE(Image_007, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+       return;
+    }
+    auto debugster = [](SkImage::ReleaseContext releaseContext) -> void {
+       *((int *) releaseContext) += 128;
+    };
+    int x = 0, y = 0;
+    for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
+        sk_sp<SkImage> image = SkImage::MakeFromTexture(context, backEndTexture,
+               origin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr, debugster, &x);
+        canvas->drawImage(image, x, y);
+        y += 128;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_008.cpp b/docs/examples/Image_008.cpp
new file mode 100644
index 0000000..b699954
--- /dev/null
+++ b/docs/examples/Image_008.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=069c7b116479e3ca46f953f07dcbdd36
+REG_FIDDLE(Image_008, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+    GrContext* context = canvas->getGrContext();
+    sk_sp<SkData> encodedData = image->encodeToData(SkEncodedImageFormat::kJPEG, 100);
+    sk_sp<SkImage> image = SkImage::MakeCrossContextFromEncoded(context,
+                                                                encodedData, false, nullptr);
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_009.cpp b/docs/examples/Image_009.cpp
new file mode 100644
index 0000000..73c0202
--- /dev/null
+++ b/docs/examples/Image_009.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=45bca8747b8f49b5be34b520897ef048
+REG_FIDDLE(Image_009, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+    GrContext* context = canvas->getGrContext();
+    SkPixmap pixmap;
+    if (source.peekPixels(&pixmap)) {
+        sk_sp<SkImage> image = SkImage::MakeCrossContextFromPixmap(context, pixmap,
+                                                                   false, nullptr);
+        canvas->drawImage(image, 0, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_010.cpp b/docs/examples/Image_010.cpp
new file mode 100644
index 0000000..6e7db6c
--- /dev/null
+++ b/docs/examples/Image_010.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b034517e39394b7543f06ec885e36d7d
+REG_FIDDLE(Image_010, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    if (!canvas->getGrContext()) {
+        return;
+    }
+    canvas->scale(.5f, .5f);
+    canvas->clear(0x7f3f5f7f);
+    int x = 0, y = 0;
+    for (auto origin : { kBottomLeft_GrSurfaceOrigin, kTopLeft_GrSurfaceOrigin } ) {
+        for (auto alpha : { kOpaque_SkAlphaType, kPremul_SkAlphaType, kUnpremul_SkAlphaType } ) {
+            sk_sp<SkImage> image = SkImage::MakeFromAdoptedTexture(canvas->getGrContext(),
+                                                                   backEndTexture, origin,
+                                                                   kRGBA_8888_SkColorType, alpha);
+            canvas->drawImage(image, x, y);
+            x += 160;
+        }
+        x -= 160 * 3;
+        y += 256;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_011.cpp b/docs/examples/Image_011.cpp
new file mode 100644
index 0000000..d3ce9c6
--- /dev/null
+++ b/docs/examples/Image_011.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4aa2879b9e44dfd6648995326d2c4dcf
+REG_FIDDLE(Image_011, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPictureRecorder recorder;
+    SkCanvas* recordingCanvas = recorder.beginRecording(50, 50);
+    for (auto color : { SK_ColorRED, SK_ColorBLUE, 0xff007f00 } ) {
+        paint.setColor(color);
+        recordingCanvas->drawRect({10, 10, 30, 40}, paint);
+        recordingCanvas->translate(10, 10);
+        recordingCanvas->scale(1.2f, 1.4f);
+    }
+    sk_sp<SkPicture> playback = recorder.finishRecordingAsPicture();
+    int x = 0, y = 0;
+    for (auto alpha : { 70, 140, 210 } ) {
+        paint.setAlpha(alpha);
+        auto srgbColorSpace = SkColorSpace::MakeSRGB();
+        sk_sp<SkImage> image = SkImage::MakeFromPicture(playback, {50, 50}, nullptr, &paint,
+                                                        SkImage::BitDepth::kU8, srgbColorSpace);
+        canvas->drawImage(image, x, y);
+        x += 70; y += 70;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_012.cpp b/docs/examples/Image_012.cpp
new file mode 100644
index 0000000..66d5e72
--- /dev/null
+++ b/docs/examples/Image_012.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9aec65fc252ffc9982fa8867433eca18
+REG_FIDDLE(Image_012, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->translate(10, 10);
+    canvas->drawImage(image, 0, 0);
+    canvas->translate(0, image->height());
+    SkPaint paint;
+    canvas->drawLine(0, 10, image->width(), 10, paint);
+    canvas->drawString("width", image->width() / 2 - 15, 25, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_013.cpp b/docs/examples/Image_013.cpp
new file mode 100644
index 0000000..1bf1df9
--- /dev/null
+++ b/docs/examples/Image_013.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a4f53a0b6ac85e7bc3887245b728530d
+REG_FIDDLE(Image_013, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->translate(10, 10);
+    canvas->drawImage(image, 0, 0);
+    canvas->translate(image->width(), 0);
+    SkPaint paint;
+    canvas->drawLine(10, 0, 10, image->height(), paint);
+    canvas->drawString("height", 34, image->height() / 2, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_014.cpp b/docs/examples/Image_014.cpp
new file mode 100644
index 0000000..4dd2810
--- /dev/null
+++ b/docs/examples/Image_014.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=96b4bc43b3667df9ba9e2dafb770d33c
+REG_FIDDLE(Image_014, 256, 256, true, 4) {
+void draw(SkCanvas* canvas) {
+    SkISize dimensions = image->dimensions();
+    SkIRect bounds = image->bounds();
+    SkIRect dimensionsAsBounds = SkIRect::MakeSize(dimensions);
+    SkDebugf("dimensionsAsBounds %c= bounds\n", dimensionsAsBounds == bounds ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_015.cpp b/docs/examples/Image_015.cpp
new file mode 100644
index 0000000..5892c42
--- /dev/null
+++ b/docs/examples/Image_015.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c204b38b3fc08914b0a634aa4eaec894
+REG_FIDDLE(Image_015, 256, 128, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkIRect bounds = image->bounds();
+    for (int x : { 0, bounds.width() } ) {
+        for (int y : { 0, bounds.height() } ) {
+            canvas->drawImage(image, x, y);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_016.cpp b/docs/examples/Image_016.cpp
new file mode 100644
index 0000000..db02f21
--- /dev/null
+++ b/docs/examples/Image_016.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d70194c9c51e700335f95de91846d023
+REG_FIDDLE(Image_016, 256, 156, false, 5) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkImage> subset = image->makeSubset({10, 20, 90, 100});
+    canvas->drawImage(image, 0, 0);
+    canvas->drawImage(subset, 128, 0);
+    SkPaint paint;
+    SkString s;
+    s.printf("original id: %d", image->uniqueID());
+    canvas->drawString(s, 20, image->height() + 20, paint);
+    s.printf("subset id: %d", subset->uniqueID());
+    canvas->drawString(s, 148, subset->height() + 20, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_017.cpp b/docs/examples/Image_017.cpp
new file mode 100644
index 0000000..b4de0f0
--- /dev/null
+++ b/docs/examples/Image_017.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1b9f1f05026ceb14ccb6926a13cdaa83
+REG_FIDDLE(Image_017, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    const char* alphaTypeStr[] = { "Unknown", "Opaque", "Premul", "Unpremul" };
+    SkAlphaType alphaType = image->alphaType();
+    canvas->drawImage(image, 16, 0);
+    canvas->drawString(alphaTypeStr[(int) alphaType], 20, image->height() + 20, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_018.cpp b/docs/examples/Image_018.cpp
new file mode 100644
index 0000000..35e4b47
--- /dev/null
+++ b/docs/examples/Image_018.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=50396fad4a128f58e400ca00fe09711f
+REG_FIDDLE(Image_018, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = { "Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                             "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                             "RGBA_F16" };
+    SkColorType colorType = image->colorType();
+    canvas->drawImage(image, 16, 0);
+    canvas->drawString(colors[(int) colorType], 20, image->height() + 20, SkFont(), SkPaint());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_019.cpp b/docs/examples/Image_019.cpp
new file mode 100644
index 0000000..fbf2afd
--- /dev/null
+++ b/docs/examples/Image_019.cpp
@@ -0,0 +1,27 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4468d573f42af6f5e234be10a5453bb2
+REG_FIDDLE(Image_019, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkPixmap pixmap;
+    source.peekPixels(&pixmap);
+    canvas->scale(.25f, .25f);
+    int y = 0;
+    for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
+                        SkColorSpace::kSRGB_RenderTargetGamma } ) {
+        int x = 0;
+        sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
+        for (int index = 0; index < 2; ++index) {
+            pixmap.setColorSpace(colorSpace);
+            sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
+            canvas->drawImage(image, x, y);
+            colorSpace = image->colorSpace()->makeColorSpin();
+            x += 512;
+        }
+        y += 512;
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_020.cpp b/docs/examples/Image_020.cpp
new file mode 100644
index 0000000..7b224e8
--- /dev/null
+++ b/docs/examples/Image_020.cpp
@@ -0,0 +1,27 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=59b2078ebfbda8736a57c0486ae33332
+REG_FIDDLE(Image_020, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkPixmap pixmap;
+    source.peekPixels(&pixmap);
+    canvas->scale(.25f, .25f);
+    int y = 0;
+    for (auto gamma : { SkColorSpace::kLinear_RenderTargetGamma,
+                        SkColorSpace::kSRGB_RenderTargetGamma } ) {
+        int x = 0;
+        sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeRGB(gamma, SkColorSpace::kSRGB_Gamut);
+        for (int index = 0; index < 2; ++index) {
+            pixmap.setColorSpace(colorSpace);
+            sk_sp<SkImage> image = SkImage::MakeRasterCopy(pixmap);
+            canvas->drawImage(image, x, y);
+            colorSpace = image->refColorSpace()->makeColorSpin();
+            x += 512;
+        }
+        y += 512;
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_021.cpp b/docs/examples/Image_021.cpp
new file mode 100644
index 0000000..7bce5cf
--- /dev/null
+++ b/docs/examples/Image_021.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=50762c73b8ea91959c5a7b68fbf1062d
+REG_FIDDLE(Image_021, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t pmColors = 0;
+    sk_sp<SkImage> image = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1), &pmColors, 1});
+    SkDebugf("alphaOnly = %s\n", image->isAlphaOnly() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_022.cpp b/docs/examples/Image_022.cpp
new file mode 100644
index 0000000..414f53d
--- /dev/null
+++ b/docs/examples/Image_022.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e3340460003b74ee286d625e68589d65
+REG_FIDDLE(Image_022, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto check_isopaque = [](const SkImageInfo& imageInfo) -> void {
+        auto surface(SkSurface::MakeRaster(imageInfo));
+        auto image(surface->makeImageSnapshot());
+        SkDebugf("isOpaque = %s\n", image->isOpaque() ? "true" : "false");
+    };
+    check_isopaque(SkImageInfo::MakeN32Premul(5, 5));
+    check_isopaque(SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_023.cpp b/docs/examples/Image_023.cpp
new file mode 100644
index 0000000..fa9ae3c
--- /dev/null
+++ b/docs/examples/Image_023.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1c6de6fe72b00b5be970f5f718363449
+REG_FIDDLE(Image_023, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setRotate(45);
+    SkPaint paint;
+    paint.setShader(image->makeShader(SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode,
+                                      &matrix));
+    canvas->drawPaint(paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_024.cpp b/docs/examples/Image_024.cpp
new file mode 100644
index 0000000..d9d4864
--- /dev/null
+++ b/docs/examples/Image_024.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=10172fca71b9dbdcade772513ffeb27e
+REG_FIDDLE(Image_024, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setRotate(45);
+    matrix.postTranslate(125, 30);
+    SkPaint paint;
+    paint.setShader(image->makeShader(&matrix));
+    canvas->drawPaint(paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_025.cpp b/docs/examples/Image_025.cpp
new file mode 100644
index 0000000..308e878
--- /dev/null
+++ b/docs/examples/Image_025.cpp
@@ -0,0 +1,28 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=900c0eab8dfdecd8301ed5be95887f8e
+REG_FIDDLE(Image_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocPixels(SkImageInfo::MakeN32Premul(12, 11));
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorWHITE);
+    SkPaint paint;
+    offscreen.drawString("%", 1, 10, paint);
+    sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+    SkPixmap pixmap;
+    if (image->peekPixels(&pixmap)) {
+        const SkPMColor* pixels = pixmap.addr32();
+        SkPMColor pmWhite = pixels[0];
+        for (int y = 0; y < image->height(); ++y) {
+            for (int x = 0; x < image->width(); ++x) {
+                SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
+            }
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_026.cpp b/docs/examples/Image_026.cpp
new file mode 100644
index 0000000..273d8c4
--- /dev/null
+++ b/docs/examples/Image_026.cpp
@@ -0,0 +1,30 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9cf5c62a3d2243e6577ae563f360ea9d
+REG_FIDDLE(Image_026, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
+        if (nullptr == image) {
+            return;
+        }
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        canvas->drawImage(image, 0, 0);
+        canvas->drawString(label, 30, image->height() / 4, paint);
+        canvas->drawString(image->isTextureBacked() ? "is GPU texture" : "not GPU texture",
+                           20, image->height() * 3 / 4, paint);
+    };
+    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
+    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
+                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+                                kOpaque_SkAlphaType, nullptr));
+    drawImage(image, "image");
+    canvas->translate(image->width(), 0);
+    drawImage(bitmapImage, "source");
+    canvas->translate(-image->width(), image->height());
+    drawImage(textureImage, "backEndTexture");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_027.cpp b/docs/examples/Image_027.cpp
new file mode 100644
index 0000000..57c679c
--- /dev/null
+++ b/docs/examples/Image_027.cpp
@@ -0,0 +1,34 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=afc62f38aebc56af8e425297ec67dd37
+REG_FIDDLE(Image_027, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
+        if (nullptr == image) {
+            return;
+        }
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        canvas->drawImage(image, 0, 0);
+        canvas->drawString(label, image->width() / 2, image->height() / 4, paint);
+        if (canvas->getGrContext()) {
+            canvas->drawString(image->isValid(canvas->getGrContext()) ? "is valid on GPU" :
+                    "not valid on GPU", 20, image->height() * 5 / 8, paint);
+        }
+        canvas->drawString(image->isValid(nullptr) ? "is valid on CPU" :
+                "not valid on CPU", 20, image->height() * 7 / 8, paint);
+    };
+    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
+    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
+                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+                                kOpaque_SkAlphaType, nullptr));
+    drawImage(image, "image");
+    canvas->translate(image->width(), 0);
+    drawImage(bitmapImage, "source");
+    canvas->translate(-image->width(), image->height());
+    drawImage(textureImage, "backEndTexture");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_028.cpp b/docs/examples/Image_028.cpp
new file mode 100644
index 0000000..3e4ba41
--- /dev/null
+++ b/docs/examples/Image_028.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d093aad721261f421c4bef4a296aab48
+REG_FIDDLE(Image_028, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    GrContext* grContext = canvas->getGrContext();
+    if (!grContext) {
+        canvas->drawString("GPU only!", 20, 40, SkPaint());
+        return;
+    }
+    sk_sp<SkImage> imageFromBackend = SkImage::MakeFromAdoptedTexture(grContext, backEndTexture,
+            kBottomLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
+    GrBackendTexture textureFromImage = imageFromBackend->getBackendTexture(false);
+    if (!textureFromImage.isValid()) {
+        return;
+    }
+    sk_sp<SkImage> imageFromTexture = SkImage::MakeFromAdoptedTexture(grContext, textureFromImage,
+            kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
+    canvas->drawImage(imageFromTexture, 0, 0);
+    canvas->drawImage(imageFromBackend, 128, 128);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_029.cpp b/docs/examples/Image_029.cpp
new file mode 100644
index 0000000..c4c2cee
--- /dev/null
+++ b/docs/examples/Image_029.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8aa8ca63dff4641dfc6ea8a3c555d59c
+REG_FIDDLE(Image_029, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(.5f, .5f);
+    const int width = 32;
+    const int height = 32;
+    std::vector<int32_t> dstPixels;
+    dstPixels.resize(height * width * 4);
+    SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
+    for (int y = 0; y < 512; y += height ) {
+        for (int x = 0; x < 512; x += width ) {
+            if (image->readPixels(info, &dstPixels.front(), width * 4, x, y)) {
+                SkPixmap dstPixmap(info, &dstPixels.front(), width * 4);
+                SkBitmap bitmap;
+                bitmap.installPixels(dstPixmap);
+                canvas->drawBitmap(bitmap, 0, 0);
+            }
+            canvas->translate(48, 0);
+        }
+        canvas->translate(-16 * 48, 48);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_030.cpp b/docs/examples/Image_030.cpp
new file mode 100644
index 0000000..87772ce
--- /dev/null
+++ b/docs/examples/Image_030.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b77a73c4baa63a4a8e2a4fdd96144d0b
+REG_FIDDLE(Image_030, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> srcPixels;
+    int rowBytes = image->width() * 4;
+    int quarterWidth = image->width() / 4;
+    int quarterHeight = image->height() / 4;
+    srcPixels.resize(image->height() * rowBytes);
+    for (int y = 0; y < 4; ++y) {
+        for (int x = 0; x < 4; ++x) {
+            SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
+                    &srcPixels.front() + x * image->height() * quarterWidth +
+                    y * quarterWidth, rowBytes);
+            image->readPixels(pixmap, x * quarterWidth, y * quarterHeight);
+        }
+    }
+    canvas->scale(.5f, .5f);
+    SkBitmap bitmap;
+    bitmap.installPixels(SkImageInfo::MakeN32Premul(image->width(), image->height()),
+                             &srcPixels.front(), rowBytes);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_031.cpp b/docs/examples/Image_031.cpp
new file mode 100644
index 0000000..f513feb
--- /dev/null
+++ b/docs/examples/Image_031.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5949c9a63610cae30019e5b1899ee38f
+REG_FIDDLE(Image_031, 256, 128, false, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> srcPixels;
+    int quarterWidth = image->width() / 16;
+    int rowBytes = quarterWidth * 4;
+    int quarterHeight = image->height() / 16;
+    srcPixels.resize(quarterHeight * rowBytes);
+    SkPixmap pixmap(SkImageInfo::MakeN32Premul(quarterWidth, quarterHeight),
+                    &srcPixels.front(), rowBytes);
+    canvas->scale(4, 4);
+    SkFilterQuality qualities[] = { kNone_SkFilterQuality, kLow_SkFilterQuality,
+                     kMedium_SkFilterQuality, kHigh_SkFilterQuality };
+    for (unsigned index = 0; index < SK_ARRAY_COUNT(qualities); ++index) {
+        image->scalePixels(pixmap, qualities[index]);
+        sk_sp<SkImage> filtered = SkImage::MakeFromRaster(pixmap, nullptr, nullptr);
+        canvas->drawImage(filtered, 16 * index, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_032.cpp b/docs/examples/Image_032.cpp
new file mode 100644
index 0000000..425a5eb
--- /dev/null
+++ b/docs/examples/Image_032.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7a3bf8851bb7160e4e49c48f8c09639d
+REG_FIDDLE(Image_032, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(4, 4);
+    SkIRect subset = {0, 0, 16, 64};
+    int x = 0;
+    for (int quality : { 0, 10, 50, 100 } ) {
+        sk_sp<SkData> data(image->encodeToData(SkEncodedImageFormat::kJPEG, quality));
+        sk_sp<SkImage> filtered = SkImage::MakeFromEncoded(data, &subset);
+        canvas->drawImage(filtered, x, 0);
+        x += 16;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_033.cpp b/docs/examples/Image_033.cpp
new file mode 100644
index 0000000..9a50e2a
--- /dev/null
+++ b/docs/examples/Image_033.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=30cee813f6aa476b0a9c8a24283e53a3
+REG_FIDDLE(Image_033, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(4, 4);
+    SkIRect subset = {136, 32, 200, 96};
+    sk_sp<SkData> data(image->encodeToData());
+    sk_sp<SkImage> eye = SkImage::MakeFromEncoded(data, &subset);
+    canvas->drawImage(eye, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_034.cpp b/docs/examples/Image_034.cpp
new file mode 100644
index 0000000..5fa78f2
--- /dev/null
+++ b/docs/examples/Image_034.cpp
@@ -0,0 +1,28 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=80856fe921ce36f8d5a32d8672bccbfc
+REG_FIDDLE(Image_034, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    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 ) {
+        if (!test.image) {
+            string.printf("no %s", test.name);
+        } else {
+            string.printf("%s" "encoded %s", test.image->refEncodedData() ? "" : "no ", test.name);
+        }
+        canvas->drawString(string, 10, 20, paint);
+        canvas->translate(0, 20);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_035.cpp b/docs/examples/Image_035.cpp
new file mode 100644
index 0000000..dc3ad6c
--- /dev/null
+++ b/docs/examples/Image_035.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=889e495ce3e3b3bacc96e8230932331c
+REG_FIDDLE(Image_035, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    canvas->scale(.5f, .5f);
+    const int width = 64;
+    const int height = 64;
+    for (int y = 0; y < 512; y += height ) {
+        for (int x = 0; x < 512; x += width ) {
+            sk_sp<SkImage> subset(image->makeSubset({x, y, x + width, y + height}));
+            canvas->drawImage(subset, x * 3 / 2, y * 3 / 2);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_036.cpp b/docs/examples/Image_036.cpp
new file mode 100644
index 0000000..a6d0280
--- /dev/null
+++ b/docs/examples/Image_036.cpp
@@ -0,0 +1,30 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eeec9e07e604b44d0208899a2fe5bef5
+REG_FIDDLE(Image_036, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    auto drawImage = [=](sk_sp<SkImage> image, GrContext* context, const char* label) -> void {
+        if (nullptr == image || nullptr == context) {
+            return;
+        }
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        sk_sp<SkImage> texture(image->makeTextureImage(context, nullptr));
+        canvas->drawImage(texture, 0, 0);
+        canvas->drawString(label, 20, texture->height() / 4, paint);
+    };
+    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
+    GrContext* context = canvas->getGrContext();
+    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(context, backEndTexture,
+                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+                                kOpaque_SkAlphaType, nullptr));
+    drawImage(image, context, "image");
+    canvas->translate(image->width(), 0);
+    drawImage(bitmapImage, context, "source");
+    canvas->translate(-image->width(), image->height());
+    drawImage(textureImage, context, "backEndTexture");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_037.cpp b/docs/examples/Image_037.cpp
new file mode 100644
index 0000000..fd80e84
--- /dev/null
+++ b/docs/examples/Image_037.cpp
@@ -0,0 +1,29 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ecdbaff44a02c310ef672b7d393c6dea
+REG_FIDDLE(Image_037, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
+        if (nullptr == image) {
+            return;
+        }
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        sk_sp<SkImage> nonTexture(image->makeNonTextureImage());
+        canvas->drawImage(nonTexture, 0, 0);
+        canvas->drawString(label, 20, nonTexture->height() / 4, paint);
+    };
+    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
+    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
+                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+                                kOpaque_SkAlphaType, nullptr));
+    drawImage(image, "image");
+    canvas->translate(image->width(), 0);
+    drawImage(bitmapImage, "source");
+    canvas->translate(-image->width(), image->height());
+    drawImage(textureImage, "backEndTexture");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_038.cpp b/docs/examples/Image_038.cpp
new file mode 100644
index 0000000..9fc438d
--- /dev/null
+++ b/docs/examples/Image_038.cpp
@@ -0,0 +1,29 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=aed5f399915d40bb5d133ab586e5bac3
+REG_FIDDLE(Image_038, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
+        if (nullptr == image) {
+            return;
+        }
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        sk_sp<SkImage> raster(image->makeRasterImage());
+        canvas->drawImage(raster, 0, 0);
+        canvas->drawString(label, 20, raster->height() / 4, paint);
+    };
+    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
+    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
+                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+                                kOpaque_SkAlphaType, nullptr));
+    drawImage(image, "image");
+    canvas->translate(image->width(), 0);
+    drawImage(bitmapImage, "source");
+    canvas->translate(-image->width(), image->height());
+    drawImage(textureImage, "backEndTexture");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_039.cpp b/docs/examples/Image_039.cpp
new file mode 100644
index 0000000..e8e9414
--- /dev/null
+++ b/docs/examples/Image_039.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=85a76163138a2720ac003691d6363938
+REG_FIDDLE(Image_039, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkImageFilter> shadowFilter = SkDropShadowImageFilter::Make(
+                -10.0f * frame, 5.0f * frame, 3.0f, 3.0f, SK_ColorBLUE,
+                SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
+                nullptr);
+    sk_sp<SkImageFilter> offsetFilter = SkOffsetImageFilter::Make(40, 40, shadowFilter, nullptr);
+    SkIRect subset = image->bounds();
+    SkIRect clipBounds = image->bounds();
+    clipBounds.outset(60, 60);
+    SkIRect outSubset;
+    SkIPoint offset;
+    sk_sp<SkImage> filtered(image->makeWithFilter(offsetFilter.get(), subset, clipBounds,
+                            &outSubset, &offset));
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawLine(0, 0, offset.fX, offset.fY, paint);
+    canvas->translate(offset.fX, offset.fY);
+    canvas->drawImage(filtered, 0, 0);
+    canvas->drawRect(SkRect::Make(outSubset), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_040.cpp b/docs/examples/Image_040.cpp
new file mode 100644
index 0000000..7f8488e
--- /dev/null
+++ b/docs/examples/Image_040.cpp
@@ -0,0 +1,34 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=06aeb3cf63ffccf7b49fe556e5def351
+REG_FIDDLE(Image_040, 256, 64, false, 0) {
+static sk_sp<SkImage> create_gpu_image(GrContext* grContext) {
+    const SkImageInfo info = SkImageInfo::MakeN32(20, 20, kOpaque_SkAlphaType);
+    auto surface(SkSurface::MakeRenderTarget(grContext, SkBudgeted::kNo, info));
+    SkCanvas* canvas = surface->getCanvas();
+    canvas->clear(SK_ColorWHITE);
+    SkPaint paint;
+    paint.setColor(SK_ColorBLACK);
+    canvas->drawRect(SkRect::MakeXYWH(5, 5, 10, 10), paint);
+    return surface->makeImageSnapshot();
+}
+
+void draw(SkCanvas* canvas) {
+    GrContext* grContext = canvas->getGrContext();
+    if (!grContext) {
+        return;
+    }
+    sk_sp<SkImage> backEndImage = create_gpu_image(grContext);
+    canvas->drawImage(backEndImage, 0, 0);
+    GrBackendTexture texture;
+    SkImage::BackendTextureReleaseProc proc;
+    if (!SkImage::MakeBackendTextureFromSkImage(grContext, std::move(backEndImage),
+            &texture, &proc)) {
+        return;
+    }
+    sk_sp<SkImage> i2 = SkImage::MakeFromTexture(grContext, texture, kTopLeft_GrSurfaceOrigin,
+            kN32_SkColorType, kOpaque_SkAlphaType, nullptr);
+    canvas->drawImage(i2, 30, 30);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Image_041.cpp b/docs/examples/Image_041.cpp
new file mode 100644
index 0000000..4431c9d
--- /dev/null
+++ b/docs/examples/Image_041.cpp
@@ -0,0 +1,35 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a8b8bd4bfe968e2c63085f867665227f
+REG_FIDDLE(Image_041, 256, 80, false, 0) {
+class TestImageGenerator : public SkImageGenerator {
+public:
+    TestImageGenerator() : SkImageGenerator(SkImageInfo::MakeN32Premul(10, 10)) {}
+    ~TestImageGenerator() override {}
+protected:
+    bool onGetPixels(const SkImageInfo& info, void* pixelPtr, size_t rowBytes,
+                     const Options& options) override {
+        SkPMColor* pixels = static_cast<SkPMColor*>(pixelPtr);
+        for (int y = 0; y < info.height(); ++y) {
+            for (int x = 0; x < info.width(); ++x) {
+                pixels[y * info.width() + x] = 0xff223344 + y * 0x000C0811;
+            }
+        }
+        return true;
+    }
+};
+
+void draw(SkCanvas* canvas) {
+    auto gen = std::unique_ptr<TestImageGenerator>(new TestImageGenerator());
+    sk_sp<SkImage> image(SkImage::MakeFromGenerator(std::move(gen)));
+    SkString lazy(image->isLazyGenerated() ? "is lazy" : "not lazy");
+    canvas->scale(8, 8);
+    canvas->drawImage(image, 0, 0, nullptr);
+    SkPaint paint;
+    paint.setTextSize(4);
+    canvas->drawString(lazy, 2, 5, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_042.cpp b/docs/examples/Image_042.cpp
new file mode 100644
index 0000000..f3c040c
--- /dev/null
+++ b/docs/examples/Image_042.cpp
@@ -0,0 +1,31 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f031c2a53f6a57833dc0127e674553da
+REG_FIDDLE(Image_042, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    auto drawImage = [=](sk_sp<SkImage> image, const char* label) -> void {
+        if (nullptr == image) {
+            return;
+        }
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        canvas->drawImage(image, 0, 0);
+        canvas->drawString(label, 30, image->height() / 4, paint);
+        canvas->drawString(
+                image->isLazyGenerated() ? "is lazily generated" : "not lazily generated",
+                20, image->height() * 3 / 4, paint);
+    };
+    sk_sp<SkImage> bitmapImage(SkImage::MakeFromBitmap(source));
+    sk_sp<SkImage> textureImage(SkImage::MakeFromTexture(canvas->getGrContext(), backEndTexture,
+                                kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType,
+                                kOpaque_SkAlphaType, nullptr));
+    drawImage(image, "image");
+    canvas->translate(image->width(), 0);
+    drawImage(bitmapImage, "source");
+    canvas->translate(-image->width(), image->height());
+    drawImage(textureImage, "backEndTexture");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Image_043.cpp b/docs/examples/Image_043.cpp
new file mode 100644
index 0000000..bbab4a3
--- /dev/null
+++ b/docs/examples/Image_043.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dbf5f75c1275a3013672f896767140fb
+REG_FIDDLE(Image_043, 256, 256, false, 5) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkColorSpace> normalColorSpace = SkColorSpace::MakeRGB(
+             SkColorSpace::kSRGB_RenderTargetGamma, SkColorSpace::kSRGB_Gamut);
+    sk_sp<SkColorSpace> wackyColorSpace = normalColorSpace->makeColorSpin();
+    for (auto colorSpace : { normalColorSpace, wackyColorSpace  } ) {
+        sk_sp<SkImage> colorSpaced = image->makeColorSpace(colorSpace);
+        canvas->drawImage(colorSpaced, 0, 0);
+        canvas->translate(128, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_000.cpp b/docs/examples/Matrix_000.cpp
new file mode 100644
index 0000000..ec41e41
--- /dev/null
+++ b/docs/examples/Matrix_000.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7ff17718111df6d6f95381d8a8f1b389
+REG_FIDDLE(Matrix_000, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->concat(SkMatrix::MakeScale(4, 3));
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_001.cpp b/docs/examples/Matrix_001.cpp
new file mode 100644
index 0000000..99dba42
--- /dev/null
+++ b/docs/examples/Matrix_001.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2956aeb50fa862cdb13995e1e56a4bc8
+REG_FIDDLE(Matrix_001, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    canvas->concat(SkMatrix::MakeScale(4));
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_002.cpp b/docs/examples/Matrix_002.cpp
new file mode 100644
index 0000000..7a6fe22
--- /dev/null
+++ b/docs/examples/Matrix_002.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b2479df0d9cf296ff64ac31e36684557
+REG_FIDDLE(Matrix_002, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix = SkMatrix::MakeTrans(64, 48);
+    for (int i = 0; i < 4; ++i) {
+        canvas->drawBitmap(source, 0, 0);
+        canvas->concat(matrix);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_003.cpp b/docs/examples/Matrix_003.cpp
new file mode 100644
index 0000000..9709cde
--- /dev/null
+++ b/docs/examples/Matrix_003.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6bad83b64de9266e323c29d550e04188
+REG_FIDDLE(Matrix_003, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    p.setTextSize(64);
+    for (SkScalar sx : { -1, 1 } ) {
+        for (SkScalar sy : { -1, 1 } ) {
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            SkMatrix m = SkMatrix::MakeAll(sx, 1, 128,    0, sy, 128,   0, 0, 1);
+            canvas->concat(m);
+            canvas->drawString("K", 0, 0, p);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_004.cpp b/docs/examples/Matrix_004.cpp
new file mode 100644
index 0000000..ad8f1c5
--- /dev/null
+++ b/docs/examples/Matrix_004.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ba19b36df8cd78586f3dff54e2d4c093
+REG_FIDDLE(Matrix_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkMatrix& matrix) -> void {
+        SkString typeMask;
+        typeMask += SkMatrix::kIdentity_Mask == matrix.getType() ? "kIdentity_Mask " : "";
+        typeMask += SkMatrix::kTranslate_Mask & matrix.getType() ? "kTranslate_Mask " : "";
+        typeMask += SkMatrix::kScale_Mask & matrix.getType() ? "kScale_Mask " : "";
+        typeMask += SkMatrix::kAffine_Mask & matrix.getType() ? "kAffine_Mask " : "";
+        typeMask += SkMatrix::kPerspective_Mask & matrix.getType() ? "kPerspective_Mask" : "";
+        SkDebugf("after %s: %s\n", prefix, typeMask.c_str());
+    };
+SkMatrix matrix;
+matrix.reset();
+debugster("reset", matrix);
+matrix.postTranslate(1, 0);
+debugster("postTranslate", matrix);
+matrix.postScale(2, 1);
+debugster("postScale", matrix);
+matrix.postRotate(45);
+debugster("postScale", matrix);
+SkPoint polys[][4] = {{{0, 0}, {0, 1}, {1, 1}, {1, 0}}, {{0, 0}, {0, 1}, {2, 1}, {1, 0}}};
+matrix.setPolyToPoly(polys[0], polys[1], 4);
+debugster("setPolyToPoly", matrix);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_005.cpp b/docs/examples/Matrix_005.cpp
new file mode 100644
index 0000000..940cd68
--- /dev/null
+++ b/docs/examples/Matrix_005.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8e45fe2dd52731bb2d4318686257e1d7
+REG_FIDDLE(Matrix_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, 1);
+    SkDebugf("identity flags hex: %0x decimal: %d\n", matrix.getType(), matrix.getType());
+    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, .5f);
+    SkDebugf("set all  flags hex: %0x decimal: %d\n", matrix.getType(), matrix.getType());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_006.cpp b/docs/examples/Matrix_006.cpp
new file mode 100644
index 0000000..ae7a68f
--- /dev/null
+++ b/docs/examples/Matrix_006.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=780ab376325b3cfa889ea26c0769ec11
+REG_FIDDLE(Matrix_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, 1);
+    SkDebugf("is identity: %s\n", matrix.isIdentity() ? "true" : "false");
+    matrix.setAll(1, 0, 0,   0, 1, 0,    0, 0, 2);
+    SkDebugf("is identity: %s\n", matrix.isIdentity() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_007.cpp b/docs/examples/Matrix_007.cpp
new file mode 100644
index 0000000..0b33783
--- /dev/null
+++ b/docs/examples/Matrix_007.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6287e29674a487eb94174992d45b9a34
+REG_FIDDLE(Matrix_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    for (SkScalar scaleX : { 1, 2 } ) {
+        for (SkScalar translateX : { 0, 20 } ) {
+            matrix.setAll(scaleX, 0, translateX,   0, 1, 0,    0, 0, 1);
+            SkDebugf("is scale-translate: %s\n", matrix.isScaleTranslate() ? "true" : "false");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_008.cpp b/docs/examples/Matrix_008.cpp
new file mode 100644
index 0000000..3a231d9
--- /dev/null
+++ b/docs/examples/Matrix_008.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=73ac71a8a30841873577c11c6c9b38ee
+REG_FIDDLE(Matrix_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    for (SkScalar scaleX : { 1, 2 } ) {
+        for (SkScalar translateX : { 0, 20 } ) {
+            matrix.setAll(scaleX, 0, translateX,   0, 1, 0,    0, 0, 1);
+            SkDebugf("is translate: %s\n", matrix.isTranslate() ? "true" : "false");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_009.cpp b/docs/examples/Matrix_009.cpp
new file mode 100644
index 0000000..b178cf5
--- /dev/null
+++ b/docs/examples/Matrix_009.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ce5319c036c9b5086da8a0009fe409f8
+REG_FIDDLE(Matrix_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    for (SkScalar angle: { 0, 90, 180, 270 } ) {
+        matrix.setRotate(angle);
+        SkDebugf("rectStaysRect: %s\n", matrix.rectStaysRect() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_010.cpp b/docs/examples/Matrix_010.cpp
new file mode 100644
index 0000000..e33c48a
--- /dev/null
+++ b/docs/examples/Matrix_010.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7a234c96608fb7cb8135b9940b0b15f7
+REG_FIDDLE(Matrix_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    for (SkScalar angle: { 0, 90, 180, 270 } ) {
+        matrix.setRotate(angle);
+        SkDebugf("preservesAxisAlignment: %s\n", matrix.preservesAxisAlignment() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_011.cpp b/docs/examples/Matrix_011.cpp
new file mode 100644
index 0000000..a511336
--- /dev/null
+++ b/docs/examples/Matrix_011.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=688123908c733169bbbfaf11f41ecff6
+REG_FIDDLE(Matrix_011, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    canvas->concat(matrix);
+    SkString string;
+    string.printf("hasPerspective %s", matrix.hasPerspective() ? "true" : "false");
+    canvas->drawBitmap(source, 0, 0);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(48);
+    canvas->drawString(string, 0, source.bounds().height() + 48, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_012.cpp b/docs/examples/Matrix_012.cpp
new file mode 100644
index 0000000..8b2619b
--- /dev/null
+++ b/docs/examples/Matrix_012.cpp
@@ -0,0 +1,31 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b37f4ae7fec1756433c0f984175fb14
+REG_FIDDLE(Matrix_012, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    SkMatrix m;
+    int below = 175;
+    for (SkScalar sx : { -1, 1 } ) {
+        for (SkScalar sy : { -1, 1 } ) {
+            m.setAll(sx, 1, 128,    1, sy, 32,   0, 0, 1);
+            bool isSimilarity = m.isSimilarity();
+            SkString str;
+            str.printf("sx: %g sy: %g sim: %s", sx, sy, isSimilarity ? "true" : "false");
+            {
+                SkAutoCanvasRestore autoRestore(canvas, true);
+                canvas->concat(m);
+                canvas->drawString(str, 0, 0, p);
+            }
+            if (!isSimilarity) {
+                canvas->drawString(str, 40, below, p);
+                below += 20;
+            }
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_013.cpp b/docs/examples/Matrix_013.cpp
new file mode 100644
index 0000000..11c21db
--- /dev/null
+++ b/docs/examples/Matrix_013.cpp
@@ -0,0 +1,28 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b9becf0dc24a9f00726e24a81fb72f16
+REG_FIDDLE(Matrix_013, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    SkMatrix m;
+    int pos = 0;
+    for (SkScalar sx : { 1, 2 } ) {
+        for (SkScalar kx : { 0, 1 } ) {
+            m.setAll(sx, kx, 16,    0, 1, 32,   0, 0, 1);
+            bool isSimilarity = m.isSimilarity();
+            bool preservesRightAngles = m.preservesRightAngles();
+            SkString str;
+            str.printf("sx: %g kx: %g %s %s", sx, kx, isSimilarity ? "sim" : "",
+                        preservesRightAngles ? "right" : "");
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            canvas->concat(m);
+            canvas->drawString(str, 0, pos, p);
+            pos += 20;
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_014.cpp b/docs/examples/Matrix_014.cpp
new file mode 100644
index 0000000..3254caa
--- /dev/null
+++ b/docs/examples/Matrix_014.cpp
@@ -0,0 +1,28 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3bbf75f4748420810aa2586e3c8548d9
+REG_FIDDLE(Matrix_014, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint black;
+    black.setAntiAlias(true);
+    black.setTextSize(48);
+    SkPaint gray = black;
+    gray.setColor(0xFF9f9f9f);
+    SkScalar offset[] = { 1.5f, 1.5f, 20,   1.5f, 1.5f, 20,   .03f, .01f, 2 };
+    for (int i : { SkMatrix::kMScaleX, SkMatrix::kMSkewX,  SkMatrix::kMTransX,
+                   SkMatrix::kMSkewY,  SkMatrix::kMScaleY, SkMatrix::kMTransY,
+                   SkMatrix::kMPersp0, SkMatrix::kMPersp1, SkMatrix::kMPersp2 } ) {
+        SkMatrix m;
+        m.setIdentity();
+        m.set(i, offset[i]);
+        SkAutoCanvasRestore autoRestore(canvas, true);
+        canvas->translate(22 + (i % 3) * 88, 44 + (i / 3) * 88);
+        canvas->drawString("&", 0, 0, gray);
+        canvas->concat(m);
+        canvas->drawString("&", 0, 0, black);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_015.cpp b/docs/examples/Matrix_015.cpp
new file mode 100644
index 0000000..8f2ac3c
--- /dev/null
+++ b/docs/examples/Matrix_015.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e8740493abdf0c6341762db9cee56b89
+REG_FIDDLE(Matrix_015, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setScale(42, 24);
+    SkDebugf("matrix[SkMatrix::kMScaleX] %c= 42\n", matrix[SkMatrix::kMScaleX] == 42 ? '=' : '!');
+    SkDebugf("matrix[SkMatrix::kMScaleY] %c= 24\n", matrix[SkMatrix::kMScaleY] == 24 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_016.cpp b/docs/examples/Matrix_016.cpp
new file mode 100644
index 0000000..60048ed
--- /dev/null
+++ b/docs/examples/Matrix_016.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f5ed382bd04fa7d50b2398cce2fca23a
+REG_FIDDLE(Matrix_016, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setSkew(42, 24);
+    SkDebugf("matrix.get(SkMatrix::kMSkewX) %c= 42\n",
+             matrix.get(SkMatrix::kMSkewX) == 42 ? '=' : '!');
+    SkDebugf("matrix.get(SkMatrix::kMSkewY) %c= 24\n",
+             matrix.get(SkMatrix::kMSkewY) == 24 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_017.cpp b/docs/examples/Matrix_017.cpp
new file mode 100644
index 0000000..1022447
--- /dev/null
+++ b/docs/examples/Matrix_017.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ab746d9be63975041ae8e50cba84dc3d
+REG_FIDDLE(Matrix_017, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setScale(42, 24);
+    SkDebugf("matrix.getScaleX() %c= 42\n", matrix.getScaleX() == 42 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_018.cpp b/docs/examples/Matrix_018.cpp
new file mode 100644
index 0000000..75d82fa
--- /dev/null
+++ b/docs/examples/Matrix_018.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=708b1a548a2f8661b2ab570782fbc751
+REG_FIDDLE(Matrix_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setScale(42, 24);
+    SkDebugf("matrix.getScaleY() %c= 24\n", matrix.getScaleY() == 24 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_019.cpp b/docs/examples/Matrix_019.cpp
new file mode 100644
index 0000000..0c68722
--- /dev/null
+++ b/docs/examples/Matrix_019.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6be5704506d029ffc91ba03b1d3e674b
+REG_FIDDLE(Matrix_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setSkew(42, 24);
+    SkDebugf("matrix.getSkewY() %c= 24\n", matrix.getSkewY() == 24 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_020.cpp b/docs/examples/Matrix_020.cpp
new file mode 100644
index 0000000..3374713
--- /dev/null
+++ b/docs/examples/Matrix_020.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=df3a5d3c688e7597eae1e4e07bf91ae6
+REG_FIDDLE(Matrix_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setSkew(42, 24);
+    SkDebugf("matrix.getSkewX() %c= 42\n", matrix.getSkewX() == 42 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_021.cpp b/docs/examples/Matrix_021.cpp
new file mode 100644
index 0000000..a2def0b
--- /dev/null
+++ b/docs/examples/Matrix_021.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6236f7f2b91aff977a66ba2ee2558ca4
+REG_FIDDLE(Matrix_021, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setTranslate(42, 24);
+    SkDebugf("matrix.getTranslateX() %c= 42\n", matrix.getTranslateX() == 42 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_022.cpp b/docs/examples/Matrix_022.cpp
new file mode 100644
index 0000000..2cacf70
--- /dev/null
+++ b/docs/examples/Matrix_022.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=08464e32d22421d2b254c71a84545ef5
+REG_FIDDLE(Matrix_022, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setTranslate(42, 24);
+    SkDebugf("matrix.getTranslateY() %c= 24\n", matrix.getTranslateY() == 24 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_023.cpp b/docs/examples/Matrix_023.cpp
new file mode 100644
index 0000000..1c91079
--- /dev/null
+++ b/docs/examples/Matrix_023.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a0f5bf4b55e8c33bfda29bf67e34306f
+REG_FIDDLE(Matrix_023, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix m;
+    m.setIdentity();
+    m.set(SkMatrix::kMPersp0, -0.004f);
+    SkAutoCanvasRestore autoRestore(canvas, true);
+    canvas->translate(22, 144);
+    SkPaint black;
+    black.setAntiAlias(true);
+    black.setTextSize(24);
+    SkPaint gray = black;
+    gray.setColor(0xFF9f9f9f);
+    SkString string;
+    string.appendScalar(m.getPerspX());
+    canvas->drawString(string, 0, -72, gray);
+    canvas->concat(m);
+    canvas->drawString(string, 0, 0, black);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_024.cpp b/docs/examples/Matrix_024.cpp
new file mode 100644
index 0000000..6c25677
--- /dev/null
+++ b/docs/examples/Matrix_024.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=424a00a73675dbd99ad20feb0267442b
+REG_FIDDLE(Matrix_024, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix m;
+    m.setIdentity();
+    m.set(SkMatrix::kMPersp1, -0.004f);
+    SkAutoCanvasRestore autoRestore(canvas, true);
+    canvas->translate(22, 144);
+    SkPaint black;
+    black.setAntiAlias(true);
+    black.setTextSize(24);
+    SkPaint gray = black;
+    gray.setColor(0xFF9f9f9f);
+    SkString string;
+    string.appendScalar(m.getPerspY());
+    canvas->drawString(string, 0, -72, gray);
+    canvas->concat(m);
+    canvas->drawString(string, 0, 0, black);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_025.cpp b/docs/examples/Matrix_025.cpp
new file mode 100644
index 0000000..1a38f5b
--- /dev/null
+++ b/docs/examples/Matrix_025.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f4365ef332f51f7fd25040e0771ba9a2
+REG_FIDDLE(Matrix_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setIdentity();
+    SkDebugf("with identity matrix: x = %g\n", matrix.mapXY(24, 42).fX);
+    SkScalar& skewRef = matrix[SkMatrix::kMSkewX];
+    skewRef = 0;
+    SkDebugf("after skew x mod:     x = %g\n", matrix.mapXY(24, 42).fX);
+    skewRef = 1;
+    SkDebugf("after 2nd skew x mod: x = %g\n", matrix.mapXY(24, 42).fX);
+    matrix.dirtyMatrixTypeCache();
+    SkDebugf("after dirty cache:    x = %g\n", matrix.mapXY(24, 42).fX);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_026.cpp b/docs/examples/Matrix_026.cpp
new file mode 100644
index 0000000..90b6744
--- /dev/null
+++ b/docs/examples/Matrix_026.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1d400a92ca826cc89bcb88ea051f28c8
+REG_FIDDLE(Matrix_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setIdentity();
+    SkDebugf("with identity matrix: x = %g\n", matrix.mapXY(24, 42).fX);
+    matrix.set(SkMatrix::kMSkewX, 0);
+    SkDebugf("after skew x mod:     x = %g\n", matrix.mapXY(24, 42).fX);
+    matrix.set(SkMatrix::kMSkewX, 1);
+    SkDebugf("after 2nd skew x mod: x = %g\n", matrix.mapXY(24, 42).fX);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_027.cpp b/docs/examples/Matrix_027.cpp
new file mode 100644
index 0000000..036476c
--- /dev/null
+++ b/docs/examples/Matrix_027.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a39dfed98c3c3c3a56be9ad59fe4e21e
+REG_FIDDLE(Matrix_027, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 12, 24, paint);
+    SkMatrix matrix;
+    matrix.setIdentity();
+    matrix.setScaleX(3);
+    canvas->concat(matrix);
+    canvas->drawString("x scale", 0, 48, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_028.cpp b/docs/examples/Matrix_028.cpp
new file mode 100644
index 0000000..10ce3bb
--- /dev/null
+++ b/docs/examples/Matrix_028.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f040c6dd85a02e94eaca00d5c2832604
+REG_FIDDLE(Matrix_028, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 12, 24, paint);
+    SkMatrix matrix;
+    matrix.setIdentity();
+    matrix.setScaleY(3);
+    canvas->concat(matrix);
+    canvas->drawString("y scale", 12, 48, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_029.cpp b/docs/examples/Matrix_029.cpp
new file mode 100644
index 0000000..69d0679
--- /dev/null
+++ b/docs/examples/Matrix_029.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b418d15df9829aefcc6aca93a37428bb
+REG_FIDDLE(Matrix_029, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 12, 24, paint);
+    SkMatrix matrix;
+    matrix.setIdentity();
+    matrix.setSkewY(.3f);
+    canvas->concat(matrix);
+    canvas->drawString("y skew", 12, 48, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_030.cpp b/docs/examples/Matrix_030.cpp
new file mode 100644
index 0000000..2f82a86
--- /dev/null
+++ b/docs/examples/Matrix_030.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c7177a6fbc1545be95a5ebca87e0cd0d
+REG_FIDDLE(Matrix_030, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 12, 24, paint);
+    SkMatrix matrix;
+    matrix.setIdentity();
+    matrix.setSkewX(-.7f);
+    canvas->concat(matrix);
+    canvas->drawString("x skew", 36, 48, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_031.cpp b/docs/examples/Matrix_031.cpp
new file mode 100644
index 0000000..7426973
--- /dev/null
+++ b/docs/examples/Matrix_031.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a18bc2e3607ac3a8e438bcb61fb13130
+REG_FIDDLE(Matrix_031, 256, 48, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 8, 24, paint);
+    SkMatrix matrix;
+    matrix.setIdentity();
+    matrix.setTranslateX(96);
+    canvas->concat(matrix);
+    canvas->drawString("x translate", 8, 24, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_032.cpp b/docs/examples/Matrix_032.cpp
new file mode 100644
index 0000000..c94da6c
--- /dev/null
+++ b/docs/examples/Matrix_032.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=34e3c70a72b836abf7f4858d35eecc98
+REG_FIDDLE(Matrix_032, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 8, 24, paint);
+    SkMatrix matrix;
+    matrix.setIdentity();
+    matrix.setTranslateY(24);
+    canvas->concat(matrix);
+    canvas->drawString("y translate", 8, 24, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_033.cpp b/docs/examples/Matrix_033.cpp
new file mode 100644
index 0000000..932065f
--- /dev/null
+++ b/docs/examples/Matrix_033.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=830a9e4e4bb93d25afd83b2fea63929e
+REG_FIDDLE(Matrix_033, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    for (SkScalar perspX : { -.003f, 0.f, .003f, .012f } ) {
+        SkMatrix matrix;
+        matrix.setIdentity();
+        matrix.setPerspX(perspX);
+        canvas->save();
+        canvas->concat(matrix);
+        canvas->drawBitmap(source, 0, 0);
+        canvas->restore();
+        canvas->translate(64, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_034.cpp b/docs/examples/Matrix_034.cpp
new file mode 100644
index 0000000..275cdfe
--- /dev/null
+++ b/docs/examples/Matrix_034.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=aeb258b7922c1a11b698b00f562182ec
+REG_FIDDLE(Matrix_034, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    for (SkScalar perspX : { -.003f, 0.f, .003f, .012f } ) {
+        SkMatrix matrix;
+        matrix.setIdentity();
+        matrix.setPerspY(perspX);
+        canvas->save();
+        canvas->concat(matrix);
+        canvas->drawBitmap(source, 0, 0);
+        canvas->restore();
+        canvas->translate(64, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_035.cpp b/docs/examples/Matrix_035.cpp
new file mode 100644
index 0000000..8151080
--- /dev/null
+++ b/docs/examples/Matrix_035.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=95ccfc2a89ce593e6b7a9f992a844bc0
+REG_FIDDLE(Matrix_035, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    p.setTextSize(64);
+    SkMatrix m;
+    for (SkScalar sx : { -1, 1 } ) {
+        for (SkScalar sy : { -1, 1 } ) {
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            m.setAll(sx, 1, 128,    0, sy, 64,   0, 0, 1);
+            canvas->concat(m);
+            canvas->drawString("K", 0, 0, p);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_036.cpp b/docs/examples/Matrix_036.cpp
new file mode 100644
index 0000000..8c2959c
--- /dev/null
+++ b/docs/examples/Matrix_036.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=379fc375e011050b54ed9df83c0996a7
+REG_FIDDLE(Matrix_036, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix = SkMatrix::MakeRectToRect({0, 0, 1, 1}, {3, 4, 7, 9},
+                                               SkMatrix::kFill_ScaleToFit);
+    SkScalar b[9];
+    matrix.get9(b);
+    SkDebugf("{%g, %g, %g},\n{%g, %g, %g},\n{%g, %g, %g}\n", b[0], b[1], b[2],
+             b[3], b[4], b[5], b[6], b[7], b[8]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_037.cpp b/docs/examples/Matrix_037.cpp
new file mode 100644
index 0000000..d9e65cb
--- /dev/null
+++ b/docs/examples/Matrix_037.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ec5de0d23e5fe28ba7628625d1402e85
+REG_FIDDLE(Matrix_037, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkMatrix m;
+    SkScalar buffer[9] = {4, 0, 3,    0, 5, 4,     0, 0, 1};
+    m.set9(buffer);
+    canvas->concat(m);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_038.cpp b/docs/examples/Matrix_038.cpp
new file mode 100644
index 0000000..16b8c88
--- /dev/null
+++ b/docs/examples/Matrix_038.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ca94f7922bc37ef03bbc51ad70536fcf
+REG_FIDDLE(Matrix_038, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix m;
+    m.reset();
+    SkDebugf("m.isIdentity(): %s\n", m.isIdentity() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_039.cpp b/docs/examples/Matrix_039.cpp
new file mode 100644
index 0000000..9b3ab43
--- /dev/null
+++ b/docs/examples/Matrix_039.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3979c865bb482e6ef1fafc71e56bbb91
+REG_FIDDLE(Matrix_039, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix m;
+    m.setIdentity();
+    SkDebugf("m.isIdentity(): %s\n", m.isIdentity() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_040.cpp b/docs/examples/Matrix_040.cpp
new file mode 100644
index 0000000..f808fbc
--- /dev/null
+++ b/docs/examples/Matrix_040.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=63ca62985741b1bccb5e8b9cf734874e
+REG_FIDDLE(Matrix_040, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 8, 24, paint);
+    SkMatrix matrix;
+    matrix.setTranslate(96, 24);
+    canvas->concat(matrix);
+    canvas->drawString("translate", 8, 24, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_041.cpp b/docs/examples/Matrix_041.cpp
new file mode 100644
index 0000000..53a6afb
--- /dev/null
+++ b/docs/examples/Matrix_041.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ccfc734aff2ddea0b097c83f5621de5e
+REG_FIDDLE(Matrix_041, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    canvas->drawString("normal", 8, 24, paint);
+    SkMatrix matrix;
+    matrix.setTranslate({96, 24});
+    canvas->concat(matrix);
+    canvas->drawString("translate", 8, 24, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_042.cpp b/docs/examples/Matrix_042.cpp
new file mode 100644
index 0000000..506037b
--- /dev/null
+++ b/docs/examples/Matrix_042.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4565a0792058178c88e0a129a87272d6
+REG_FIDDLE(Matrix_042, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    p.setTextSize(64);
+    SkMatrix m;
+    for (SkScalar sx : { -1, 1 } ) {
+        for (SkScalar sy : { -1, 1 } ) {
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            m.setScale(sx, sy, 128, 64);
+            canvas->concat(m);
+            canvas->drawString("%", 128, 64, p);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_043.cpp b/docs/examples/Matrix_043.cpp
new file mode 100644
index 0000000..ec67714
--- /dev/null
+++ b/docs/examples/Matrix_043.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1579d0cc109c26e69f66f73abd35fb0e
+REG_FIDDLE(Matrix_043, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    p.setTextSize(64);
+    SkMatrix m;
+    for (SkScalar sx : { -1, 1 } ) {
+        for (SkScalar sy : { -1, 1 } ) {
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            m.setScale(sx, sy);
+            m.postTranslate(128, 64);
+            canvas->concat(m);
+            canvas->drawString("@", 0, 0, p);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_044.cpp b/docs/examples/Matrix_044.cpp
new file mode 100644
index 0000000..211c756
--- /dev/null
+++ b/docs/examples/Matrix_044.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8c28db3add9cd0177225088f6df6bbb5
+REG_FIDDLE(Matrix_044, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorGRAY);
+    paint.setAntiAlias(true);
+    SkRect rect = {20, 20, 100, 100};
+    canvas->drawRect(rect, paint);
+    paint.setColor(SK_ColorRED);
+    SkMatrix matrix;
+    matrix.setRotate(25, rect.centerX(), rect.centerY());
+    canvas->concat(matrix);
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_045.cpp b/docs/examples/Matrix_045.cpp
new file mode 100644
index 0000000..a16b7e3
--- /dev/null
+++ b/docs/examples/Matrix_045.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=93efb9d191bf1b9710c173513e014d6c
+REG_FIDDLE(Matrix_045, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorGRAY);
+    paint.setAntiAlias(true);
+    SkRect rect = {20, 20, 100, 100};
+    canvas->drawRect(rect, paint);
+    paint.setColor(SK_ColorRED);
+    SkMatrix matrix;
+    matrix.setRotate(25);
+    canvas->translate(rect.centerX(), rect.centerY());
+    canvas->concat(matrix);
+    canvas->translate(-rect.centerX(), -rect.centerY());
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_046.cpp b/docs/examples/Matrix_046.cpp
new file mode 100644
index 0000000..b3542f1
--- /dev/null
+++ b/docs/examples/Matrix_046.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=187e1d9228e2e4341ef820bd77b6fda9
+REG_FIDDLE(Matrix_046, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorGRAY);
+    paint.setAntiAlias(true);
+    SkRect rect = {20, 20, 100, 100};
+    canvas->drawRect(rect, paint);
+    paint.setColor(SK_ColorRED);
+    SkMatrix matrix;
+    matrix.setSinCos(.25f, .85f, rect.centerX(), rect.centerY());
+    canvas->concat(matrix);
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_047.cpp b/docs/examples/Matrix_047.cpp
new file mode 100644
index 0000000..4ac3dfd
--- /dev/null
+++ b/docs/examples/Matrix_047.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e37a94a53c959951b059fcd624639ef6
+REG_FIDDLE(Matrix_047, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorGRAY);
+    paint.setAntiAlias(true);
+    SkRect rect = {20, 20, 100, 100};
+    canvas->drawRect(rect, paint);
+    paint.setColor(SK_ColorRED);
+    SkMatrix matrix;
+    matrix.setSinCos(.25f, .85f);
+    matrix.postTranslate(rect.centerX(), rect.centerY());
+    canvas->concat(matrix);
+    canvas->translate(-rect.centerX(), -rect.centerY());
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_048.cpp b/docs/examples/Matrix_048.cpp
new file mode 100644
index 0000000..420ff2e
--- /dev/null
+++ b/docs/examples/Matrix_048.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c3f5faddca466f78278b32b88fd5f5eb
+REG_FIDDLE(Matrix_048, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorGRAY);
+    paint.setAntiAlias(true);
+    SkRect rect = {20, 20, 100, 100};
+    canvas->drawRect(rect, paint);
+    paint.setColor(SK_ColorRED);
+    SkMatrix matrix;
+    matrix.setRSXform(SkRSXform::Make(.85f, .25f, rect.centerX(), rect.centerY()));
+    canvas->concat(matrix);
+    canvas->translate(-rect.centerX(), -rect.centerY());
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_049.cpp b/docs/examples/Matrix_049.cpp
new file mode 100644
index 0000000..62a59ed
--- /dev/null
+++ b/docs/examples/Matrix_049.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=55e0431adc6c5b1987ebb8123cc10342
+REG_FIDDLE(Matrix_049, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    p.setTextSize(48);
+    SkMatrix m;
+    for (SkScalar sx : { -1, 0, 1 } ) {
+        for (SkScalar sy : { -1, 0, 1 } ) {
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            m.setSkew(sx, sy, 96 + 64 * sx, 128 + 48 * sy);
+            canvas->concat(m);
+            canvas->drawString("K", 96 + 64 * sx, 128 + 48 * sy, p);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_050.cpp b/docs/examples/Matrix_050.cpp
new file mode 100644
index 0000000..84b49c2
--- /dev/null
+++ b/docs/examples/Matrix_050.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=05be7844e9afdd7b9bfc31c5423a70a2
+REG_FIDDLE(Matrix_050, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint p;
+    p.setAntiAlias(true);
+    p.setTextSize(48);
+    SkMatrix m;
+    for (SkScalar sx : { -1, 0, 1 } ) {
+        for (SkScalar sy : { -1, 0, 1 } ) {
+            SkAutoCanvasRestore autoRestore(canvas, true);
+            m.setSkew(sx, sy);
+            m.postTranslate(96 + 64 * sx, 128 + 48 * sy);
+            canvas->concat(m);
+            canvas->drawString("K", 0, 0, p);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_051.cpp b/docs/examples/Matrix_051.cpp
new file mode 100644
index 0000000..55e521b
--- /dev/null
+++ b/docs/examples/Matrix_051.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0381a10ac69bdefdf9d15b47cbb9fefe
+REG_FIDDLE(Matrix_051, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix, matrix2;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix2.setPolyToPoly(perspect, bitmapBounds, 4);
+    matrix.setConcat(matrix, matrix2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_052.cpp b/docs/examples/Matrix_052.cpp
new file mode 100644
index 0000000..030eda3
--- /dev/null
+++ b/docs/examples/Matrix_052.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f75a9b629aa6c51ed888f8799b5ba5f7
+REG_FIDDLE(Matrix_052, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRect rect = {20, 20, 100, 100};
+    for (int i = 0; i < 2; ++i ) {
+        SkMatrix matrix;
+        i == 0 ? matrix.reset(): matrix.setRotate(25, rect.centerX(), 320);
+        {
+            SkAutoCanvasRestore acr(canvas, true);
+            canvas->concat(matrix);
+            paint.setColor(SK_ColorGRAY);
+            canvas->drawRect(rect, paint);
+        }
+        paint.setColor(SK_ColorRED);
+        for (int j = 0; j < 2; ++j ) {
+            SkAutoCanvasRestore acr(canvas, true);
+            matrix.preTranslate(40, 40);
+            canvas->concat(matrix);
+            canvas->drawCircle(0, 0, 3, paint);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_053.cpp b/docs/examples/Matrix_053.cpp
new file mode 100644
index 0000000..0a8f531
--- /dev/null
+++ b/docs/examples/Matrix_053.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2531f8d1e05d7b6dc22f3efcd2fb84e4
+REG_FIDDLE(Matrix_053, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.preScale(.75f, 1.5f, source.width() / 2, source.height() / 2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_054.cpp b/docs/examples/Matrix_054.cpp
new file mode 100644
index 0000000..59eb544
--- /dev/null
+++ b/docs/examples/Matrix_054.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3edbdea8e43d06086abf33ec4a9b415b
+REG_FIDDLE(Matrix_054, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.preScale(.75f, 1.5f);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_055.cpp b/docs/examples/Matrix_055.cpp
new file mode 100644
index 0000000..e23e121
--- /dev/null
+++ b/docs/examples/Matrix_055.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a70bb18d67c06a20ab514e7a47924e5a
+REG_FIDDLE(Matrix_055, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.preRotate(45, source.width() / 2, source.height() / 2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_056.cpp b/docs/examples/Matrix_056.cpp
new file mode 100644
index 0000000..3596084
--- /dev/null
+++ b/docs/examples/Matrix_056.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5acd49bd931c79a808dd6c7cc0e92f72
+REG_FIDDLE(Matrix_056, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.preRotate(45);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_057.cpp b/docs/examples/Matrix_057.cpp
new file mode 100644
index 0000000..53502d2
--- /dev/null
+++ b/docs/examples/Matrix_057.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=199a18ad61d702664ce6df1d7037aa48
+REG_FIDDLE(Matrix_057, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.preSkew(.5f, 0, source.width() / 2, source.height() / 2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_058.cpp b/docs/examples/Matrix_058.cpp
new file mode 100644
index 0000000..ca1c3ee
--- /dev/null
+++ b/docs/examples/Matrix_058.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e100c543869fe8fd516ba69de79444ba
+REG_FIDDLE(Matrix_058, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.preSkew(.5f, 0);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_059.cpp b/docs/examples/Matrix_059.cpp
new file mode 100644
index 0000000..fa0de10
--- /dev/null
+++ b/docs/examples/Matrix_059.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b07e62298e7b0ab5683db199faffceb2
+REG_FIDDLE(Matrix_059, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix, matrix2;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix2.setPolyToPoly(perspect, bitmapBounds, 4);
+    matrix.preConcat(matrix2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_060.cpp b/docs/examples/Matrix_060.cpp
new file mode 100644
index 0000000..3541681
--- /dev/null
+++ b/docs/examples/Matrix_060.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f5144ef4bd7cea294fad2f756ed335af
+REG_FIDDLE(Matrix_060, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRect rect = {20, 20, 100, 100};
+    for (int i = 0; i < 2; ++i ) {
+        SkMatrix matrix;
+        i == 0 ? matrix.reset(): matrix.setRotate(25, rect.centerX(), 320);
+        {
+            SkAutoCanvasRestore acr(canvas, true);
+            canvas->concat(matrix);
+            paint.setColor(SK_ColorGRAY);
+            canvas->drawRect(rect, paint);
+        }
+        paint.setColor(SK_ColorRED);
+        for (int j = 0; j < 2; ++j ) {
+            SkAutoCanvasRestore acr(canvas, true);
+            matrix.postTranslate(40, 40);
+            canvas->concat(matrix);
+            canvas->drawCircle(0, 0, 3, paint);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_061.cpp b/docs/examples/Matrix_061.cpp
new file mode 100644
index 0000000..acba60b
--- /dev/null
+++ b/docs/examples/Matrix_061.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ed3aa18ba0ea95c85cc49aa3829fe384
+REG_FIDDLE(Matrix_061, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postScale(.75f, 1.5f, source.width() / 2, source.height() / 2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_062.cpp b/docs/examples/Matrix_062.cpp
new file mode 100644
index 0000000..e54a66f
--- /dev/null
+++ b/docs/examples/Matrix_062.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1931017698766a67d3a26423453b8095
+REG_FIDDLE(Matrix_062, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postScale(.75f, 1.5f);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_063.cpp b/docs/examples/Matrix_063.cpp
new file mode 100644
index 0000000..ef25b47
--- /dev/null
+++ b/docs/examples/Matrix_063.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e6ad0bd2999613d9e4758b661d45070c
+REG_FIDDLE(Matrix_063, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postIDiv(1, 2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_064.cpp b/docs/examples/Matrix_064.cpp
new file mode 100644
index 0000000..90c0c8b
--- /dev/null
+++ b/docs/examples/Matrix_064.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e09194ee48a81e7b375ade473d340f0d
+REG_FIDDLE(Matrix_064, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postRotate(45, source.width() / 2, source.height() / 2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_065.cpp b/docs/examples/Matrix_065.cpp
new file mode 100644
index 0000000..ec3ed3f
--- /dev/null
+++ b/docs/examples/Matrix_065.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=52e4c53e26971af5576b30de60fa70c2
+REG_FIDDLE(Matrix_065, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postRotate(45);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_066.cpp b/docs/examples/Matrix_066.cpp
new file mode 100644
index 0000000..3c4d96a
--- /dev/null
+++ b/docs/examples/Matrix_066.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8c34ae3a2b7e2742bb969819737365ec
+REG_FIDDLE(Matrix_066, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postSkew(.5f, 0, source.width() / 2, source.height() / 2);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_067.cpp b/docs/examples/Matrix_067.cpp
new file mode 100644
index 0000000..548e9bf
--- /dev/null
+++ b/docs/examples/Matrix_067.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3aa2603225dff72ac53dd359f897f494
+REG_FIDDLE(Matrix_067, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postSkew(.5f, 0);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_068.cpp b/docs/examples/Matrix_068.cpp
new file mode 100644
index 0000000..5967b5a
--- /dev/null
+++ b/docs/examples/Matrix_068.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e4226c55d9bdbc119264bd372b2b9835
+REG_FIDDLE(Matrix_068, 256, 64, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix.postConcat(matrix);
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_069.cpp b/docs/examples/Matrix_069.cpp
new file mode 100644
index 0000000..e2b975a
--- /dev/null
+++ b/docs/examples/Matrix_069.cpp
@@ -0,0 +1,31 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=17c3070b31b700ea8f52e48af9a66b6e
+REG_FIDDLE(Matrix_069, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    const char* labels[] = { "Fill", "Start", "Center", "End" };
+    SkRect rects[] = {{5, 5, 59, 59}, {5, 74, 59, 108}, {10, 123, 44, 172}, {10, 187, 54, 231}};
+    SkRect bounds;
+    source.getBounds(&bounds);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    for (auto fit : { SkMatrix::kFill_ScaleToFit, SkMatrix::kStart_ScaleToFit,
+                      SkMatrix::kCenter_ScaleToFit, SkMatrix::kEnd_ScaleToFit } ) {
+        for (auto rect : rects ) {
+            canvas->drawRect(rect, paint);
+            SkMatrix matrix;
+            if (!matrix.setRectToRect(bounds, rect, fit)) {
+                continue;
+            }
+            SkAutoCanvasRestore acr(canvas, true);
+            canvas->concat(matrix);
+            canvas->drawBitmap(source, 0, 0);
+        }
+        canvas->drawString(labels[fit], 10, 255, paint);
+        canvas->translate(64, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_070.cpp b/docs/examples/Matrix_070.cpp
new file mode 100644
index 0000000..7be4f29
--- /dev/null
+++ b/docs/examples/Matrix_070.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=69cdea599dcaaec35efcb24403f4287b
+REG_FIDDLE(Matrix_070, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const SkRect srcs[] = { {0, 0, 0, 0}, {1, 2, 3, 4} };
+    const SkRect dsts[] = { {0, 0, 0, 0}, {5, 6, 8, 9} };
+    for (auto src : srcs) {
+        for (auto dst : dsts) {
+             SkMatrix matrix;
+             matrix.setAll(-1, -1, -1, -1, -1, -1, -1, -1, -1);
+             bool success = matrix.setRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);
+             SkDebugf("src: %g, %g, %g, %g  dst: %g, %g, %g, %g  success: %s\n",
+                      src.fLeft, src.fTop, src.fRight, src.fBottom,
+                      dst.fLeft, dst.fTop, dst.fRight, dst.fBottom, success ? "true" : "false");
+             matrix.dump();
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_071.cpp b/docs/examples/Matrix_071.cpp
new file mode 100644
index 0000000..117613d
--- /dev/null
+++ b/docs/examples/Matrix_071.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a1d6a6721b39350f81021f71a1b93208
+REG_FIDDLE(Matrix_071, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const SkRect srcs[] = { {0, 0, 0, 0}, {1, 2, 3, 4} };
+    const SkRect dsts[] = { {0, 0, 0, 0}, {5, 6, 8, 9} };
+    for (auto src : srcs) {
+        for (auto dst : dsts) {
+             SkMatrix matrix = SkMatrix::MakeRectToRect(src, dst, SkMatrix::kFill_ScaleToFit);
+             SkDebugf("src: %g, %g, %g, %g  dst: %g, %g, %g, %g\n",
+                      src.fLeft, src.fTop, src.fRight, src.fBottom,
+                      dst.fLeft, dst.fTop, dst.fRight, dst.fBottom);
+             matrix.dump();
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_072.cpp b/docs/examples/Matrix_072.cpp
new file mode 100644
index 0000000..a878ce4
--- /dev/null
+++ b/docs/examples/Matrix_072.cpp
@@ -0,0 +1,34 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c851d1313e8909aaea4f0591699fdb7b
+REG_FIDDLE(Matrix_072, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    const SkPoint src[] = { { 0, 0}, {30,   0}, {30, -30}, { 0, -30} };
+    const SkPoint dst[] = { {50, 0}, {80, -10}, {90, -30}, {60, -40} };
+    SkPaint blackPaint;
+    blackPaint.setAntiAlias(true);
+    blackPaint.setTextSize(42);
+    SkPaint redPaint = blackPaint;
+    redPaint.setColor(SK_ColorRED);
+    for (int count : { 1, 2, 3, 4 } ) {
+        canvas->translate(35, 55);
+        for (int index = 0; index < count; ++index) {
+            canvas->drawCircle(src[index], 3, blackPaint);
+            canvas->drawCircle(dst[index], 3, blackPaint);
+            if (index > 0) {
+                canvas->drawLine(src[index], src[index - 1], blackPaint);
+                canvas->drawLine(dst[index], dst[index - 1], blackPaint);
+            }
+        }
+        SkMatrix matrix;
+        matrix.setPolyToPoly(src, dst, count);
+        canvas->drawString("A", src[0].fX, src[0].fY, redPaint);
+        SkAutoCanvasRestore acr(canvas, true);
+        canvas->concat(matrix);
+        canvas->drawString("A", src[0].fX, src[0].fY, redPaint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_073.cpp b/docs/examples/Matrix_073.cpp
new file mode 100644
index 0000000..881eae4
--- /dev/null
+++ b/docs/examples/Matrix_073.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0e03cd9f154603ed4b21ca56d69dae44
+REG_FIDDLE(Matrix_073, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    const SkPoint src[] = { { 10, 120}, {120, 120}, {120, 10}, {  10, 10} };
+    const SkPoint dst[] = { {150, 120}, {200, 100}, {240, 30}, { 130, 40} };
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkMatrix matrix;
+    matrix.setPolyToPoly(src, dst, 4);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, 4, src, paint);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, 4, dst, paint);
+    paint.setColor(SK_ColorBLUE);
+    paint.setStrokeWidth(3);
+    paint.setStrokeCap(SkPaint::kRound_Cap);
+    canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, dst, paint);
+    if (matrix.invert(&matrix)) {
+        canvas->concat(matrix);
+        canvas->drawPoints(SkCanvas::kPoints_PointMode, 4, dst, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_074.cpp b/docs/examples/Matrix_074.cpp
new file mode 100644
index 0000000..2fd8d5b
--- /dev/null
+++ b/docs/examples/Matrix_074.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e10adbd0bcc940c5d4d872db0e78e892
+REG_FIDDLE(Matrix_074, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkScalar affine[6];
+    SkMatrix::SetAffineIdentity(affine);
+    const char* names[] = { "ScaleX", "SkewY", "SkewX", "ScaleY", "TransX", "TransY" };
+    for (int i = 0; i < 6; ++i) {
+        SkDebugf("%s: %g ", names[i], affine[i]);
+    }
+    SkDebugf("\n");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_075.cpp b/docs/examples/Matrix_075.cpp
new file mode 100644
index 0000000..b8cff70
--- /dev/null
+++ b/docs/examples/Matrix_075.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3325bdf82bd86d9fbc4199f248afa82c
+REG_FIDDLE(Matrix_075, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setAll(2, 3, 4, 5, 6, 7, 0, 0, 1);
+    SkScalar affine[6];
+    if (matrix.asAffine(affine)) {
+        const char* names[] = { "ScaleX", "SkewY", "SkewX", "ScaleY", "TransX", "TransY" };
+        for (int i = 0; i < 6; ++i) {
+            SkDebugf("%s: %g ", names[i], affine[i]);
+        }
+        SkDebugf("\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_076.cpp b/docs/examples/Matrix_076.cpp
new file mode 100644
index 0000000..9d4e242
--- /dev/null
+++ b/docs/examples/Matrix_076.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f5b6d371c4d65e5b5ac6eebdd4b237d8
+REG_FIDDLE(Matrix_076, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setAll(2, 3, 4, 5, 6, 7, 0, 0, 1);
+    SkScalar affine[6];
+    if (matrix.asAffine(affine)) {
+        const char* names[] = { "ScaleX", "SkewY", "SkewX", "ScaleY", "TransX", "TransY" };
+        for (int i = 0; i < 6; ++i) {
+            SkDebugf("%s: %g ", names[i], affine[i]);
+        }
+        SkDebugf("\n");
+        matrix.reset();
+        matrix.setAffine(affine);
+        matrix.dump();
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_077.cpp b/docs/examples/Matrix_077.cpp
new file mode 100644
index 0000000..95319cc
--- /dev/null
+++ b/docs/examples/Matrix_077.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f99dcb00296d0c56b6c0e178e94b3534
+REG_FIDDLE(Matrix_077, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.reset();
+    const int count = 4;
+    SkPoint src[count];
+    matrix.mapRectToQuad(src, {40, 70, 180, 220} );
+    SkPaint paint;
+    paint.setARGB(77, 23, 99, 154);
+    for (int i = 0; i < 5; ++i) {
+        SkPoint dst[count];
+        matrix.mapPoints(dst, src, count);
+        canvas->drawPoints(SkCanvas::kPolygon_PointMode, count, dst, paint);
+        matrix.preRotate(35, 128, 128);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_078.cpp b/docs/examples/Matrix_078.cpp
new file mode 100644
index 0000000..4fec899
--- /dev/null
+++ b/docs/examples/Matrix_078.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=428ca171ae3bd0d3f992458ac598b97b
+REG_FIDDLE(Matrix_078, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setRotate(35, 128, 128);
+    const int count = 4;
+    SkPoint pts[count];
+    matrix.mapRectToQuad(pts, {40, 70, 180, 220} );
+    SkPaint paint;
+    paint.setARGB(77, 23, 99, 154);
+    for (int i = 0; i < 5; ++i) {
+        canvas->drawPoints(SkCanvas::kPolygon_PointMode, count, pts, paint);
+        matrix.mapPoints(pts, count);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_079.cpp b/docs/examples/Matrix_079.cpp
new file mode 100644
index 0000000..e67a7e7
--- /dev/null
+++ b/docs/examples/Matrix_079.cpp
@@ -0,0 +1,31 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d56f93e4bc763c7ba4914321ed07a8b5
+REG_FIDDLE(Matrix_079, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint3 src[] = {{3, 3, 1}, {8, 2, 2}, {5, 0, 4}, {0, 1, 3},
+                      {3, 7, 1}, {8, 6, 2}, {5, 4, 4}, {0, 5, 3}};
+    int lines[] = { 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 };
+    constexpr int count = SK_ARRAY_COUNT(src);
+    auto debugster = [=](SkPoint3 src[]) -> void {
+    for (size_t i = 0; i < SK_ARRAY_COUNT(lines); i += 2) {
+        const SkPoint3& s = src[lines[i]];
+        const SkPoint3& e = src[lines[i + 1]];
+        SkPaint paint;
+        paint.setARGB(77, 23, 99, 154);
+        canvas->drawLine(s.fX / s.fZ, s.fY / s.fZ, e.fX / e.fZ, e.fY / e.fZ, paint);
+    }
+    };
+    canvas->save();
+    canvas->translate(5, 5);
+    canvas->scale(15, 15);
+    debugster(src);
+    canvas->restore();
+    canvas->translate(128, 128);
+    SkMatrix matrix;
+    matrix.setAll(15, 0, 0, 0, 15, 0, -0.08f, 0.04f, 1);
+    matrix.mapHomogeneousPoints(src, src, count);
+    debugster(src);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_080.cpp b/docs/examples/Matrix_080.cpp
new file mode 100644
index 0000000..f321aec
--- /dev/null
+++ b/docs/examples/Matrix_080.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9e50185d502dc6903783679a84106089
+REG_FIDDLE(Matrix_080, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkMatrix matrix;
+    matrix.setRotate(60, 128, 128);
+    SkPoint lines[] = {{50, 50}, {150, 50}, {150, 150}};
+    for (size_t i = 0; i < SK_ARRAY_COUNT(lines); ++i) {
+        SkPoint pt;
+        matrix.mapXY(lines[i].fX, lines[i].fY, &pt);
+        canvas->drawCircle(pt.fX, pt.fY, 3, paint);
+    }
+    canvas->concat(matrix);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(lines), lines, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_081.cpp b/docs/examples/Matrix_081.cpp
new file mode 100644
index 0000000..d8822d2
--- /dev/null
+++ b/docs/examples/Matrix_081.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b1ead09c67a177ab8eace12b061610a7
+REG_FIDDLE(Matrix_081, 256, 256, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {30, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStrokeWidth(3);
+    for (int x : { 0, source.width() } ) {
+        for (int y : { 0, source.height() } ) {
+            canvas->drawPoint(matrix.mapXY(x, y), paint);
+        }
+    }
+    canvas->concat(matrix);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_082.cpp b/docs/examples/Matrix_082.cpp
new file mode 100644
index 0000000..831b809
--- /dev/null
+++ b/docs/examples/Matrix_082.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=918a9778c3d7d5cb306692784399f6dc
+REG_FIDDLE(Matrix_082, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkMatrix matrix;
+    matrix.reset();
+    const SkVector radii[] = {{8, 4}, {9, 1}, {6, 2}, {7, 3}};
+    for (int i = 0; i < 4; ++i) {
+        SkVector rScaled[4];
+        matrix.preScale(1.5f, 2.f);
+        matrix.mapVectors(rScaled, radii, SK_ARRAY_COUNT(radii));
+        SkRRect rrect;
+        rrect.setRectRadii({20, 20, 180, 70}, rScaled);
+        canvas->drawRRect(rrect, paint);
+        canvas->translate(0, 60);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_083.cpp b/docs/examples/Matrix_083.cpp
new file mode 100644
index 0000000..76389a8
--- /dev/null
+++ b/docs/examples/Matrix_083.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5754501a00a1323e76353fb53153e939
+REG_FIDDLE(Matrix_083, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkMatrix matrix;
+    matrix.setScale(2, 3);
+    SkVector radii[] = {{7, 7}, {3, 3}, {2, 2}, {4, 0}};
+    for (int i = 0; i < 4; ++i) {
+        SkRRect rrect;
+        rrect.setRectRadii({20, 20, 180, 70}, radii);
+        canvas->drawRRect(rrect, paint);
+        canvas->translate(0, 60);
+        matrix.mapVectors(radii, SK_ARRAY_COUNT(radii));
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_084.cpp b/docs/examples/Matrix_084.cpp
new file mode 100644
index 0000000..783acfb
--- /dev/null
+++ b/docs/examples/Matrix_084.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=aed143fc6cd0bce4ed029b98d1e61f2d
+REG_FIDDLE(Matrix_084, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorGREEN);
+    paint.setAntiAlias(true);
+    paint.setTextSize(48);
+    SkMatrix matrix;
+    matrix.setRotate(90);
+    SkVector offset = { 7, 7 };
+    for (int i = 0; i < 4; ++i) {
+        paint.setImageFilter(SkDropShadowImageFilter::Make(offset.fX, offset.fY, 3, 3,
+              SK_ColorBLUE, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr));
+        matrix.mapVector(offset.fX, offset.fY, &offset);
+        canvas->translate(0, 60);
+        canvas->drawString("Text", 50, 0, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_085.cpp b/docs/examples/Matrix_085.cpp
new file mode 100644
index 0000000..b446949
--- /dev/null
+++ b/docs/examples/Matrix_085.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8bf1518db3f369696cd3065b541a8bd7
+REG_FIDDLE(Matrix_085, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorGREEN);
+    paint.setAntiAlias(true);
+    paint.setTextSize(48);
+    SkMatrix matrix;
+    matrix.setRotate(90);
+    SkVector offset = { 7, 7 };
+    for (int i = 0; i < 4; ++i) {
+        paint.setImageFilter(SkDropShadowImageFilter::Make(offset.fX, offset.fY, 3, 3,
+              SK_ColorBLUE, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr));
+        offset = matrix.mapVector(offset.fX, offset.fY);
+        canvas->translate(0, 60);
+        canvas->drawString("Text", 50, 0, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_086.cpp b/docs/examples/Matrix_086.cpp
new file mode 100644
index 0000000..2f8c379
--- /dev/null
+++ b/docs/examples/Matrix_086.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dbcf928b035a31ca69c99392e2e2cca9
+REG_FIDDLE(Matrix_086, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkMatrix matrix;
+    matrix.setRotate(45, 128, 128);
+    SkRect rotatedBounds, bounds = {40, 50, 190, 200};
+    matrix.mapRect(&rotatedBounds, bounds );
+    paint.setColor(SK_ColorGRAY);
+    canvas->drawRect(rotatedBounds, paint);
+    canvas->concat(matrix);
+    paint.setColor(SK_ColorRED);
+    canvas->drawRect(bounds, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_087.cpp b/docs/examples/Matrix_087.cpp
new file mode 100644
index 0000000..1ca0069
--- /dev/null
+++ b/docs/examples/Matrix_087.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5fafd0bd23d1ed37425b970b4a3c6cc9
+REG_FIDDLE(Matrix_087, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkMatrix matrix;
+    matrix.setRotate(45, 128, 128);
+    SkRect bounds = {40, 50, 190, 200};
+    matrix.mapRect(&bounds);
+    paint.setColor(SK_ColorGRAY);
+    canvas->drawRect(bounds, paint);
+    canvas->concat(matrix);
+    paint.setColor(SK_ColorRED);
+    canvas->drawRect({40, 50, 190, 200}, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_088.cpp b/docs/examples/Matrix_088.cpp
new file mode 100644
index 0000000..d05d0c5
--- /dev/null
+++ b/docs/examples/Matrix_088.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3b7b1f884437ab450f986234e4aec27f
+REG_FIDDLE(Matrix_088, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect{110, 50, 180, 100};
+    SkMatrix matrix;
+    matrix.setRotate(50, 28, 28);
+    SkRect mapped = matrix.mapRect(rect);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRect(rect, paint);
+    canvas->drawRect(mapped, paint);
+    canvas->concat(matrix);
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_089.cpp b/docs/examples/Matrix_089.cpp
new file mode 100644
index 0000000..465b8de
--- /dev/null
+++ b/docs/examples/Matrix_089.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c69cd2a590b5733c3cbc92cb9ceed3f5
+REG_FIDDLE(Matrix_089, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkMatrix matrix;
+    matrix.setRotate(60, 128, 128);
+    SkRect rect = {50, 50, 150, 150};
+    SkPoint pts[4];
+    matrix.mapRectToQuad(pts, rect);
+    for (int i = 0; i < 4; ++i) {
+        canvas->drawCircle(pts[i].fX, pts[i].fY, 3, paint);
+    }
+    canvas->concat(matrix);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRect(rect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_090.cpp b/docs/examples/Matrix_090.cpp
new file mode 100644
index 0000000..5d78aa2
--- /dev/null
+++ b/docs/examples/Matrix_090.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=62bc26989c2b4c2a54d516596a71dd97
+REG_FIDDLE(Matrix_090, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkMatrix matrix;
+    SkRect rect = {100, 50, 150, 180};
+    matrix.setScale(2, .5f, rect.centerX(), rect.centerY());
+    SkRect rotated;
+    matrix.mapRectScaleTranslate(&rotated, rect);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRect(rect, paint);
+    paint.setColor(SK_ColorRED);
+    canvas->drawRect(rotated, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_091.cpp b/docs/examples/Matrix_091.cpp
new file mode 100644
index 0000000..7ba6495
--- /dev/null
+++ b/docs/examples/Matrix_091.cpp
@@ -0,0 +1,41 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6d6f2082fcf59d9f02bfb1758b87db69
+REG_FIDDLE(Matrix_091, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkMatrix matrix;
+    const SkPoint center = {108, 93};
+    matrix.setScale(2, .5f, center.fX, center.fY);
+    matrix.postRotate(45, center.fX, center.fY);
+    const SkScalar circleRadius = 50;
+    SkScalar mappedRadius = matrix.mapRadius(circleRadius);
+    SkVector minorAxis, majorAxis;
+    matrix.mapVector(0, circleRadius, &minorAxis);
+    matrix.mapVector(circleRadius, 0, &majorAxis);
+    SkString mappedArea;
+    mappedArea.printf("area = %g", mappedRadius * mappedRadius);
+    canvas->drawString(mappedArea, 145, 250, paint);
+    canvas->drawString("mappedRadius", center.fX + mappedRadius + 3, center.fY, paint);
+    paint.setColor(SK_ColorRED);
+    SkString axArea;
+    axArea.printf("area = %g", majorAxis.length() * minorAxis.length());
+    paint.setStyle(SkPaint::kFill_Style);
+    canvas->drawString(axArea, 15, 250, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRect({10, 200, 10 + majorAxis.length(), 200 + minorAxis.length()}, paint);
+    paint.setColor(SK_ColorBLACK);
+    canvas->drawLine(center.fX, center.fY, center.fX + mappedRadius, center.fY, paint);
+    canvas->drawLine(center.fX, center.fY, center.fX, center.fY + mappedRadius, paint);
+    canvas->drawRect({140, 180, 140 + mappedRadius, 180 + mappedRadius}, paint);
+    canvas->concat(matrix);
+    canvas->drawCircle(center.fX, center.fY, circleRadius, paint);
+    paint.setColor(SK_ColorRED);
+    canvas->drawLine(center.fX, center.fY, center.fX + circleRadius, center.fY, paint);
+    canvas->drawLine(center.fX, center.fY, center.fX, center.fY + circleRadius, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Matrix_092.cpp b/docs/examples/Matrix_092.cpp
new file mode 100644
index 0000000..65369ef
--- /dev/null
+++ b/docs/examples/Matrix_092.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ab57b232acef69f26de9cb23d23c8a1a
+REG_FIDDLE(Matrix_092, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    for (SkScalar px : { 0.0f, 0.1f } ) {
+        for (SkScalar py : { 0.0f, 0.1f } ) {
+            for (SkScalar sy : { 1, 2 } ) {
+                matrix.setAll(1, 0, 0,   0, sy, 0,   px, py, 1);
+                matrix.dump();
+                SkDebugf("isFixedStepInX: %s\n", matrix.isFixedStepInX() ? "true" : "false");
+            }
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_093.cpp b/docs/examples/Matrix_093.cpp
new file mode 100644
index 0000000..84914fb
--- /dev/null
+++ b/docs/examples/Matrix_093.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fad6b92b21b1e1deeae61978cec2d232
+REG_FIDDLE(Matrix_093, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    const SkPoint center = { 128, 128 };
+    matrix.setScale(20, 25, center.fX, center.fY);
+    matrix.postRotate(75, center.fX, center.fY);
+    {
+       SkAutoCanvasRestore acr(canvas, true);
+       canvas->concat(matrix);
+       canvas->drawBitmap(source, 0, 0);
+    }
+    if (matrix.isFixedStepInX()) {
+       SkPaint paint;
+       paint.setAntiAlias(true);
+       SkVector step = matrix.fixedStepInX(128);
+       SkVector end = center + step;
+       canvas->drawLine(center, end, paint);
+       SkVector arrow = { step.fX + step.fY, step.fY - step.fX};
+       arrow = arrow * .25f;
+       canvas->drawLine(end, end - arrow, paint);
+       canvas->drawLine(end, {end.fX + arrow.fY, end.fY - arrow.fX}, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_094.cpp b/docs/examples/Matrix_094.cpp
new file mode 100644
index 0000000..71030f2
--- /dev/null
+++ b/docs/examples/Matrix_094.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=39016b3cfc6bbabb09348a53822ce508
+REG_FIDDLE(Matrix_094, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkMatrix& a, const SkMatrix& b) -> void {
+        SkDebugf("%s: a %c= b a.cheapEqualTo(b): %s\n", prefix,
+                 a == b ? '=' : '!', a.cheapEqualTo(b) ? "true" : "false");
+    };
+    SkMatrix a, b;
+    a.setAll(1, 0, 0,   0, 1, 0,  0, 0, 1);
+    b.setIdentity();
+    debugster("identity", a, b);
+    a.setAll(1, -0.0f, 0,   0, 1, 0,  0, 0, 1);
+    debugster("neg zero", a, b);
+    a.setAll(1, SK_ScalarNaN, 0,   0, 1, 0,  0, 0, 1);
+    debugster(" one NaN", a, b);
+    b.setAll(1, SK_ScalarNaN, 0,   0, 1, 0,  0, 0, 1);
+    debugster("both NaN", a, b);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_095.cpp b/docs/examples/Matrix_095.cpp
new file mode 100644
index 0000000..c9b8f79
--- /dev/null
+++ b/docs/examples/Matrix_095.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3902859150b0f0c4aeb1f25d00434baa
+REG_FIDDLE(Matrix_095, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkMatrix& a, const SkMatrix& b) -> void {
+        SkDebugf("%s: a %c= b a.cheapEqualTo(b): %s\n", prefix,
+                 a == b ? '=' : '!', a.cheapEqualTo(b) ? "true" : "false");
+    };
+    SkMatrix a, b;
+    a.setAll(1, 0, 0,   0, 1, 0,  0, 0, 1);
+    b.setScale(2, 4);
+    b.postScale(0.5f, 0.25f);
+    debugster("identity", a, b);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_096.cpp b/docs/examples/Matrix_096.cpp
new file mode 100644
index 0000000..94eaf40
--- /dev/null
+++ b/docs/examples/Matrix_096.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=088ab41f877599f980a99523749b0afd
+REG_FIDDLE(Matrix_096, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkMatrix& a, const SkMatrix& b) -> void {
+        SkDebugf("%s: a %c= b a.cheapEqualTo(b): %s\n", prefix,
+                 a != b ? '!' : '=', a.cheapEqualTo(b) ? "true" : "false");
+    };
+    SkMatrix a, b;
+    a.setAll(1, 0, 0,   0, 1, 0,  1, 0, 1);
+    if (a.invert(&b)) {
+        debugster("identity", a, b);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_097.cpp b/docs/examples/Matrix_097.cpp
new file mode 100644
index 0000000..4756336
--- /dev/null
+++ b/docs/examples/Matrix_097.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8d72a4818e5a9188348f6c08ab5d8a40
+REG_FIDDLE(Matrix_097, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setRotate(45);
+    matrix.dump();
+    SkMatrix nearlyEqual;
+    nearlyEqual.setAll(0.7071f, -0.7071f, 0,   0.7071f, 0.7071f, 0,   0, 0, 1);
+    nearlyEqual.dump();
+    SkDebugf("matrix %c= nearlyEqual\n", matrix == nearlyEqual ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_098.cpp b/docs/examples/Matrix_098.cpp
new file mode 100644
index 0000000..6459cf3
--- /dev/null
+++ b/docs/examples/Matrix_098.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1d6f67904c88a806c3731879e9af4ae5
+REG_FIDDLE(Matrix_098, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setScale(42, 24);
+    SkDebugf("matrix.getMinScale() %g\n", matrix.getMinScale());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_099.cpp b/docs/examples/Matrix_099.cpp
new file mode 100644
index 0000000..e9c6061
--- /dev/null
+++ b/docs/examples/Matrix_099.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3fee4364929899649cf9efc37897e964
+REG_FIDDLE(Matrix_099, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setScale(42, 24);
+    SkDebugf("matrix.getMaxScale() %g\n", matrix.getMaxScale());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_100.cpp b/docs/examples/Matrix_100.cpp
new file mode 100644
index 0000000..a9190a3
--- /dev/null
+++ b/docs/examples/Matrix_100.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=13adba0ecf5f82247cf051b4fa4d8a9c
+REG_FIDDLE(Matrix_100, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setAll(1, 0, 0,  0, 1, 0,   0, 0, 0);
+    if (matrix.invert(&matrix)) {
+        SkScalar factor[2] = {2, 2};
+        bool result = matrix.getMinMaxScales(factor);
+        SkDebugf("matrix.getMinMaxScales() %s %g %g\n",
+                result ? "true" : "false", factor[0], factor[1]);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_101.cpp b/docs/examples/Matrix_101.cpp
new file mode 100644
index 0000000..de87d8f
--- /dev/null
+++ b/docs/examples/Matrix_101.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=139b874da0a3ede1f3df88119085c0aa
+REG_FIDDLE(Matrix_101, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setRotate(90 * SK_Scalar1);
+    matrix.postScale(1.f / 4, 1.f / 2);
+    matrix.dump();
+    SkSize scale = {SK_ScalarNaN, SK_ScalarNaN};
+    SkMatrix remaining;
+    remaining.reset();
+    bool success = matrix.decomposeScale(&scale, &remaining);
+    SkDebugf("success: %s  ", success ? "true" : "false");
+    SkDebugf("scale: %g, %g\n", scale.width(), scale.height());
+    remaining.dump();
+    SkMatrix scaleMatrix = SkMatrix::MakeScale(scale.width(), scale.height());
+    SkMatrix combined = SkMatrix::Concat(scaleMatrix, remaining);
+    combined.dump();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_102.cpp b/docs/examples/Matrix_102.cpp
new file mode 100644
index 0000000..d888fc3
--- /dev/null
+++ b/docs/examples/Matrix_102.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d961d91020f19037204a8c3fd8cb1060
+REG_FIDDLE(Matrix_102, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix m1, m2, m3;
+    m1.reset();
+    m2.setIdentity();
+    m3 = SkMatrix::I();
+    SkDebugf("m1 %c= m2\n", m1 == m2 ? '=' : '!');
+    SkDebugf("m2 %c= m3\n", m1 == m2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_103.cpp b/docs/examples/Matrix_103.cpp
new file mode 100644
index 0000000..32705a3
--- /dev/null
+++ b/docs/examples/Matrix_103.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=af0b72360c1c7a25b4754bfa47011dd5
+REG_FIDDLE(Matrix_103, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("scaleX %g\n", SkMatrix::InvalidMatrix().getScaleX());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_104.cpp b/docs/examples/Matrix_104.cpp
new file mode 100644
index 0000000..25dfda1
--- /dev/null
+++ b/docs/examples/Matrix_104.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6b4562c7052da94f3d5b2412dca41946
+REG_FIDDLE(Matrix_104, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix, matrix2;
+    SkPoint bitmapBounds[4], perspect[4] = {{50, 10}, {180, 40}, {236, 176}, {10, 206}};
+    SkRect::Make(source.bounds()).toQuad(bitmapBounds);
+    matrix.setPolyToPoly(bitmapBounds, perspect, 4);
+    matrix2.setPolyToPoly(perspect, bitmapBounds, 4);
+    SkMatrix concat = SkMatrix::Concat(matrix, matrix2);
+    canvas->concat(concat);
+    canvas->drawBitmap(source, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_105.cpp b/docs/examples/Matrix_105.cpp
new file mode 100644
index 0000000..bb6cc1a
--- /dev/null
+++ b/docs/examples/Matrix_105.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f4365ef332f51f7fd25040e0771ba9a2
+REG_FIDDLE(Matrix_105, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setIdentity();
+    SkDebugf("with identity matrix: x = %g\n", matrix.mapXY(24, 42).fX);
+    SkScalar& skewRef = matrix[SkMatrix::kMSkewX];
+    skewRef = 0;
+    SkDebugf("after skew x mod:     x = %g\n", matrix.mapXY(24, 42).fX);
+    skewRef = 1;
+    SkDebugf("after 2nd skew x mod: x = %g\n", matrix.mapXY(24, 42).fX);
+    matrix.dirtyMatrixTypeCache();
+    SkDebugf("after dirty cache:    x = %g\n", matrix.mapXY(24, 42).fX);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_106.cpp b/docs/examples/Matrix_106.cpp
new file mode 100644
index 0000000..927ea28
--- /dev/null
+++ b/docs/examples/Matrix_106.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fed43797f13796529cb6731385d6f8f3
+REG_FIDDLE(Matrix_106, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix;
+    matrix.setScaleTranslate(1, 2, 3, 4);
+    matrix.dump();
+}
+}  // END FIDDLE
diff --git a/docs/examples/Matrix_107.cpp b/docs/examples/Matrix_107.cpp
new file mode 100644
index 0000000..a9dbb93
--- /dev/null
+++ b/docs/examples/Matrix_107.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bc6c6f6a5df770287120d87f81b922eb
+REG_FIDDLE(Matrix_107, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkMatrix matrix = SkMatrix::MakeTrans(SK_ScalarNaN, 0);
+    matrix.dump();
+    SkDebugf("matrix is finite: %s\n", matrix.isFinite() ? "true" : "false");
+    SkDebugf("matrix %c= matrix\n", matrix == matrix ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_000.cpp b/docs/examples/Paint_000.cpp
new file mode 100644
index 0000000..721ccd3
--- /dev/null
+++ b/docs/examples/Paint_000.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c4b2186d85c142a481298f7144295ffd
+REG_FIDDLE(Paint_000, 256, 1, false, 0) {
+void draw(SkCanvas* canvas) {
+    #ifndef SkUserConfig_DEFINED
+    #define SkUserConfig_DEFINED
+    #define SkPaintDefaults_Flags      0x01   // always enable antialiasing
+    #define SkPaintDefaults_TextSize   24.f   // double default font size
+    #define SkPaintDefaults_Hinting    3      // use full hinting
+    #define SkPaintDefaults_MiterLimit 10.f   // use HTML Canvas miter limit setting
+    #endif
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_001.cpp b/docs/examples/Paint_001.cpp
new file mode 100644
index 0000000..164d7a2
--- /dev/null
+++ b/docs/examples/Paint_001.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b99971ad0ef243d617925289d963b62d
+REG_FIDDLE(Paint_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1;
+    paint1.setColor(SK_ColorRED);
+    SkPaint paint2(paint1);
+    paint2.setColor(SK_ColorBLUE);
+    SkDebugf("SK_ColorRED %c= paint1.getColor()\n", SK_ColorRED == paint1.getColor() ? '=' : '!');
+    SkDebugf("SK_ColorBLUE %c= paint2.getColor()\n", SK_ColorBLUE == paint2.getColor() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_002.cpp b/docs/examples/Paint_002.cpp
new file mode 100644
index 0000000..041f0ed
--- /dev/null
+++ b/docs/examples/Paint_002.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8ed1488a503cd5282b86a51614aa90b1
+REG_FIDDLE(Paint_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    float intervals[] = { 5, 5 };
+    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 2.5f));
+    SkPaint dashed(std::move(paint));
+    SkDebugf("path effect unique: %s\n", dashed.getPathEffect()->unique() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_003.cpp b/docs/examples/Paint_003.cpp
new file mode 100644
index 0000000..0ee293b
--- /dev/null
+++ b/docs/examples/Paint_003.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ef269937ade7e7353635121d9a64f9f7
+REG_FIDDLE(Paint_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setColor(SK_ColorRED);
+    paint1.reset();
+    SkDebugf("paint1 %c= paint2", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_004.cpp b/docs/examples/Paint_004.cpp
new file mode 100644
index 0000000..883e59d
--- /dev/null
+++ b/docs/examples/Paint_004.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b476a9088f80dece176ed577807d3992
+REG_FIDDLE(Paint_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setColor(SK_ColorRED);
+    paint2 = paint1;
+    SkDebugf("SK_ColorRED %c= paint1.getColor()\n", SK_ColorRED == paint1.getColor() ? '=' : '!');
+    SkDebugf("SK_ColorRED %c= paint2.getColor()\n", SK_ColorRED == paint2.getColor() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_005.cpp b/docs/examples/Paint_005.cpp
new file mode 100644
index 0000000..9c2cf69
--- /dev/null
+++ b/docs/examples/Paint_005.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9fb7459b097d713f5f1fe5675afe14f5
+REG_FIDDLE(Paint_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setColor(SK_ColorRED);
+    paint2 = std::move(paint1);
+    SkDebugf("SK_ColorRED == paint2.getColor()\n", SK_ColorRED == paint2.getColor() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_006.cpp b/docs/examples/Paint_006.cpp
new file mode 100644
index 0000000..f6f7d9e
--- /dev/null
+++ b/docs/examples/Paint_006.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7481a948e34672720337a631830586dd
+REG_FIDDLE(Paint_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setColor(SK_ColorRED);
+    paint2.setColor(0xFFFF0000);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+    float intervals[] = { 5, 5 };
+    paint1.setPathEffect(SkDashPathEffect::Make(intervals, 2, 2.5f));
+    paint2.setPathEffect(SkDashPathEffect::Make(intervals, 2, 2.5f));
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_007.cpp b/docs/examples/Paint_007.cpp
new file mode 100644
index 0000000..077ab6b
--- /dev/null
+++ b/docs/examples/Paint_007.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b6c8484b1187f555b435ad5369833be4
+REG_FIDDLE(Paint_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setColor(SK_ColorRED);
+    paint2.setColor(0xFFFF0000);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+    SkDebugf("paint1 %c= paint2\n", paint1 != paint2 ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_008.cpp b/docs/examples/Paint_008.cpp
new file mode 100644
index 0000000..34e57f6
--- /dev/null
+++ b/docs/examples/Paint_008.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7f7e1b701361912b344f90ae6b530393
+REG_FIDDLE(Paint_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setColor(SK_ColorRED);
+    paint2.setColor(0xFFFF0000);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+    SkDebugf("paint1.getHash() %c= paint2.getHash()\n",
+             paint1.getHash() == paint2.getHash() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_009.cpp b/docs/examples/Paint_009.cpp
new file mode 100644
index 0000000..18d75d5
--- /dev/null
+++ b/docs/examples/Paint_009.cpp
@@ -0,0 +1,13 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bb179ec5698ec1398ff18f3657ab73f7
+REG_FIDDLE(Paint_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint2.setHinting(SkFontHinting::kNormal);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : ':');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_010.cpp b/docs/examples/Paint_010.cpp
new file mode 100644
index 0000000..84e20b8
--- /dev/null
+++ b/docs/examples/Paint_010.cpp
@@ -0,0 +1,13 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b56b70c7ea2453c41bfa58b626953bed
+REG_FIDDLE(Paint_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("SkFontHinting::kNormal %c= paint.getHinting()\n",
+            SkFontHinting::kNormal == paint.getHinting() ? '=' : ':');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_011.cpp b/docs/examples/Paint_011.cpp
new file mode 100644
index 0000000..74b7092
--- /dev/null
+++ b/docs/examples/Paint_011.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8a3f8c309533388b01aa66e1267f322d
+REG_FIDDLE(Paint_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkDebugf("(SkPaint::kAntiAlias_Flag & paint.getFlags()) %c= 0\n",
+        SkPaint::kAntiAlias_Flag & paint.getFlags() ? '!' : '=');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_012.cpp b/docs/examples/Paint_012.cpp
new file mode 100644
index 0000000..e07904d
--- /dev/null
+++ b/docs/examples/Paint_012.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=54baed3f6bc4b9c31ba664e27767fdc7
+REG_FIDDLE(Paint_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setFlags((uint32_t) (SkPaint::kAntiAlias_Flag | SkPaint::kDither_Flag));
+    SkDebugf("paint.isAntiAlias()\n", paint.isAntiAlias() ? '!' : '=');
+    SkDebugf("paint.isDither()\n", paint.isDither() ? '!' : '=');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_013.cpp b/docs/examples/Paint_013.cpp
new file mode 100644
index 0000000..81df60e
--- /dev/null
+++ b/docs/examples/Paint_013.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a6575a49467ce8d28bb01cc7638fa04d
+REG_FIDDLE(Paint_013, 512, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocN32Pixels(50, 50);
+    SkCanvas offscreen(bitmap);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(10);
+    for (bool antialias : { false, true }) {
+        paint.setColor(antialias ? SK_ColorRED : SK_ColorBLUE);
+        paint.setAntiAlias(antialias);
+        bitmap.eraseColor(0);
+        offscreen.drawLine(5, 5, 15, 30, paint);
+        canvas->drawLine(5, 5, 15, 30, paint);
+        canvas->save();
+        canvas->scale(10, 10);
+        canvas->drawBitmap(bitmap, antialias ? 12 : 0, 0);
+        canvas->restore();
+        canvas->translate(15, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_014.cpp b/docs/examples/Paint_014.cpp
new file mode 100644
index 0000000..eb9a134
--- /dev/null
+++ b/docs/examples/Paint_014.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d7d5f4f7da7acd5104a652f490c6f7b8
+REG_FIDDLE(Paint_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("paint.isAntiAlias() %c= !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)\n",
+            paint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag) ? '=' : '!');
+    paint.setAntiAlias(true);
+    SkDebugf("paint.isAntiAlias() %c= !!(paint.getFlags() & SkPaint::kAntiAlias_Flag)\n",
+            paint.isAntiAlias() == !!(paint.getFlags() & SkPaint::kAntiAlias_Flag) ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_015.cpp b/docs/examples/Paint_015.cpp
new file mode 100644
index 0000000..760fd53
--- /dev/null
+++ b/docs/examples/Paint_015.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c2ff148374d01cbef845b223e725905c
+REG_FIDDLE(Paint_015, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setAntiAlias(true);
+    paint2.setFlags(paint2.getFlags() | SkPaint::kAntiAlias_Flag);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_016.cpp b/docs/examples/Paint_016.cpp
new file mode 100644
index 0000000..892f7f6
--- /dev/null
+++ b/docs/examples/Paint_016.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b26507690b71462f44642b911890bbf
+REG_FIDDLE(Paint_016, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bm16;
+    bm16.allocPixels(SkImageInfo::Make(32, 32, kRGB_565_SkColorType, kOpaque_SkAlphaType));
+    SkCanvas c16(bm16);
+    SkPaint colorPaint;
+    for (auto dither : { false, true } ) {
+        colorPaint.setDither(dither);
+        for (auto colors : { 0xFF333333, 0xFF666666, 0xFF999999, 0xFFCCCCCC } ) {
+            for (auto mask : { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF } ) {
+                 colorPaint.setColor(colors & mask);
+                 c16.drawRect({0, 0, 8, 4}, colorPaint);
+                 c16.translate(8, 0);
+            }
+            c16.translate(-32, 4);
+        }
+    }
+    canvas->scale(8, 8);
+    canvas->drawBitmap(bm16, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_017.cpp b/docs/examples/Paint_017.cpp
new file mode 100644
index 0000000..0fe47e1
--- /dev/null
+++ b/docs/examples/Paint_017.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=76d4d4a7931a48495e4d5f54e073be53
+REG_FIDDLE(Paint_017, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    canvas->clear(0);
+    SkBitmap bm32;
+    bm32.allocPixels(SkImageInfo::Make(20, 10, kN32_SkColorType, kPremul_SkAlphaType));
+    SkCanvas c32(bm32);
+    SkPoint points[] = {{0, 0}, {20, 0}};
+    SkColor colors[] = {0xFF334455, 0xFF662211 };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(
+                     points, colors, nullptr, SK_ARRAY_COUNT(colors),
+                     SkShader::kClamp_TileMode, 0, nullptr));
+    paint.setDither(true);
+    c32.drawPaint(paint);
+    canvas->scale(12, 12);
+    canvas->drawBitmap(bm32, 0, 0);
+    paint.setBlendMode(SkBlendMode::kPlus);
+    canvas->drawBitmap(bm32, 0, 11, &paint);
+    canvas->drawBitmap(bm32, 0, 11, &paint);
+    canvas->drawBitmap(bm32, 0, 11, &paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_018.cpp b/docs/examples/Paint_018.cpp
new file mode 100644
index 0000000..fc94d59
--- /dev/null
+++ b/docs/examples/Paint_018.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f4ce93f6c5e7335436a985377fd980c0
+REG_FIDDLE(Paint_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("paint.isDither() %c= !!(paint.getFlags() & SkPaint::kDither_Flag)\n",
+            paint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag) ? '=' : '!');
+    paint.setDither(true);
+    SkDebugf("paint.isDither() %c= !!(paint.getFlags() & SkPaint::kDither_Flag)\n",
+            paint.isDither() == !!(paint.getFlags() & SkPaint::kDither_Flag) ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_019.cpp b/docs/examples/Paint_019.cpp
new file mode 100644
index 0000000..8371e78
--- /dev/null
+++ b/docs/examples/Paint_019.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=69b7162e8324d9239dd02dd9ada2bdff
+REG_FIDDLE(Paint_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setDither(true);
+    paint2.setFlags(paint2.getFlags() | SkPaint::kDither_Flag);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_020.cpp b/docs/examples/Paint_020.cpp
new file mode 100644
index 0000000..8517d11
--- /dev/null
+++ b/docs/examples/Paint_020.cpp
@@ -0,0 +1,28 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4606ae1be792d6bc46d496432f050ee9
+REG_FIDDLE(Paint_020, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocN32Pixels(24, 33);
+    SkCanvas offscreen(bitmap);
+    offscreen.clear(SK_ColorWHITE);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(20);
+    for (bool lcd : { false, true }) {
+        paint.setLCDRenderText(lcd);
+        for (bool subpixel : { false, true }) {
+            paint.setSubpixelText(subpixel);
+            offscreen.drawString(",,,,", 0, 4, paint);
+            offscreen.translate(0, 7);
+        }
+    }
+    canvas->drawBitmap(bitmap, 4, 12);
+    canvas->scale(9, 9);
+    canvas->drawBitmap(bitmap, 4, -1);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_021.cpp b/docs/examples/Paint_021.cpp
new file mode 100644
index 0000000..f5a31cd
--- /dev/null
+++ b/docs/examples/Paint_021.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2890ad644f980637837e6fcb386fb462
+REG_FIDDLE(Paint_021, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const char testStr[] = "xxxx xxxx";
+    for (auto linearText : { false, true } ) {
+        paint.setLinearText(linearText);
+        paint.setTextSize(24);
+        canvas->drawString(paint.isLinearText() ? "linear" : "hinted", 128, 30, paint);
+        for (SkScalar textSize = 8; textSize < 30; textSize *= 1.22f) {
+            paint.setTextSize(textSize);
+            canvas->translate(0, textSize);
+            canvas->drawString(testStr, 10, 0, paint);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_022.cpp b/docs/examples/Paint_022.cpp
new file mode 100644
index 0000000..a027542
--- /dev/null
+++ b/docs/examples/Paint_022.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c93bb912f3bddfb4d96d3ad70ada552b
+REG_FIDDLE(Paint_022, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const char testStr[] = "abcd efgh";
+    for (int textSize : { 12, 24 } ) {
+        paint.setTextSize(textSize);
+        for (auto linearText : { false, true } ) {
+            paint.setLinearText(linearText);
+            SkString width;
+            width.appendScalar(paint.measureText(testStr, SK_ARRAY_COUNT(testStr), nullptr));
+            canvas->translate(0, textSize + 4);
+            canvas->drawString(testStr, 10, 0, paint);
+            canvas->drawString(width, 128, 0, paint);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_023.cpp b/docs/examples/Paint_023.cpp
new file mode 100644
index 0000000..d7763e5
--- /dev/null
+++ b/docs/examples/Paint_023.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=abe9afc0932e2199324ae6cbb396e67c
+REG_FIDDLE(Paint_023, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("paint.isSubpixelText() %c= !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)\n",
+        paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag) ? '=' : '!');
+    paint.setSubpixelText(true);
+    SkDebugf("paint.isSubpixelText() %c= !!(paint.getFlags() & SkPaint::kSubpixelText_Flag)\n",
+        paint.isSubpixelText() == !!(paint.getFlags() & SkPaint::kSubpixelText_Flag) ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_024.cpp b/docs/examples/Paint_024.cpp
new file mode 100644
index 0000000..38c6c78
--- /dev/null
+++ b/docs/examples/Paint_024.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a77bbc1a4e3be9a8ab0f842f877c5ee4
+REG_FIDDLE(Paint_024, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setSubpixelText(true);
+    paint2.setFlags(paint2.getFlags() | SkPaint::kSubpixelText_Flag);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_025.cpp b/docs/examples/Paint_025.cpp
new file mode 100644
index 0000000..7965028
--- /dev/null
+++ b/docs/examples/Paint_025.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=68e1fd95dd2fd06a333899d2bd2396b9
+REG_FIDDLE(Paint_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("paint.isLCDRenderText() %c= !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)\n",
+        paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag) ? '=' : '!');
+    paint.setLCDRenderText(true);
+    SkDebugf("paint.isLCDRenderText() %c= !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag)\n",
+        paint.isLCDRenderText() == !!(paint.getFlags() & SkPaint::kLCDRenderText_Flag) ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_026.cpp b/docs/examples/Paint_026.cpp
new file mode 100644
index 0000000..cfc1c4f
--- /dev/null
+++ b/docs/examples/Paint_026.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=50dedf8450159571a3edaf4f0050defe
+REG_FIDDLE(Paint_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setLCDRenderText(true);
+    paint2.setFlags(paint2.getFlags() | SkPaint::kLCDRenderText_Flag);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_027.cpp b/docs/examples/Paint_027.cpp
new file mode 100644
index 0000000..ec902f5
--- /dev/null
+++ b/docs/examples/Paint_027.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eba10b27b790e87183ae451b3fc5c4b1
+REG_FIDDLE(Paint_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("paint.isEmbeddedBitmapText() %c="
+            " !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)\n",
+            paint.isEmbeddedBitmapText() ==
+            !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag) ? '=' : '!');
+    paint.setEmbeddedBitmapText(true);
+    SkDebugf("paint.isEmbeddedBitmapText() %c="
+            " !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag)\n",
+            paint.isEmbeddedBitmapText() ==
+            !!(paint.getFlags() & SkPaint::kEmbeddedBitmapText_Flag) ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_028.cpp b/docs/examples/Paint_028.cpp
new file mode 100644
index 0000000..eaf8925
--- /dev/null
+++ b/docs/examples/Paint_028.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=246dffdd93a484ba4ad7ecf71198a5d4
+REG_FIDDLE(Paint_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setEmbeddedBitmapText(true);
+    paint2.setFlags(paint2.getFlags() | SkPaint::kEmbeddedBitmapText_Flag);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_029.cpp b/docs/examples/Paint_029.cpp
new file mode 100644
index 0000000..55fcde7
--- /dev/null
+++ b/docs/examples/Paint_029.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=aa4781afbe3b90e7ef56a287e5b9ce1e
+REG_FIDDLE(Paint_029, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    for (auto forceAutoHinting : { false, true} ) {
+    paint.setAutohinted(forceAutoHinting);
+    SkDebugf("paint.isAutohinted() %c="
+            " !!(paint.getFlags() & SkPaint::kAutoHinting_Flag)\n",
+            paint.isAutohinted() ==
+            !!(paint.getFlags() & SkPaint::kAutoHinting_Flag) ? '=' : '!');
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_030.cpp b/docs/examples/Paint_030.cpp
new file mode 100644
index 0000000..4cbfaf2
--- /dev/null
+++ b/docs/examples/Paint_030.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4e185306d7de9390fe8445eed0139309
+REG_FIDDLE(Paint_030, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const char testStr[] = "xxxx xxxx";
+        for (auto forceAutoHinting : { false, true} ) {
+        paint.setAutohinted(forceAutoHinting);
+        paint.setTextSize(24);
+        canvas->drawString(paint.isAutohinted() ? "auto-hinted" : "default", 108, 30, paint);
+        for (SkScalar textSize = 8; textSize < 30; textSize *= 1.22f) {
+            paint.setTextSize(textSize);
+            canvas->translate(0, textSize);
+            canvas->drawString(testStr, 10, 0, paint);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_031.cpp b/docs/examples/Paint_031.cpp
new file mode 100644
index 0000000..5bc3168
--- /dev/null
+++ b/docs/examples/Paint_031.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e811f4829a2daaaeaad3795504a7e02a
+REG_FIDDLE(Paint_031, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(40);
+    canvas->drawString("OjYy_-", 10, 35, paint);
+    paint.setFakeBoldText(true);
+    canvas->drawString("OjYy_-", 10, 75, paint);
+    // create a custom fake bold by varying the stroke width
+    paint.setFakeBoldText(false);
+    paint.setStyle(SkPaint::kStrokeAndFill_Style);
+    paint.setStrokeWidth(40.f / 48);
+    canvas->drawString("OjYy_-", 10, 115, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_032.cpp b/docs/examples/Paint_032.cpp
new file mode 100644
index 0000000..29bff63
--- /dev/null
+++ b/docs/examples/Paint_032.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f54d1f85b16073b80b9eef2e1a1d151d
+REG_FIDDLE(Paint_032, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("paint.isFakeBoldText() %c= !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)\n",
+        paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag) ? '=' : '!');
+    paint.setFakeBoldText(true);
+    SkDebugf("paint.isFakeBoldText() %c= !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag)\n",
+        paint.isFakeBoldText() == !!(paint.getFlags() & SkPaint::kFakeBoldText_Flag) ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_033.cpp b/docs/examples/Paint_033.cpp
new file mode 100644
index 0000000..264adc6
--- /dev/null
+++ b/docs/examples/Paint_033.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=594d47858eb11028cb626515a520910a
+REG_FIDDLE(Paint_033, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setFakeBoldText(true);
+    paint2.setFlags(paint2.getFlags() | SkPaint::kFakeBoldText_Flag);
+    SkDebugf("paint1 %c= paint2\n", paint1 == paint2 ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_034.cpp b/docs/examples/Paint_034.cpp
new file mode 100644
index 0000000..5820f01
--- /dev/null
+++ b/docs/examples/Paint_034.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=69369cff2f5b145a6f616092513266a0
+REG_FIDDLE(Paint_034, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    canvas->scale(.2f, .2f);
+    for (SkFilterQuality q : { kNone_SkFilterQuality, kLow_SkFilterQuality,
+                               kMedium_SkFilterQuality, kHigh_SkFilterQuality } ) {
+        paint.setFilterQuality(q);
+        canvas->drawImage(image.get(), 0, 0, &paint);
+        canvas->translate(550, 0);
+        if (kLow_SkFilterQuality == q) canvas->translate(-1100, 550);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_035.cpp b/docs/examples/Paint_035.cpp
new file mode 100644
index 0000000..c264a95
--- /dev/null
+++ b/docs/examples/Paint_035.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d4ca1f23809b6835c4ba46ea98a86900
+REG_FIDDLE(Paint_035, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("kNone_SkFilterQuality %c= paint.getFilterQuality()\n",
+            kNone_SkFilterQuality == paint.getFilterQuality() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_036.cpp b/docs/examples/Paint_036.cpp
new file mode 100644
index 0000000..fa09234
--- /dev/null
+++ b/docs/examples/Paint_036.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e4288fabf24ee60b645e8bb6ea0afadf
+REG_FIDDLE(Paint_036, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setFilterQuality(kHigh_SkFilterQuality);
+    SkDebugf("kHigh_SkFilterQuality %c= paint.getFilterQuality()\n",
+            kHigh_SkFilterQuality == paint.getFilterQuality() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_037.cpp b/docs/examples/Paint_037.cpp
new file mode 100644
index 0000000..5ecfff5
--- /dev/null
+++ b/docs/examples/Paint_037.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=214b559d75c65a7bef6ef4be1f860053
+REG_FIDDLE(Paint_037, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(0x8000FF00);  // transparent green
+    canvas->drawCircle(50, 50, 40, paint);
+    paint.setARGB(128, 255, 0, 0); // transparent red
+    canvas->drawCircle(80, 50, 40, paint);
+    paint.setColor(SK_ColorBLUE);
+    paint.setAlpha(0x80);
+    canvas->drawCircle(65, 65, 40, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_038.cpp b/docs/examples/Paint_038.cpp
new file mode 100644
index 0000000..7d821ea
--- /dev/null
+++ b/docs/examples/Paint_038.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=72d41f890203109a41f589a7403acae9
+REG_FIDDLE(Paint_038, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorYELLOW);
+    SkColor y = paint.getColor();
+    SkDebugf("Yellow is %d%% red, %d%% green, and %d%% blue.\n", (int) (SkColorGetR(y) / 2.55f),
+            (int) (SkColorGetG(y) / 2.55f), (int) (SkColorGetB(y) / 2.55f));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_039.cpp b/docs/examples/Paint_039.cpp
new file mode 100644
index 0000000..2aaced0
--- /dev/null
+++ b/docs/examples/Paint_039.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8512ea2176f36e8f1aeef311ff228790
+REG_FIDDLE(Paint_039, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorYELLOW);
+    SkColor4f y = paint.getColor4f();
+    SkDebugf("Yellow is %d%% red, %d%% green, and %d%% blue.\n", (int) (y.fR * 100),
+            (int) (y.fG * 100), (int) (y.fB * 100));
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_040.cpp b/docs/examples/Paint_040.cpp
new file mode 100644
index 0000000..8a4406d
--- /dev/null
+++ b/docs/examples/Paint_040.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6e70f18300bd676a3c056ceb6b62f8df
+REG_FIDDLE(Paint_040, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint green1, green2;
+    unsigned a = 255;
+    unsigned r = 0;
+    unsigned g = 255;
+    unsigned b = 0;
+    green1.setColor((a << 24) + (r << 16) + (g << 8) + (b << 0));
+    green2.setColor(0xFF00FF00);
+    SkDebugf("green1 %c= green2\n", green1 == green2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_041.cpp b/docs/examples/Paint_041.cpp
new file mode 100644
index 0000000..7ce0ca6
--- /dev/null
+++ b/docs/examples/Paint_041.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fa60859e3d03bdc117a05b32e093a8f1
+REG_FIDDLE(Paint_041, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint green1, green2;
+    green1.setColor4f({0, 1, 0, 1}, nullptr);  // R=0 G=1 B=0 A=1
+    green2.setColor(0xFF00FF00); // A=255 R=0 G=255 B=0
+    SkDebugf("green1 %c= green2\n", green1 == green2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_042.cpp b/docs/examples/Paint_042.cpp
new file mode 100644
index 0000000..1a144dc
--- /dev/null
+++ b/docs/examples/Paint_042.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9a85bb62fe3d877b18fb7f952c4fa7f7
+REG_FIDDLE(Paint_042, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("255 %c= paint.getAlpha()\n", 255 == paint.getAlpha() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_043.cpp b/docs/examples/Paint_043.cpp
new file mode 100644
index 0000000..138fe60
--- /dev/null
+++ b/docs/examples/Paint_043.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6ddc0360512dfb9947e75c17e6a8103d
+REG_FIDDLE(Paint_043, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(0x00112233);
+    paint.setAlpha(0x44);
+    SkDebugf("0x44112233 %c= paint.getColor()\n", 0x44112233 == paint.getColor() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_044.cpp b/docs/examples/Paint_044.cpp
new file mode 100644
index 0000000..0a826fd
--- /dev/null
+++ b/docs/examples/Paint_044.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cb62e4755789ed32f7120dc55984959d
+REG_FIDDLE(Paint_044, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint transRed1, transRed2;
+    transRed1.setARGB(255 / 2, 255, 0, 0);
+    transRed2.setColor(SkColorSetARGB(255 / 2, 255, 0, 0));
+    SkDebugf("transRed1 %c= transRed2", transRed1 == transRed2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_045.cpp b/docs/examples/Paint_045.cpp
new file mode 100644
index 0000000..d445b06
--- /dev/null
+++ b/docs/examples/Paint_045.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1c5e18c3c0102d2dac86a78ba8c8ce01
+REG_FIDDLE(Paint_045, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("SkPaint::kFill_Style %c= paint.getStyle()\n",
+            SkPaint::kFill_Style == paint.getStyle() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_046.cpp b/docs/examples/Paint_046.cpp
new file mode 100644
index 0000000..2657797
--- /dev/null
+++ b/docs/examples/Paint_046.cpp
@@ -0,0 +1,32 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c7bb6248e4735b8d1a32d02fba40d344
+REG_FIDDLE(Paint_046, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(5);
+    SkRegion region;
+    region.op(140, 10, 160, 30, SkRegion::kUnion_Op);
+    region.op(170, 40, 190, 60, SkRegion::kUnion_Op);
+    SkBitmap bitmap;
+    bitmap.setInfo(SkImageInfo::MakeA8(50, 50), 50);
+    uint8_t pixels[50][50];
+    for (int x = 0; x < 50; ++x) {
+        for (int y = 0; y < 50; ++y) {
+            pixels[y][x] = (x + y) % 5 ? 0xFF : 0x00;
+        }
+    }
+    bitmap.setPixels(pixels);
+    for (auto style : { SkPaint::kFill_Style,
+                        SkPaint::kStroke_Style,
+                        SkPaint::kStrokeAndFill_Style }) {
+        paint.setStyle(style);
+        canvas->drawLine(10, 10, 60, 60, paint);
+        canvas->drawRect({80, 10, 130, 60}, paint);
+        canvas->drawRegion(region, paint);
+        canvas->drawBitmap(bitmap, 200, 10, &paint);
+        canvas->translate(0, 80);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_047.cpp b/docs/examples/Paint_047.cpp
new file mode 100644
index 0000000..6ed1fb2
--- /dev/null
+++ b/docs/examples/Paint_047.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5112c7209a19e035c61cef33a624a652
+REG_FIDDLE(Paint_047, 256, 170, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    for (bool antialias : { false, true }) {
+        paint.setAntiAlias(antialias);
+        for (int width = 0; width <= 4; ++width) {
+            SkScalar offset = antialias * 100 + width * 20;
+            paint.setStrokeWidth(width * 0.25f);
+            canvas->drawLine(10 + offset,  10, 20 + offset,  60, paint);
+            canvas->drawLine(10 + offset, 110, 60 + offset, 160, paint);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_048.cpp b/docs/examples/Paint_048.cpp
new file mode 100644
index 0000000..476e5c6
--- /dev/null
+++ b/docs/examples/Paint_048.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=99aa73f64df8bbf06e656cd891a81b9e
+REG_FIDDLE(Paint_048, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("0 %c= paint.getStrokeWidth()\n", 0 == paint.getStrokeWidth() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_049.cpp b/docs/examples/Paint_049.cpp
new file mode 100644
index 0000000..73e6103
--- /dev/null
+++ b/docs/examples/Paint_049.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0c4446c0870b5c7b5a2efe77ff92afb8
+REG_FIDDLE(Paint_049, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(5);
+    paint.setStrokeWidth(-1);
+    SkDebugf("5 %c= paint.getStrokeWidth()\n", 5 == paint.getStrokeWidth() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_050.cpp b/docs/examples/Paint_050.cpp
new file mode 100644
index 0000000..1cdc48c
--- /dev/null
+++ b/docs/examples/Paint_050.cpp
@@ -0,0 +1,36 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5de2de0f00354e59074a9bb1a42d5a63
+REG_FIDDLE(Paint_050, 384, 170, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint pts[] = {{ 10, 50 }, { 110, 80 }, { 10, 110 }};
+    SkVector v[] = { pts[0] - pts[1], pts[2] - pts[1] };
+    SkScalar angle1 = SkScalarATan2(v[0].fY, v[0].fX);
+    SkScalar angle2 = SkScalarATan2(v[1].fY, v[1].fX);
+    const SkScalar strokeWidth = 20;
+    SkScalar miterLimit = 1 / SkScalarSin((angle2 - angle1) / 2);
+    SkScalar miterLength = strokeWidth * miterLimit;
+    SkPath path;
+    path.moveTo(pts[0]);
+    path.lineTo(pts[1]);
+    path.lineTo(pts[2]);
+    SkPaint paint;  // set to default kMiter_Join
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeMiter(miterLimit);
+    paint.setStrokeWidth(strokeWidth);
+    canvas->drawPath(path, paint);
+    paint.setStrokeWidth(1);
+    canvas->drawLine(pts[1].fX - miterLength / 2, pts[1].fY + 50,
+                     pts[1].fX + miterLength / 2, pts[1].fY + 50, paint);
+    canvas->translate(200, 0);
+    miterLimit *= 0.99f;
+    paint.setStrokeMiter(miterLimit);
+    paint.setStrokeWidth(strokeWidth);
+    canvas->drawPath(path, paint);
+    paint.setStrokeWidth(1);
+    canvas->drawLine(pts[1].fX - miterLength / 2, pts[1].fY + 50,
+                     pts[1].fX + miterLength / 2, pts[1].fY + 50, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_051.cpp b/docs/examples/Paint_051.cpp
new file mode 100644
index 0000000..91f92a4
--- /dev/null
+++ b/docs/examples/Paint_051.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=50da74a43b725f07a914df588c867d36
+REG_FIDDLE(Paint_051, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("default miter limit == %g\n", paint.getStrokeMiter());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_052.cpp b/docs/examples/Paint_052.cpp
new file mode 100644
index 0000000..931be17
--- /dev/null
+++ b/docs/examples/Paint_052.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=700b284dbc97785c6a9c9636088713ad
+REG_FIDDLE(Paint_052, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeMiter(8);
+    paint.setStrokeMiter(-1);
+    SkDebugf("default miter limit == %g\n", paint.getStrokeMiter());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_053.cpp b/docs/examples/Paint_053.cpp
new file mode 100644
index 0000000..132e754
--- /dev/null
+++ b/docs/examples/Paint_053.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2bffb6384cc20077e632e7d01da045ca
+REG_FIDDLE(Paint_053, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    SkPath path;
+    path.moveTo(30, 30);
+    path.lineTo(30, 30);
+    path.moveTo(70, 30);
+    path.lineTo(90, 40);
+    for (SkPaint::Cap c : { SkPaint::kButt_Cap, SkPaint::kRound_Cap, SkPaint::kSquare_Cap } ) {
+        paint.setStrokeCap(c);
+        canvas->drawPath(path, paint);
+        canvas->translate(0, 70);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_054.cpp b/docs/examples/Paint_054.cpp
new file mode 100644
index 0000000..2bca248
--- /dev/null
+++ b/docs/examples/Paint_054.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=aabf9baee8e026fae36fca30e955512b
+REG_FIDDLE(Paint_054, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("kButt_Cap %c= default stroke cap\n",
+            SkPaint::kButt_Cap == paint.getStrokeCap() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_055.cpp b/docs/examples/Paint_055.cpp
new file mode 100644
index 0000000..6f9efbe
--- /dev/null
+++ b/docs/examples/Paint_055.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=de83fbd848a4625345b4b87a6e55d98a
+REG_FIDDLE(Paint_055, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeCap(SkPaint::kRound_Cap);
+    paint.setStrokeCap((SkPaint::Cap) SkPaint::kCapCount);
+    SkDebugf("kRound_Cap %c= paint.getStrokeCap()\n",
+            SkPaint::kRound_Cap == paint.getStrokeCap() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_056.cpp b/docs/examples/Paint_056.cpp
new file mode 100644
index 0000000..b4388bb
--- /dev/null
+++ b/docs/examples/Paint_056.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=917c44b504d3f9308571fd3835d90a0d
+REG_FIDDLE(Paint_056, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    SkPath path;
+    path.moveTo(30, 20);
+    path.lineTo(40, 40);
+    path.conicTo(70, 20, 100, 20, .707f);
+    for (SkPaint::Join j : { SkPaint::kMiter_Join, SkPaint::kRound_Join, SkPaint::kBevel_Join } ) {
+        paint.setStrokeJoin(j);
+        canvas->drawPath(path, paint);
+        canvas->translate(0, 70);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_057.cpp b/docs/examples/Paint_057.cpp
new file mode 100644
index 0000000..d7ede5e
--- /dev/null
+++ b/docs/examples/Paint_057.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3b1aebacc21c1836a52876b9b0b3905e
+REG_FIDDLE(Paint_057, 462, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo(10, 50);
+    path.quadTo(35, 110, 60, 210);
+    path.quadTo(105, 110, 130, 10);
+    SkPaint paint;  // set to default kMiter_Join
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(20);
+    canvas->drawPath(path, paint);
+    canvas->translate(150, 0);
+    paint.setStrokeJoin(SkPaint::kBevel_Join);
+    canvas->drawPath(path, paint);
+    canvas->translate(150, 0);
+    paint.setStrokeJoin(SkPaint::kRound_Join);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_058.cpp b/docs/examples/Paint_058.cpp
new file mode 100644
index 0000000..01e43c4
--- /dev/null
+++ b/docs/examples/Paint_058.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=31bf751d0a8ddf176b871810820d8199
+REG_FIDDLE(Paint_058, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("kMiter_Join %c= default stroke join\n",
+            SkPaint::kMiter_Join == paint.getStrokeJoin() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_059.cpp b/docs/examples/Paint_059.cpp
new file mode 100644
index 0000000..7f606eb
--- /dev/null
+++ b/docs/examples/Paint_059.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=48d963ad4286eddf680f9c511eb6da91
+REG_FIDDLE(Paint_059, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeJoin(SkPaint::kMiter_Join);
+    paint.setStrokeJoin((SkPaint::Join) SkPaint::kJoinCount);
+    SkDebugf("kMiter_Join %c= paint.getStrokeJoin()\n",
+            SkPaint::kMiter_Join == paint.getStrokeJoin() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_060.cpp b/docs/examples/Paint_060.cpp
new file mode 100644
index 0000000..880dc79
--- /dev/null
+++ b/docs/examples/Paint_060.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cedd6233848198e1fca4d1e14816baaf
+REG_FIDDLE(Paint_060, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint strokePaint;
+    strokePaint.setAntiAlias(true);
+    strokePaint.setStyle(SkPaint::kStroke_Style);
+    strokePaint.setStrokeWidth(.1f);
+    SkPath strokePath;
+    strokePath.moveTo(.08f, .08f);
+    strokePath.quadTo(.09f, .08f, .17f, .17f);
+    SkPath fillPath;
+    SkPaint outlinePaint(strokePaint);
+    outlinePaint.setStrokeWidth(2);
+    SkMatrix scale = SkMatrix::MakeScale(300, 300);
+    for (SkScalar precision : { 0.01f, .1f, 1.f, 10.f, 100.f } ) {
+        strokePaint.getFillPath(strokePath, &fillPath, nullptr, precision);
+        fillPath.transform(scale);
+        canvas->drawPath(fillPath, outlinePaint);
+        canvas->translate(60, 0);
+        if (1.f == precision) canvas->translate(-180, 100);
+    }
+    strokePath.transform(scale);
+    strokePaint.setStrokeWidth(30);
+    canvas->drawPath(strokePath, strokePaint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_061.cpp b/docs/examples/Paint_061.cpp
new file mode 100644
index 0000000..3b783ea
--- /dev/null
+++ b/docs/examples/Paint_061.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e6d8ca0cc17e0b475bd54dd995825468
+REG_FIDDLE(Paint_061, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(10);
+    SkPath strokePath;
+    strokePath.moveTo(20, 20);
+    strokePath.lineTo(100, 100);
+    canvas->drawPath(strokePath, paint);
+    SkPath fillPath;
+    paint.getFillPath(strokePath, &fillPath);
+    paint.setStrokeWidth(2);
+    canvas->translate(40, 0);
+    canvas->drawPath(fillPath, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_062.cpp b/docs/examples/Paint_062.cpp
new file mode 100644
index 0000000..4e265ab
--- /dev/null
+++ b/docs/examples/Paint_062.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c015dc2010c15e1c00b4f7330232b0f7
+REG_FIDDLE(Paint_062, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkPoint center = { 50, 50 };
+   SkScalar radius = 50;
+   const SkColor colors[] = { 0xFFFFFFFF, 0xFF000000 };
+   paint.setShader(SkGradientShader::MakeRadial(center, radius, colors,
+        nullptr, SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
+   for (SkScalar a : { 0.3f, 0.6f, 1.0f } ) {
+       paint.setAlpha((int) (a * 255));
+       canvas->drawCircle(center.fX, center.fY, radius, paint);
+       canvas->translate(70, 70);
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_063.cpp b/docs/examples/Paint_063.cpp
new file mode 100644
index 0000000..6d267bd
--- /dev/null
+++ b/docs/examples/Paint_063.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fe80fd80b98a20823db7fb9a077243c7
+REG_FIDDLE(Paint_063, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkBitmap bitmap;
+   bitmap.setInfo(SkImageInfo::MakeA8(5, 1), 5);  // bitmap only contains alpha
+   uint8_t pixels[5] = { 0x22, 0x55, 0x88, 0xBB, 0xFF };
+   bitmap.setPixels(pixels);
+   paint.setShader(SkShader::MakeBitmapShader(bitmap,
+            SkShader::kMirror_TileMode, SkShader::kMirror_TileMode));
+   for (SkColor c : { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN } ) {
+       paint.setColor(c);  // all components in color affect shader
+       canvas->drawCircle(50, 50, 50, paint);
+       canvas->translate(70, 70);
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_064.cpp b/docs/examples/Paint_064.cpp
new file mode 100644
index 0000000..649a137
--- /dev/null
+++ b/docs/examples/Paint_064.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=09f15b9fd88882850da2d235eb86292f
+REG_FIDDLE(Paint_064, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("nullptr %c= shader\n", paint.getShader() ? '!' : '=');
+   paint.setShader(SkShader::MakeEmptyShader());
+   SkDebugf("nullptr %c= shader\n", paint.getShader() ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_065.cpp b/docs/examples/Paint_065.cpp
new file mode 100644
index 0000000..7ed2d3b
--- /dev/null
+++ b/docs/examples/Paint_065.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=53da0295972a418cbc9607bbb17feaa8
+REG_FIDDLE(Paint_065, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint1, paint2;
+   paint1.setShader(SkShader::MakeEmptyShader());
+   SkDebugf("shader unique: %s\n", paint1.getShader()->unique() ? "true" : "false");
+   paint2.setShader(paint1.refShader());
+   SkDebugf("shader unique: %s\n", paint1.getShader()->unique() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_066.cpp b/docs/examples/Paint_066.cpp
new file mode 100644
index 0000000..7ae55f3
--- /dev/null
+++ b/docs/examples/Paint_066.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=77e64d5bae9b1ba037fd99252bb4aa58
+REG_FIDDLE(Paint_066, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColor(SK_ColorBLUE);
+    paint.setShader(SkShader::MakeColorShader(SK_ColorRED));
+    canvas->drawRect(SkRect::MakeWH(40, 40), paint);
+    paint.setShader(nullptr);
+    canvas->translate(50, 0);
+    canvas->drawRect(SkRect::MakeWH(40, 40), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_067.cpp b/docs/examples/Paint_067.cpp
new file mode 100644
index 0000000..20a61be
--- /dev/null
+++ b/docs/examples/Paint_067.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5abde56ca2f89a18b8e231abd1b57c56
+REG_FIDDLE(Paint_067, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setColorFilter(SkColorMatrixFilter::MakeLightingFilter(0xFFFFFF, 0xFF0000));
+    for (SkColor c : { SK_ColorBLACK, SK_ColorGREEN } ) {
+        paint.setColor(c);
+        canvas->drawRect(SkRect::MakeXYWH(10, 10, 50, 50), paint);
+        paint.setAlpha(0x80);
+        canvas->drawRect(SkRect::MakeXYWH(60, 60, 50, 50), paint);
+        canvas->translate(100, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_068.cpp b/docs/examples/Paint_068.cpp
new file mode 100644
index 0000000..bd8d7d0
--- /dev/null
+++ b/docs/examples/Paint_068.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=093bdc627d6b59002670fd290931f6c9
+REG_FIDDLE(Paint_068, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("nullptr %c= color filter\n", paint.getColorFilter() ? '!' : '=');
+   paint.setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY, SkBlendMode::kSrcIn));
+   SkDebugf("nullptr %c= color filter\n", paint.getColorFilter() ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_069.cpp b/docs/examples/Paint_069.cpp
new file mode 100644
index 0000000..59bb757
--- /dev/null
+++ b/docs/examples/Paint_069.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b588c95fa4c86ddbc4b0546762f08297
+REG_FIDDLE(Paint_069, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setColorFilter(SkColorFilter::MakeModeFilter(0xFFFF0000, SkBlendMode::kSrcATop));
+    SkDebugf("color filter unique: %s\n", paint1.getColorFilter()->unique() ? "true" : "false");
+    paint2.setColorFilter(paint1.refColorFilter());
+    SkDebugf("color filter unique: %s\n", paint1.getColorFilter()->unique() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_070.cpp b/docs/examples/Paint_070.cpp
new file mode 100644
index 0000000..eeac356
--- /dev/null
+++ b/docs/examples/Paint_070.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c7b786dc9b3501cd0eaba47494b6fa31
+REG_FIDDLE(Paint_070, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   paint.setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY, SkBlendMode::kSrcIn));
+   canvas->drawRect(SkRect::MakeWH(50, 50), paint);
+   paint.setColorFilter(nullptr);
+   canvas->translate(70, 0);
+   canvas->drawRect(SkRect::MakeWH(50, 50), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_071.cpp b/docs/examples/Paint_071.cpp
new file mode 100644
index 0000000..94769e7
--- /dev/null
+++ b/docs/examples/Paint_071.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=73092d4d06faecea3c204d852a4dd8a8
+REG_FIDDLE(Paint_071, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint normal, blender;
+    normal.setColor(0xFF58a889);
+    blender.setColor(0xFF8958a8);
+    canvas->clear(0);
+    for (SkBlendMode m : { SkBlendMode::kSrcOver, SkBlendMode::kSrcIn, SkBlendMode::kSrcOut } ) {
+        normal.setBlendMode(SkBlendMode::kSrcOver);
+        canvas->drawOval(SkRect::MakeXYWH(30, 30, 30, 80), normal);
+        blender.setBlendMode(m);
+        canvas->drawOval(SkRect::MakeXYWH(10, 50, 80, 30), blender);
+        canvas->translate(70, 70);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_072.cpp b/docs/examples/Paint_072.cpp
new file mode 100644
index 0000000..398df14
--- /dev/null
+++ b/docs/examples/Paint_072.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a1e059c8f6740fa2044cc64152b39dda
+REG_FIDDLE(Paint_072, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("kSrcOver %c= getBlendMode\n",
+            SkBlendMode::kSrcOver == paint.getBlendMode() ? '=' : '!');
+   paint.setBlendMode(SkBlendMode::kSrc);
+   SkDebugf("kSrcOver %c= getBlendMode\n",
+            SkBlendMode::kSrcOver == paint.getBlendMode() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_073.cpp b/docs/examples/Paint_073.cpp
new file mode 100644
index 0000000..fa05574
--- /dev/null
+++ b/docs/examples/Paint_073.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=257c9473db7a2b3a0fb2b9e2431e59a6
+REG_FIDDLE(Paint_073, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("isSrcOver %c= true\n", paint.isSrcOver() ? '=' : '!');
+   paint.setBlendMode(SkBlendMode::kSrc);
+   SkDebugf("isSrcOver %c= true\n", paint.isSrcOver() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_074.cpp b/docs/examples/Paint_074.cpp
new file mode 100644
index 0000000..e8f8d6a
--- /dev/null
+++ b/docs/examples/Paint_074.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=257c9473db7a2b3a0fb2b9e2431e59a6
+REG_FIDDLE(Paint_074, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("isSrcOver %c= true\n", paint.isSrcOver() ? '=' : '!');
+   paint.setBlendMode(SkBlendMode::kSrc);
+   SkDebugf("isSrcOver %c= true\n", paint.isSrcOver() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_075.cpp b/docs/examples/Paint_075.cpp
new file mode 100644
index 0000000..b430bf0
--- /dev/null
+++ b/docs/examples/Paint_075.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8cf5684b187d60f09e11c4a48993ea39
+REG_FIDDLE(Paint_075, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(16);
+    SkScalar intervals[] = {30, 10};
+    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 1));
+    canvas->drawRoundRect({20, 20, 120, 120}, 20, 20, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_076.cpp b/docs/examples/Paint_076.cpp
new file mode 100644
index 0000000..58d04f9
--- /dev/null
+++ b/docs/examples/Paint_076.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=211a1b14bfa6c4332082c8eab4fbc5fd
+REG_FIDDLE(Paint_076, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("nullptr %c= path effect\n", paint.getPathEffect() ? '!' : '=');
+   paint.setPathEffect(SkCornerPathEffect::Make(10));
+   SkDebugf("nullptr %c= path effect\n", paint.getPathEffect() ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_077.cpp b/docs/examples/Paint_077.cpp
new file mode 100644
index 0000000..e4aed13
--- /dev/null
+++ b/docs/examples/Paint_077.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f56039b94c702c2704c8c5100e623aca
+REG_FIDDLE(Paint_077, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    SkScalar intervals[] = {1, 2};
+    paint1.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 10));
+    SkDebugf("path effect unique: %s\n", paint1.getPathEffect()->unique() ? "true" : "false");
+    paint2.setPathEffect(paint1.refPathEffect());
+    SkDebugf("path effect unique: %s\n", paint1.getPathEffect()->unique() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_078.cpp b/docs/examples/Paint_078.cpp
new file mode 100644
index 0000000..1dfadf4
--- /dev/null
+++ b/docs/examples/Paint_078.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=52dd55074ca0b7d520d04e750ca2a0d7
+REG_FIDDLE(Paint_078, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setPathEffect(SkDiscretePathEffect::Make(3, 5));
+    canvas->drawRect(SkRect::MakeXYWH(40, 40, 175, 175), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_079.cpp b/docs/examples/Paint_079.cpp
new file mode 100644
index 0000000..dbac604
--- /dev/null
+++ b/docs/examples/Paint_079.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=55d7b9d482ac8e17a6153f555a8adb8d
+REG_FIDDLE(Paint_079, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setMaskFilter(SkMaskFilter::MakeBlur(kSolid_SkBlurStyle, 3));
+    canvas->drawRect(SkRect::MakeXYWH(40, 40, 175, 175), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_080.cpp b/docs/examples/Paint_080.cpp
new file mode 100644
index 0000000..062f261
--- /dev/null
+++ b/docs/examples/Paint_080.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5ac4b31371726da87bb7390b385e9fee
+REG_FIDDLE(Paint_080, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("nullptr %c= mask filter\n", paint.getMaskFilter() ? '!' : '=');
+   paint.setMaskFilter(SkMaskFilter::MakeBlur(kOuter_SkBlurStyle, 3));
+   SkDebugf("nullptr %c= mask filter\n", paint.getMaskFilter() ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_081.cpp b/docs/examples/Paint_081.cpp
new file mode 100644
index 0000000..2d5e215
--- /dev/null
+++ b/docs/examples/Paint_081.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=084b0dc3cebd78718c651d58f257f799
+REG_FIDDLE(Paint_081, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 1));
+    SkDebugf("mask filter unique: %s\n", paint1.getMaskFilter()->unique() ? "true" : "false");
+    paint2.setMaskFilter(paint1.refMaskFilter());
+    SkDebugf("mask filter unique: %s\n", paint1.getMaskFilter()->unique() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_082.cpp b/docs/examples/Paint_082.cpp
new file mode 100644
index 0000000..5870a93
--- /dev/null
+++ b/docs/examples/Paint_082.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a993831c40f3e134f809134e3b74e4a6
+REG_FIDDLE(Paint_082, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(10);
+    paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 10));
+    canvas->drawRect(SkRect::MakeXYWH(40, 40, 175, 175), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_083.cpp b/docs/examples/Paint_083.cpp
new file mode 100644
index 0000000..93314e5
--- /dev/null
+++ b/docs/examples/Paint_083.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1a7a5062725139760962582f599f1b97
+REG_FIDDLE(Paint_083, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTypeface(SkTypeface::MakeFromName(nullptr, SkFontStyle()));
+    paint.setAntiAlias(true);
+    paint.setTextSize(36);
+    canvas->drawString("A Big Hello!", 10, 40, paint);
+    paint.setTypeface(nullptr);
+    paint.setFakeBoldText(true);
+    canvas->drawString("A Big Hello!", 10, 80, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_084.cpp b/docs/examples/Paint_084.cpp
new file mode 100644
index 0000000..369ba3b
--- /dev/null
+++ b/docs/examples/Paint_084.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5ce718e5a184baaac80e7098d7dad67b
+REG_FIDDLE(Paint_084, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("nullptr %c= typeface\n", paint.getTypeface() ? '!' : '=');
+   paint.setTypeface(SkTypeface::MakeFromName("monospace", SkFontStyle()));
+   SkDebugf("nullptr %c= typeface\n", paint.getTypeface() ? '!' : '=');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_085.cpp b/docs/examples/Paint_085.cpp
new file mode 100644
index 0000000..69fb155
--- /dev/null
+++ b/docs/examples/Paint_085.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b5aa7e555a0dc31be69db7cadf471a1
+REG_FIDDLE(Paint_085, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint1, paint2;
+   paint1.setTypeface(SkTypeface::MakeFromName("monospace",
+            SkFontStyle(SkFontStyle::kNormal_Weight, SkFontStyle::kNormal_Width,
+            SkFontStyle::kItalic_Slant)));
+   SkDebugf("typeface1 %c= typeface2\n",
+            paint1.getTypeface() == paint2.getTypeface() ? '=' : '!');
+   paint2.setTypeface(paint1.refTypeface());
+   SkDebugf("typeface1 %c= typeface2\n",
+            paint1.getTypeface() == paint2.getTypeface() ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_086.cpp b/docs/examples/Paint_086.cpp
new file mode 100644
index 0000000..b1427ee
--- /dev/null
+++ b/docs/examples/Paint_086.cpp
@@ -0,0 +1,15 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0e6fbb7773cd925b274552f4cd1abef2
+REG_FIDDLE(Paint_086, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTypeface(SkTypeface::MakeFromName("monospace", SkFontStyle()));
+    canvas->drawString("hamburgerfons", 10, 30, paint);
+    paint.setTypeface(nullptr);
+    canvas->drawString("hamburgerfons", 10, 50, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_087.cpp b/docs/examples/Paint_087.cpp
new file mode 100644
index 0000000..9b769ad
--- /dev/null
+++ b/docs/examples/Paint_087.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ece04ee3d3761e3425f37c8f06f054c1
+REG_FIDDLE(Paint_087, 256, 256, false, 0) {
+#include "SkBlurImageFilter.h"
+
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(2);
+    SkRegion region;
+    region.op( 10, 10, 50, 50, SkRegion::kUnion_Op);
+    region.op( 10, 50, 90, 90, SkRegion::kUnion_Op);
+    paint.setImageFilter(SkBlurImageFilter::Make(5.0f, 5.0f, nullptr));
+    canvas->drawRegion(region, paint);
+    paint.setImageFilter(nullptr);
+    paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 5));
+    canvas->translate(100, 100);
+    canvas->drawRegion(region, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_088.cpp b/docs/examples/Paint_088.cpp
new file mode 100644
index 0000000..8efd014
--- /dev/null
+++ b/docs/examples/Paint_088.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c11f8eaa1dd149bc18db21e23ce26904
+REG_FIDDLE(Paint_088, 256, 256, true, 0) {
+#include "SkBlurImageFilter.h"
+
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("nullptr %c= image filter\n", paint.getImageFilter() ? '!' : '=');
+   paint.setImageFilter(SkBlurImageFilter::Make(kOuter_SkBlurStyle, 3, nullptr, nullptr));
+   SkDebugf("nullptr %c= image filter\n", paint.getImageFilter() ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_089.cpp b/docs/examples/Paint_089.cpp
new file mode 100644
index 0000000..40e8ac9
--- /dev/null
+++ b/docs/examples/Paint_089.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=13f09088b569251547107d14ae989dc1
+REG_FIDDLE(Paint_089, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    paint1.setImageFilter(SkOffsetImageFilter::Make(25, 25, nullptr));
+    SkDebugf("image filter unique: %s\n", paint1.getImageFilter()->unique() ? "true" : "false");
+    paint2.setImageFilter(paint1.refImageFilter());
+    SkDebugf("image filter unique: %s\n", paint1.getImageFilter()->unique() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_090.cpp b/docs/examples/Paint_090.cpp
new file mode 100644
index 0000000..b027df5
--- /dev/null
+++ b/docs/examples/Paint_090.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6679d6e4ec632715ee03e68391bd7f9a
+REG_FIDDLE(Paint_090, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkBitmap bitmap;
+    bitmap.allocN32Pixels(100, 100);
+    SkCanvas offscreen(bitmap);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(SK_ColorWHITE);
+    paint.setTextSize(96);
+    offscreen.clear(0);
+    offscreen.drawString("e", 20, 70, paint);
+    paint.setImageFilter(
+           SkLightingImageFilter::MakePointLitDiffuse(SkPoint3::Make(80, 100, 10),
+           SK_ColorWHITE, 1, 2, nullptr, nullptr));
+    canvas->drawBitmap(bitmap, 0, 0, &paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_091.cpp b/docs/examples/Paint_091.cpp
new file mode 100644
index 0000000..cfcc748
--- /dev/null
+++ b/docs/examples/Paint_091.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=84ec12a36e50df5ac565cc7a75ffbe9f
+REG_FIDDLE(Paint_091, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkLayerDrawLooper::LayerInfo info;
+    info.fPaintBits = (SkLayerDrawLooper::BitFlags) SkLayerDrawLooper::kColorFilter_Bit;
+    info.fColorMode = SkBlendMode::kSrc;
+    SkLayerDrawLooper::Builder looperBuilder;
+    SkPaint* loopPaint = looperBuilder.addLayer(info);
+    loopPaint->setColor(SK_ColorRED);
+    info.fOffset.set(20, 20);
+    loopPaint = looperBuilder.addLayer(info);
+    loopPaint->setColor(SK_ColorBLUE);
+    SkPaint paint;
+    paint.setDrawLooper(looperBuilder.detach());
+    canvas->drawCircle(50, 50, 50, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_092.cpp b/docs/examples/Paint_092.cpp
new file mode 100644
index 0000000..408422f
--- /dev/null
+++ b/docs/examples/Paint_092.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=af4c5acc7a91e7f23c2af48018903ad4
+REG_FIDDLE(Paint_092, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPaint paint;
+   SkDebugf("nullptr %c= draw looper\n", paint.getDrawLooper() ? '!' : '=');
+   SkLayerDrawLooper::Builder looperBuilder;
+   paint.setDrawLooper(looperBuilder.detach());
+   SkDebugf("nullptr %c= draw looper\n", paint.getDrawLooper() ? '!' : '=');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_093.cpp b/docs/examples/Paint_093.cpp
new file mode 100644
index 0000000..3093275
--- /dev/null
+++ b/docs/examples/Paint_093.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2a3782c33f04ed17a725d0e449c6f7c3
+REG_FIDDLE(Paint_093, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint1, paint2;
+    SkLayerDrawLooper::Builder looperBuilder;
+    paint1.setDrawLooper(looperBuilder.detach());
+    SkDebugf("draw looper unique: %s\n", paint1.getDrawLooper()->unique() ? "true" : "false");
+    paint2.setDrawLooper(paint1.refDrawLooper());
+    SkDebugf("draw looper unique: %s\n", paint1.getDrawLooper()->unique() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_094.cpp b/docs/examples/Paint_094.cpp
new file mode 100644
index 0000000..db39fd6
--- /dev/null
+++ b/docs/examples/Paint_094.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bf10f838b330f0a3a3266d42ea68a638
+REG_FIDDLE(Paint_094, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setDrawLooper(SkBlurDrawLooper::Make(0x7FFF0000, 4, -5, -10));
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(10);
+    paint.setAntiAlias(true);
+    paint.setColor(0x7f0000ff);
+    canvas->drawCircle(70, 70, 50, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Paint_095.cpp b/docs/examples/Paint_095.cpp
new file mode 100644
index 0000000..0d6f600
--- /dev/null
+++ b/docs/examples/Paint_095.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=91c9a3e498bb9412e4522a95d076ed5f
+REG_FIDDLE(Paint_095, 256, 135, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    canvas->drawString("12 point", 10, 20, paint);
+    paint.setTextSize(24);
+    canvas->drawString("24 point", 10, 60, paint);
+    paint.setTextSize(48);
+    canvas->drawString("48 point", 10, 120, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_096.cpp b/docs/examples/Paint_096.cpp
new file mode 100644
index 0000000..4a3b2f0
--- /dev/null
+++ b/docs/examples/Paint_096.cpp
@@ -0,0 +1,12 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=983e2a71ba72d4ba8c945420040b8f1c
+REG_FIDDLE(Paint_096, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("12 %c= default text size\n", 12 == paint.getTextSize() ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_097.cpp b/docs/examples/Paint_097.cpp
new file mode 100644
index 0000000..d25d44d
--- /dev/null
+++ b/docs/examples/Paint_097.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6510c9e2f57b83c47e67829e7a68d493
+REG_FIDDLE(Paint_097, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("12 %c= text size\n", 12 == paint.getTextSize() ? '=' : '!');
+    paint.setTextSize(-20);
+    SkDebugf("12 %c= text size\n", 12 == paint.getTextSize() ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_098.cpp b/docs/examples/Paint_098.cpp
new file mode 100644
index 0000000..4a3c7f9
--- /dev/null
+++ b/docs/examples/Paint_098.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d13d787c1e36f515319fc998411c1d91
+REG_FIDDLE(Paint_098, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    paint.setTextScaleX(.8f);
+    canvas->drawString("narrow", 10, 20, paint);
+    paint.setTextScaleX(1);
+    canvas->drawString("normal", 10, 60, paint);
+    paint.setTextScaleX(1.2f);
+    canvas->drawString("wide", 10, 100, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_099.cpp b/docs/examples/Paint_099.cpp
new file mode 100644
index 0000000..5fc1117
--- /dev/null
+++ b/docs/examples/Paint_099.cpp
@@ -0,0 +1,12 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5dc8e58f6910cb8e4de9ed60f888188b
+REG_FIDDLE(Paint_099, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("1 %c= default text scale x\n", 1 == paint.getTextScaleX() ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_100.cpp b/docs/examples/Paint_100.cpp
new file mode 100644
index 0000000..683f21b
--- /dev/null
+++ b/docs/examples/Paint_100.cpp
@@ -0,0 +1,13 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a75bbdb8bb866b125c4c1dd5e967d470
+REG_FIDDLE(Paint_100, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextScaleX(0.f / 0.f);
+    SkDebugf("text scale %s-a-number\n", SkScalarIsNaN(paint.getTextScaleX()) ? "not" : "is");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_101.cpp b/docs/examples/Paint_101.cpp
new file mode 100644
index 0000000..6ca7eba
--- /dev/null
+++ b/docs/examples/Paint_101.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=aff208b0aab265f273045b27e683c17c
+REG_FIDDLE(Paint_101, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(24);
+    paint.setTextSkewX(-.25f);
+    canvas->drawString("right-leaning", 10, 100, paint);
+    paint.setTextSkewX(0);
+    canvas->drawString("normal", 10, 60, paint);
+    paint.setTextSkewX(.25f);
+    canvas->drawString("left-leaning", 10, 20, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_102.cpp b/docs/examples/Paint_102.cpp
new file mode 100644
index 0000000..3d16133
--- /dev/null
+++ b/docs/examples/Paint_102.cpp
@@ -0,0 +1,12 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=11c10f466dae0d1639dbb9f6a0040218
+REG_FIDDLE(Paint_102, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("0 %c= default text skew x\n", 0 == paint.getTextSkewX() ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_103.cpp b/docs/examples/Paint_103.cpp
new file mode 100644
index 0000000..bc18d6c
--- /dev/null
+++ b/docs/examples/Paint_103.cpp
@@ -0,0 +1,13 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6bd705a6e0c5f8ee24f302fe531bfabc
+REG_FIDDLE(Paint_103, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextScaleX(1.f / 0.f);
+    SkDebugf("text scale %s-finite\n", SkScalarIsFinite(paint.getTextScaleX()) ? "is" : "not");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_104.cpp b/docs/examples/Paint_104.cpp
new file mode 100644
index 0000000..1eccff6
--- /dev/null
+++ b/docs/examples/Paint_104.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=767fa4e7b6300e16a419f9881f0f9d3d
+REG_FIDDLE(Paint_104, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    const char hello8[] = "Hello" "\xE2" "\x98" "\xBA";
+    const uint16_t hello16[] = { 'H', 'e', 'l', 'l', 'o', 0x263A };
+    const uint32_t hello32[] = { 'H', 'e', 'l', 'l', 'o', 0x263A };
+    paint.setTextSize(24);
+    canvas->drawText(hello8, sizeof(hello8) - 1, 10, 30, paint);
+    paint.setTextEncoding(kUTF16_SkTextEncoding);
+    canvas->drawText(hello16, sizeof(hello16), 10, 60, paint);
+    paint.setTextEncoding(kUTF32_SkTextEncoding);
+    canvas->drawText(hello32, sizeof(hello32), 10, 90, paint);
+    uint16_t glyphs[SK_ARRAY_COUNT(hello32)];
+    paint.textToGlyphs(hello32, sizeof(hello32), glyphs);
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    canvas->drawText(glyphs, sizeof(glyphs), 10, 120, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_105.cpp b/docs/examples/Paint_105.cpp
new file mode 100644
index 0000000..e5f5c7c
--- /dev/null
+++ b/docs/examples/Paint_105.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0d21e968e9a4c78c902ae3ef494941a0
+REG_FIDDLE(Paint_105, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("kUTF8_SkTextEncoding %c= text encoding\n",
+            kUTF8_SkTextEncoding == paint.getTextEncoding() ? '=' : '!');
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    SkDebugf("kGlyphID_SkTextEncoding %c= text encoding\n",
+            kGlyphID_SkTextEncoding == paint.getTextEncoding() ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_106.cpp b/docs/examples/Paint_106.cpp
new file mode 100644
index 0000000..0fd8de7
--- /dev/null
+++ b/docs/examples/Paint_106.cpp
@@ -0,0 +1,13 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a5d1ba0dbf42afb797ffdb07647b5cb9
+REG_FIDDLE(Paint_106, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextEncoding((SkTextEncoding) 4);
+    SkDebugf("4 %c= text encoding\n", (SkTextEncoding) 4 == paint.getTextEncoding() ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_107.cpp b/docs/examples/Paint_107.cpp
new file mode 100644
index 0000000..9f68365
--- /dev/null
+++ b/docs/examples/Paint_107.cpp
@@ -0,0 +1,15 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=59d9b8249afa1c2af6186711250ce240
+REG_FIDDLE(Paint_107, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(32);
+    SkScalar lineHeight = paint.getFontMetrics(nullptr);
+    canvas->drawString("line 1", 10, 40, paint);
+    canvas->drawString("line 2", 10, 40 + lineHeight, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_108.cpp b/docs/examples/Paint_108.cpp
new file mode 100644
index 0000000..219cfae
--- /dev/null
+++ b/docs/examples/Paint_108.cpp
@@ -0,0 +1,15 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=424741e26e1b174e43087d67422ce14f
+REG_FIDDLE(Paint_108, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    for (SkScalar textSize : { 12, 18, 24, 32 } ) {
+        paint.setTextSize(textSize);
+        SkDebugf("textSize: %g fontSpacing: %g\n", textSize, paint.getFontSpacing());
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_109.cpp b/docs/examples/Paint_109.cpp
new file mode 100644
index 0000000..c3edc25
--- /dev/null
+++ b/docs/examples/Paint_109.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d11136d8a74f63009da2a7f550710823
+REG_FIDDLE(Paint_109, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    const uint8_t utf8[] = { 0x24, 0xC2, 0xA2, 0xE2, 0x82, 0xAC, 0xC2, 0xA5, 0xC2, 0xA3 };
+    std::vector<SkGlyphID> glyphs;
+    int count = paint.textToGlyphs(utf8, sizeof(utf8), nullptr);
+    glyphs.resize(count);
+    (void) paint.textToGlyphs(utf8, sizeof(utf8), &glyphs.front());
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    paint.setTextSize(32);
+    canvas->drawText(&glyphs.front(), glyphs.size() * sizeof(SkGlyphID), 10, 40, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_110.cpp b/docs/examples/Paint_110.cpp
new file mode 100644
index 0000000..30a403a
--- /dev/null
+++ b/docs/examples/Paint_110.cpp
@@ -0,0 +1,13 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=85436c71aab5410767fc688ab0573e09
+REG_FIDDLE(Paint_110, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    const uint8_t utf8[] = { 0x24, 0xC2, 0xA2, 0xE2, 0x82, 0xAC, 0xC2, 0xA5, 0xC2, 0xA3 };
+    SkDebugf("count = %d\n", paint.countText(utf8, sizeof(utf8)));
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_111.cpp b/docs/examples/Paint_111.cpp
new file mode 100644
index 0000000..268417c
--- /dev/null
+++ b/docs/examples/Paint_111.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6a68cb3c8b81a5976c81ee004f559247
+REG_FIDDLE(Paint_111, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    const uint16_t goodGlyph = 511;
+    const uint16_t zeroGlyph = 0;
+    const uint16_t badGlyph = 65535; // larger than glyph count in font
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    SkDebugf("0x%04x %c= has glyph\n", goodGlyph,
+            paint.containsText(&goodGlyph, 2) ? '=' : '!');
+    SkDebugf("0x%04x %c= has glyph\n", zeroGlyph,
+            paint.containsText(&zeroGlyph, 2) ? '=' : '!');
+    SkDebugf("0x%04x %c= has glyph\n", badGlyph,
+            paint.containsText(&badGlyph, 2) ? '=' : '!');
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_112.cpp b/docs/examples/Paint_112.cpp
new file mode 100644
index 0000000..a0e1bc4
--- /dev/null
+++ b/docs/examples/Paint_112.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=06084f609184470135a9cd9ebc5af149
+REG_FIDDLE(Paint_112, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(50);
+    const char str[] = "ay^jZ";
+    const int count = sizeof(str) - 1;
+    canvas->drawText(str, count, 25, 50, paint);
+    SkRect bounds;
+    paint.measureText(str, count, &bounds);
+    canvas->translate(25, 50);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRect(bounds, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_113.cpp b/docs/examples/Paint_113.cpp
new file mode 100644
index 0000000..fc66e25
--- /dev/null
+++ b/docs/examples/Paint_113.cpp
@@ -0,0 +1,14 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f1139a5ddd17fd47c2f45f6e642cac76
+REG_FIDDLE(Paint_113, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkDebugf("default width = %g\n", paint.measureText("!", 1));
+    paint.setTextSize(paint.getTextSize() * 2);
+    SkDebugf("double width = %g\n", paint.measureText("!", 1));
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_114.cpp b/docs/examples/Paint_114.cpp
new file mode 100644
index 0000000..7decce9
--- /dev/null
+++ b/docs/examples/Paint_114.cpp
@@ -0,0 +1,37 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6b9e101f49e9c2c28755c5bdcef64dfb
+REG_FIDDLE(Paint_114, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(50);
+    const char str[] = "abc";
+    const int bytes = sizeof(str) - 1;
+    int count = paint.getTextWidths(str, bytes, nullptr);
+    std::vector<SkScalar> widths;
+    std::vector<SkRect> bounds;
+    widths.resize(count);
+    bounds.resize(count);
+    for (int loop = 0; loop < 2; ++loop) {
+        (void) paint.getTextWidths(str, count, &widths.front(), &bounds.front());
+        SkPoint loc = { 25, 50 };
+        canvas->drawText(str, bytes, loc.fX, loc.fY, paint);
+        paint.setStyle(SkPaint::kStroke_Style);
+        paint.setStrokeWidth(0);
+        SkScalar advanceY = loc.fY + 10;
+        for (int index = 0; index < count; ++index) {
+            bounds[index].offset(loc.fX, loc.fY);
+            canvas->drawRect(bounds[index], paint);
+            canvas->drawLine(loc.fX, advanceY, loc.fX + widths[index], advanceY, paint);
+            loc.fX += widths[index];
+            advanceY += 5;
+        }
+        canvas->translate(0, 80);
+        paint.setStrokeWidth(3);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_115.cpp b/docs/examples/Paint_115.cpp
new file mode 100644
index 0000000..40d8309
--- /dev/null
+++ b/docs/examples/Paint_115.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7c9e6a399f898d68026c1f0865e6f73e
+REG_FIDDLE(Paint_115, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(80);
+    SkPath path, path2;
+    paint.getTextPath("ABC", 3, 20, 80, &path);
+    path.offset(20, 20, &path2);
+    Op(path, path2, SkPathOp::kDifference_SkPathOp, &path);
+    path.addPath(path2);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_116.cpp b/docs/examples/Paint_116.cpp
new file mode 100644
index 0000000..c785834
--- /dev/null
+++ b/docs/examples/Paint_116.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7f27c93472aa99a7542fb3493076f072
+REG_FIDDLE(Paint_116, 256, 85, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(80);
+    SkPath path, path2;
+    SkPoint pos[] = {{20, 60}, {30, 70}, {40, 80}};
+    paint.getPosTextPath("ABC", 3, pos, &path);
+    Simplify(path, &path);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Paint_117.cpp b/docs/examples/Paint_117.cpp
new file mode 100644
index 0000000..8ee183c
--- /dev/null
+++ b/docs/examples/Paint_117.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2973b05bfbb6b4c29332c8ac4fcf3995
+REG_FIDDLE(Paint_117, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPaint& p) -> void {
+        SkDebugf("%s nothing to draw: %s\n", prefix,
+                 p.nothingToDraw() ? "true" : "false");
+    };
+    SkPaint paint;
+    debugster("initial", paint);
+    paint.setBlendMode(SkBlendMode::kDst);
+    debugster("blend dst", paint);
+    paint.setBlendMode(SkBlendMode::kSrcOver);
+    debugster("blend src over", paint);
+    paint.setAlpha(0);
+    debugster("alpha 0", paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_000.cpp b/docs/examples/Path_000.cpp
new file mode 100644
index 0000000..e102b7e
--- /dev/null
+++ b/docs/examples/Path_000.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=799096fdc1298aa815934a74e76570ca
+REG_FIDDLE(Path_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.lineTo(20, 20);
+    path.quadTo(-10, -10, 30, 30);
+    path.close();
+    path.cubicTo(1, 2, 3, 4, 5, 6);
+    path.conicTo(0, 0, 0, 0, 2);
+    uint8_t verbs[7];
+    int count = path.getVerbs(verbs, (int) SK_ARRAY_COUNT(verbs));
+    const char* verbStr[] = { "Move", "Line", "Quad", "Conic", "Cubic", "Close" };
+    SkDebugf("verb count: %d\nverbs: ", count);
+    for (int i = 0; i < count; ++i) {
+        SkDebugf("k%s_Verb ", verbStr[verbs[i]]);
+    }
+    SkDebugf("\n");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_001.cpp b/docs/examples/Path_001.cpp
new file mode 100644
index 0000000..5d6ccba
--- /dev/null
+++ b/docs/examples/Path_001.cpp
@@ -0,0 +1,32 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4bbae00b40ed2cfcd0007921ad693a7b
+REG_FIDDLE(Path_001, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    const SkPoint arrow[] = { {40, -5}, {45, 0}, {40, 5} };
+    const SkRect rect = {10, 10, 90, 90};
+    SkPaint rectPaint;
+    rectPaint.setAntiAlias(true);
+    SkPaint textPaint(rectPaint);
+    rectPaint.setStyle(SkPaint::kStroke_Style);
+    SkPaint arrowPaint(rectPaint);
+    SkPath arrowPath;
+    arrowPath.addPoly(arrow, SK_ARRAY_COUNT(arrow), true);
+    arrowPaint.setPathEffect(SkPath1DPathEffect::Make(arrowPath, 320, 0,
+                             SkPath1DPathEffect::kRotate_Style));
+    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {
+        canvas->drawRect(rect, rectPaint);
+        for (unsigned start : { 0, 1, 2, 3 } ) {
+           SkPath path;
+           path.addRect(rect, direction, start);
+           canvas->drawPath(path, arrowPaint);
+       }
+       canvas->drawString(SkPath::kCW_Direction == direction ? "CW" : "CCW",  rect.centerX(),
+            rect.centerY(), textPaint);
+       canvas->translate(120, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_002.cpp b/docs/examples/Path_002.cpp
new file mode 100644
index 0000000..42465d1
--- /dev/null
+++ b/docs/examples/Path_002.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0a0026fca638d1cd75c0ab884e3ee1c6
+REG_FIDDLE(Path_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkDebugf("path is " "%s" "empty", path.isEmpty() ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_003.cpp b/docs/examples/Path_003.cpp
new file mode 100644
index 0000000..cd0a5c4
--- /dev/null
+++ b/docs/examples/Path_003.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=647312aacd946c8a6eabaca797140432
+REG_FIDDLE(Path_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.lineTo(20, 20);
+    SkPath path2(path);
+    path2.close();
+    SkDebugf("path verbs: %d\n", path.countVerbs());
+    SkDebugf("path2 verbs: %d\n", path2.countVerbs());
+    path.reset();
+    SkDebugf("after reset\n" "path verbs: %d\n", path.countVerbs());
+    SkDebugf("path2 verbs: %d\n", path2.countVerbs());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_004.cpp b/docs/examples/Path_004.cpp
new file mode 100644
index 0000000..e459351
--- /dev/null
+++ b/docs/examples/Path_004.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=01ad6be9b7d15a2217daea273eb3d466
+REG_FIDDLE(Path_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath* path = new SkPath();
+    path->lineTo(20, 20);
+    SkPath path2(*path);
+    delete path;
+    SkDebugf("path2 is " "%s" "empty", path2.isEmpty() ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_005.cpp b/docs/examples/Path_005.cpp
new file mode 100644
index 0000000..0b25b5d
--- /dev/null
+++ b/docs/examples/Path_005.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bba288f5f77fc8e37e89d2ec08e0ac60
+REG_FIDDLE(Path_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path1;
+    path1.addRect({10, 20, 30, 40});
+    SkPath path2 = path1;
+    const SkRect& b1 = path1.getBounds();
+    SkDebugf("path1 bounds = %g, %g, %g, %g\n", b1.fLeft, b1.fTop, b1.fRight, b1.fBottom);
+    const SkRect& b2 = path2.getBounds();
+    SkDebugf("path2 bounds = %g, %g, %g, %g\n", b2.fLeft, b2.fTop, b2.fRight, b2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_006.cpp b/docs/examples/Path_006.cpp
new file mode 100644
index 0000000..f1f5eb0
--- /dev/null
+++ b/docs/examples/Path_006.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=31883f51bb357f2ac5990d88f8b82e02
+REG_FIDDLE(Path_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& a, const SkPath& b) -> void {
+                SkDebugf("%s one %c= two\n", prefix, a == b ? '=' : '!');
+    };
+    SkPath one;
+    SkPath two;
+    debugster("empty", one, two);
+    one.moveTo(0, 0);
+    debugster("moveTo", one, two);
+    one.rewind();
+    debugster("rewind", one, two);
+    one.moveTo(0, 0);
+    one.reset();
+    debugster("reset", one, two);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_007.cpp b/docs/examples/Path_007.cpp
new file mode 100644
index 0000000..26ac1cc
--- /dev/null
+++ b/docs/examples/Path_007.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bbbda1cc818d96c9c0d2a06c0c48902b
+REG_FIDDLE(Path_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& a, const SkPath& b) -> void {
+                SkDebugf("%s one %c= two\n", prefix, a != b ? '!' : '=');
+    };
+    SkPath one;
+    SkPath two;
+    debugster("empty", one, two);
+    one.addRect({10, 20, 30, 40});
+    two.addRect({10, 20, 30, 40});
+    debugster("add rect", one, two);
+    one.setConvexity(SkPath::kConcave_Convexity);
+    debugster("setConvexity", one, two);
+    SkDebugf("convexity %c=\n", one.getConvexity() == two.getConvexity() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_008.cpp b/docs/examples/Path_008.cpp
new file mode 100644
index 0000000..131d862
--- /dev/null
+++ b/docs/examples/Path_008.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c81fc7dfaf785c3fb77209c7f2ebe5b8
+REG_FIDDLE(Path_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path, path2;
+    path.moveTo(20, 20);
+    path.lineTo(40, 40);
+    path.lineTo(20, 20);
+    path.lineTo(40, 40);
+    path.close();
+    path2.addRect({20, 20, 40, 40});
+    SkDebugf("paths are " "%s" "interpolatable", path.isInterpolatable(path2) ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_009.cpp b/docs/examples/Path_009.cpp
new file mode 100644
index 0000000..7bfc18c
--- /dev/null
+++ b/docs/examples/Path_009.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=404f11c5c9c9ca8a64822d484552a473
+REG_FIDDLE(Path_009, 256, 60, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath path, path2;
+    path.moveTo(20, 20);
+    path.lineTo(40, 40);
+    path.lineTo(20, 40);
+    path.lineTo(40, 20);
+    path.close();
+    path2.addRect({20, 20, 40, 40});
+    for (SkScalar i = 0; i <= 1; i += 1.f / 6) {
+      SkPath interp;
+      path.interpolate(path2, i, &interp);
+      canvas->drawPath(interp, paint);
+      canvas->translate(30, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_010.cpp b/docs/examples/Path_010.cpp
new file mode 100644
index 0000000..963e10a
--- /dev/null
+++ b/docs/examples/Path_010.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=71fc6c069c377d808799f2453edabaf5
+REG_FIDDLE(Path_010, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkPath path;
+   path.addRect({10, 10, 30, 30}, SkPath::kCW_Direction);
+   path.addRect({20, 20, 40, 40}, SkPath::kCW_Direction);
+   path.addRect({10, 60, 30, 80}, SkPath::kCW_Direction);
+   path.addRect({20, 70, 40, 90}, SkPath::kCCW_Direction);
+   SkPaint strokePaint;
+   strokePaint.setStyle(SkPaint::kStroke_Style);
+   SkRect clipRect = {0, 0, 51, 100};
+   canvas->drawPath(path, strokePaint);
+   SkPaint fillPaint;
+   for (auto fillType : { SkPath::kWinding_FillType, SkPath::kEvenOdd_FillType,
+                      SkPath::kInverseWinding_FillType, SkPath::kInverseEvenOdd_FillType } ) {
+        canvas->translate(51, 0);
+        canvas->save();
+        canvas->clipRect(clipRect);
+        path.setFillType(fillType);
+        canvas->drawPath(path, fillPaint);
+        canvas->restore();
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_011.cpp b/docs/examples/Path_011.cpp
new file mode 100644
index 0000000..59afb76
--- /dev/null
+++ b/docs/examples/Path_011.cpp
@@ -0,0 +1,37 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d2c33dc791cd165dcc2423226ba5b095
+REG_FIDDLE(Path_011, 256, 230, false, 0) {
+void draw(SkCanvas* canvas) {
+   SkPath path;
+   path.addRect({20, 10, 80, 70}, SkPath::kCW_Direction);
+   path.addRect({40, 30, 100, 90}, SkPath::kCW_Direction);
+   SkPaint strokePaint;
+   strokePaint.setStyle(SkPaint::kStroke_Style);
+   SkRect clipRect = {0, 0, 128, 128};
+   canvas->drawPath(path, strokePaint);
+   canvas->drawLine({0, 50}, {120, 50}, strokePaint);
+   SkPaint textPaint;
+   textPaint.setAntiAlias(true);
+   SkScalar textHPos[] = { 10, 30, 60, 90, 110 };
+   canvas->drawPosTextH("01210", 5, textHPos, 48, textPaint);
+   textPaint.setTextSize(18);
+   canvas->translate(0, 128);
+   canvas->scale(.5f, .5f);
+   canvas->drawString("inverse", 384, 150, textPaint);
+   SkPaint fillPaint;
+   for (auto fillType : { SkPath::kWinding_FillType, SkPath::kEvenOdd_FillType,
+                      SkPath::kInverseWinding_FillType, SkPath::kInverseEvenOdd_FillType } ) {
+        canvas->save();
+        canvas->clipRect(clipRect);
+        path.setFillType(fillType);
+        canvas->drawPath(path, fillPaint);
+        canvas->restore();
+        canvas->drawString(fillType & 1 ? "even-odd" : "winding", 64, 170, textPaint);
+        canvas->translate(128, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_012.cpp b/docs/examples/Path_012.cpp
new file mode 100644
index 0000000..6c46a6e
--- /dev/null
+++ b/docs/examples/Path_012.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=019af90e778914e8a109d6305ede4fc4
+REG_FIDDLE(Path_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkDebugf("default path fill type is %s\n",
+            path.getFillType() == SkPath::kWinding_FillType ? "kWinding_FillType" :
+            path.getFillType() == SkPath::kEvenOdd_FillType ? "kEvenOdd_FillType" :
+            path.getFillType() == SkPath::kInverseWinding_FillType ? "kInverseWinding_FillType" :
+                                                                     "kInverseEvenOdd_FillType");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_013.cpp b/docs/examples/Path_013.cpp
new file mode 100644
index 0000000..479ff7d
--- /dev/null
+++ b/docs/examples/Path_013.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b4a91cd7f50b2a0a0d1bec6d0ac823d2
+REG_FIDDLE(Path_013, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.setFillType(SkPath::kInverseWinding_FillType);
+    SkPaint paint;
+    paint.setColor(SK_ColorBLUE);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_014.cpp b/docs/examples/Path_014.cpp
new file mode 100644
index 0000000..a41364f
--- /dev/null
+++ b/docs/examples/Path_014.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2a2d39f5da611545caa18bbcea873ab2
+REG_FIDDLE(Path_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkDebugf("default path fill type is inverse: %s\n",
+            path.isInverseFillType() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_015.cpp b/docs/examples/Path_015.cpp
new file mode 100644
index 0000000..7868d40
--- /dev/null
+++ b/docs/examples/Path_015.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=400facce23d417bc5043c5f58404afbd
+REG_FIDDLE(Path_015, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkPaint paint;
+    paint.setColor(SK_ColorRED);
+    paint.setTextSize(80);
+    paint.getTextPath("ABC", 3, 20, 80, &path);
+    canvas->drawPath(path, paint);
+    path.toggleInverseFillType();
+    paint.setColor(SK_ColorGREEN);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_016.cpp b/docs/examples/Path_016.cpp
new file mode 100644
index 0000000..67f9ae2
--- /dev/null
+++ b/docs/examples/Path_016.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ac49e8b810bd6ed5d84b4f5a3b40a0ec
+REG_FIDDLE(Path_016, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPoint quad[] = {{70, 70}, {20, 20}, {120, 20}, {120, 120}};
+    const char* labels[] = { "unknown", "convex", "concave" };
+    for (SkScalar x : { 40, 100 } ) {
+        SkPath path;
+        quad[0].fX = x;
+        path.addPoly(quad, SK_ARRAY_COUNT(quad), true);
+        canvas->drawPath(path, paint);
+        canvas->drawString(labels[(int) path.getConvexity()], 30, 100, paint);
+        canvas->translate(100, 100);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_017.cpp b/docs/examples/Path_017.cpp
new file mode 100644
index 0000000..08d822b
--- /dev/null
+++ b/docs/examples/Path_017.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a8f36f2fa90003e3691fd0da0bb0c243
+REG_FIDDLE(Path_017, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkDebugf("%s path convexity is %s\n", prefix,
+                SkPath::kUnknown_Convexity == path.getConvexity() ? "unknown" :
+                SkPath::kConvex_Convexity == path.getConvexity() ? "convex" : "concave"); };
+    SkPath path;
+    debugster("initial", path);
+    path.lineTo(50, 0);
+    debugster("first line", path);
+    path.lineTo(50, 50);
+    debugster("second line", path);
+    path.lineTo(100, 50);
+    debugster("third line", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_018.cpp b/docs/examples/Path_018.cpp
new file mode 100644
index 0000000..a71df2c
--- /dev/null
+++ b/docs/examples/Path_018.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=111c59e9afadb940ab8f41bdc25378a4
+REG_FIDDLE(Path_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkDebugf("%s path convexity is %s\n", prefix,
+            SkPath::kUnknown_Convexity == path.getConvexityOrUnknown() ? "unknown" :
+            SkPath::kConvex_Convexity == path.getConvexityOrUnknown() ? "convex" : "concave"); };
+    SkPath path;
+    debugster("initial", path);
+    path.lineTo(50, 0);
+    debugster("first line", path);
+    path.getConvexity();
+    path.lineTo(50, 50);
+    debugster("second line", path);
+    path.lineTo(100, 50);
+    path.getConvexity();
+    debugster("third line", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_019.cpp b/docs/examples/Path_019.cpp
new file mode 100644
index 0000000..8972bb2
--- /dev/null
+++ b/docs/examples/Path_019.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=875e32b4b1cb48d739325705fc0fa42c
+REG_FIDDLE(Path_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkDebugf("%s path convexity is %s\n", prefix,
+                SkPath::kUnknown_Convexity == path.getConvexity() ? "unknown" :
+                SkPath::kConvex_Convexity == path.getConvexity() ? "convex" : "concave"); };
+        SkPoint quad[] = {{70, 70}, {20, 20}, {120, 20}, {120, 120}};
+        SkPath path;
+        path.addPoly(quad, SK_ARRAY_COUNT(quad), true);
+        debugster("initial", path);
+        path.setConvexity(SkPath::kConcave_Convexity);
+        debugster("after forcing concave", path);
+        path.setConvexity(SkPath::kUnknown_Convexity);
+        debugster("after forcing unknown", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_020.cpp b/docs/examples/Path_020.cpp
new file mode 100644
index 0000000..a8b1058
--- /dev/null
+++ b/docs/examples/Path_020.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d8be8b6e59de244e4cbf58ec9554557b
+REG_FIDDLE(Path_020, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPoint quad[] = {{70, 70}, {20, 20}, {120, 20}, {120, 120}};
+    for (SkScalar x : { 40, 100 } ) {
+        SkPath path;
+        quad[0].fX = x;
+        path.addPoly(quad, SK_ARRAY_COUNT(quad), true);
+        path.setConvexity(SkPath::kConvex_Convexity);
+        canvas->drawPath(path, paint);
+        canvas->drawString(path.isConvex() ? "convex" : "not convex", 30, 100, paint);
+        canvas->translate(100, 100);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_021.cpp b/docs/examples/Path_021.cpp
new file mode 100644
index 0000000..f813a4c
--- /dev/null
+++ b/docs/examples/Path_021.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a51256952b183ee0f7004f2c87cbbf5b
+REG_FIDDLE(Path_021, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPath path;
+    path.addOval({20, 20, 220, 220});
+    SkRect bounds;
+    if (path.isOval(&bounds)) {
+        paint.setColor(0xFF9FBFFF);
+        canvas->drawRect(bounds, paint);
+    }
+    paint.setColor(0x3f000000);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_022.cpp b/docs/examples/Path_022.cpp
new file mode 100644
index 0000000..a26864e
--- /dev/null
+++ b/docs/examples/Path_022.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2aa939b90d96aff436b145a96305132c
+REG_FIDDLE(Path_022, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPath path;
+    path.addRRect(SkRRect::MakeRectXY({20, 20, 220, 220}, 30, 50));
+    SkRRect rrect;
+    if (path.isRRect(&rrect)) {
+        const SkRect& bounds = rrect.rect();
+        paint.setColor(0xFF9FBFFF);
+        canvas->drawRect(bounds, paint);
+    }
+    paint.setColor(0x3f000000);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_023.cpp b/docs/examples/Path_023.cpp
new file mode 100644
index 0000000..668bd70
--- /dev/null
+++ b/docs/examples/Path_023.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8cdca35d2964bbbecb93d79a13f71c65
+REG_FIDDLE(Path_023, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path1, path2;
+    path1.setFillType(SkPath::kInverseWinding_FillType);
+    path1.addRect({10, 20, 30, 40});
+    SkDebugf("path1 %c= path2\n", path1 == path2 ? '=' : '!');
+    path1.reset();
+    SkDebugf("path1 %c= path2\n", path1 == path2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_024.cpp b/docs/examples/Path_024.cpp
new file mode 100644
index 0000000..34e3c17
--- /dev/null
+++ b/docs/examples/Path_024.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f1fedbb89da9c2a33a91805175663012
+REG_FIDDLE(Path_024, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path1, path2;
+    path1.setFillType(SkPath::kInverseWinding_FillType);
+    path1.addRect({10, 20, 30, 40});
+    SkDebugf("path1 %c= path2\n", path1 == path2 ? '=' : '!');
+    path1.rewind();
+    SkDebugf("path1 %c= path2\n", path1 == path2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_025.cpp b/docs/examples/Path_025.cpp
new file mode 100644
index 0000000..340f263
--- /dev/null
+++ b/docs/examples/Path_025.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0b34e6d55d11586744adeb889d2a12f4
+REG_FIDDLE(Path_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkDebugf("%s path is %s" "empty\n", prefix, path.isEmpty() ? "" : "not ");
+    };
+    SkPath path;
+    debugster("initial", path);
+    path.moveTo(0, 0);
+    debugster("after moveTo", path);
+    path.rewind();
+    debugster("after rewind", path);
+    path.lineTo(0, 0);
+    debugster("after lineTo", path);
+    path.reset();
+    debugster("after reset", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_026.cpp b/docs/examples/Path_026.cpp
new file mode 100644
index 0000000..32c6b28
--- /dev/null
+++ b/docs/examples/Path_026.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=03b740ab94b9017800a52e30b5e7fee7
+REG_FIDDLE(Path_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkDebugf("%s last contour is %s" "closed\n", prefix,
+                 path.isLastContourClosed() ? "" : "not ");
+    };
+    SkPath path;
+    debugster("initial", path);
+    path.close();
+    debugster("after close", path);
+    path.lineTo(0, 0);
+    debugster("after lineTo", path);
+    path.close();
+    debugster("after close", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_027.cpp b/docs/examples/Path_027.cpp
new file mode 100644
index 0000000..a5430b1
--- /dev/null
+++ b/docs/examples/Path_027.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dd4e4dd2aaa8039b2430729c6b3af817
+REG_FIDDLE(Path_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkDebugf("%s path is %s" "finite\n", prefix, path.isFinite() ? "" : "not ");
+    };
+    SkPath path;
+    debugster("initial", path);
+    path.lineTo(SK_ScalarMax, SK_ScalarMax);
+    debugster("after line", path);
+    SkMatrix matrix;
+    matrix.setScale(2, 2);
+    path.transform(matrix);
+    debugster("after scale", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_028.cpp b/docs/examples/Path_028.cpp
new file mode 100644
index 0000000..3290dff
--- /dev/null
+++ b/docs/examples/Path_028.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c722ebe8ac991d77757799ce29e509e1
+REG_FIDDLE(Path_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkDebugf("volatile by default is %s\n", path.isVolatile() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_029.cpp b/docs/examples/Path_029.cpp
new file mode 100644
index 0000000..b33b5ee
--- /dev/null
+++ b/docs/examples/Path_029.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2049ff5141f0c80aac497618622b28af
+REG_FIDDLE(Path_029, 50, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath path;
+    path.setIsVolatile(true);
+    path.lineTo(40, 40);
+    canvas->drawPath(path, paint);
+    path.rewind();
+    path.moveTo(0, 40);
+    path.lineTo(40, 0);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_030.cpp b/docs/examples/Path_030.cpp
new file mode 100644
index 0000000..b8db09d
--- /dev/null
+++ b/docs/examples/Path_030.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=97a031f9186ade586928563840ce9116
+REG_FIDDLE(Path_030, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint points[] = { {100, 100}, {100.000001f, 100.000001f}, {100.0001f, 100.0001f} };
+    for (size_t i = 0; i < SK_ARRAY_COUNT(points) - 1; ++i) {
+        for (bool exact : { false, true } ) {
+            SkDebugf("line from (%1.8g,%1.8g) to (%1.8g,%1.8g) is %s" "degenerate, %s\n",
+                    points[i].fX, points[i].fY, points[i + 1].fX, points[i + 1].fY,
+                    SkPath::IsLineDegenerate(points[i], points[i + 1], exact)
+                    ? "" : "not ", exact ? "exactly" : "nearly");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_031.cpp b/docs/examples/Path_031.cpp
new file mode 100644
index 0000000..3902c48
--- /dev/null
+++ b/docs/examples/Path_031.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a2b255a7dac1926cc3a247d318d63c62
+REG_FIDDLE(Path_031, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const SkPath& path, bool exact) -> void {
+        SkDebugf("quad (%1.8g,%1.8g), (%1.8g,%1.8g), (%1.8g,%1.8g) is %s" "degenerate, %s\n",
+            path.getPoint(0).fX, path.getPoint(0).fY, path.getPoint(1).fX,
+            path.getPoint(1).fY, path.getPoint(2).fX, path.getPoint(2).fY,
+            SkPath::IsQuadDegenerate(path.getPoint(0), path.getPoint(1), path.getPoint(2), exact) ?
+            "" : "not ", exact ? "exactly" : "nearly");
+    };
+    SkPath path, offset;
+    path.moveTo({100, 100});
+    path.quadTo({100.00001f, 100.00001f}, {100.00002f, 100.00002f});
+    offset.addPath(path, 1000, 1000);
+    for (bool exact : { false, true } ) {
+        debugster(path, exact);
+        debugster(offset, exact);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_032.cpp b/docs/examples/Path_032.cpp
new file mode 100644
index 0000000..4857606
--- /dev/null
+++ b/docs/examples/Path_032.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6b97099acdae80b16df0c4241f593991
+REG_FIDDLE(Path_032, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint points[] = {{1, 0}, {0, 0}, {0, 0}, {0, 0}};
+    SkScalar step = 1;
+    SkScalar prior, length = 0, degenerate = 0;
+    do {
+        prior = points[0].fX;
+        step /= 2;
+        if (SkPath::IsCubicDegenerate(points[0], points[1], points[2], points[3], false)) {
+            degenerate = prior;
+            points[0].fX += step;
+        } else {
+            length = prior;
+            points[0].fX -= step;
+        }
+    } while (prior != points[0].fX);
+    SkDebugf("%1.8g is degenerate\n", degenerate);
+    SkDebugf("%1.8g is length\n", length);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_033.cpp b/docs/examples/Path_033.cpp
new file mode 100644
index 0000000..cdc1050
--- /dev/null
+++ b/docs/examples/Path_033.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1ad07d56e4258e041606d50cad969392
+REG_FIDDLE(Path_033, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkPoint line[2];
+        if (path.isLine(line)) {
+            SkDebugf("%s is line (%1.8g,%1.8g) (%1.8g,%1.8g)\n", prefix,
+                 line[0].fX, line[0].fY, line[1].fX, line[1].fY);
+        } else {
+            SkDebugf("%s is not line\n", prefix);
+        }
+    };
+    SkPath path;
+    debugster("empty", path);
+    path.lineTo(0, 0);
+    debugster("zero line", path);
+    path.rewind();
+    path.moveTo(10, 10);
+    path.lineTo(20, 20);
+    debugster("line", path);
+    path.moveTo(20, 20);
+    debugster("second move", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_034.cpp b/docs/examples/Path_034.cpp
new file mode 100644
index 0000000..02f5e32
--- /dev/null
+++ b/docs/examples/Path_034.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9bc86efda08cbcd9c6f7c5f220294a24
+REG_FIDDLE(Path_034, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path, SkPoint* points, int max) -> void {
+         int count = path.getPoints(points, max);
+         SkDebugf("%s point count: %d  ", prefix, count);
+         for (int i = 0; i < SkTMin(count, max) && points; ++i) {
+             SkDebugf("(%1.8g,%1.8g) ", points[i].fX, points[i].fY);
+         }
+         SkDebugf("\n");
+    };
+    SkPath path;
+    path.lineTo(20, 20);
+    path.lineTo(-10, -10);
+    SkPoint points[3];
+    debugster("no points",  path, nullptr, 0);
+    debugster("zero max",  path, points, 0);
+    debugster("too small",  path, points, 2);
+    debugster("just right",  path, points, path.countPoints());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_035.cpp b/docs/examples/Path_035.cpp
new file mode 100644
index 0000000..d2c1922
--- /dev/null
+++ b/docs/examples/Path_035.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bca6379ccef62cb081b10db7381deb27
+REG_FIDDLE(Path_035, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+         SkDebugf("%s point count: %d\n", prefix, path.countPoints());
+    };
+    SkPath path;
+    debugster("empty", path);
+    path.lineTo(0, 0);
+    debugster("zero line", path);
+    path.rewind();
+    path.moveTo(10, 10);
+    path.lineTo(20, 20);
+    debugster("line", path);
+    path.moveTo(20, 20);
+    debugster("second move", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_036.cpp b/docs/examples/Path_036.cpp
new file mode 100644
index 0000000..fcfb91b
--- /dev/null
+++ b/docs/examples/Path_036.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=42885f1df13de109adccc5d531f62111
+REG_FIDDLE(Path_036, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.lineTo(20, 20);
+    path.offset(-10, -10);
+    for (int i= 0; i < path.countPoints(); ++i) {
+         SkDebugf("point %d: (%1.8g,%1.8g)\n", i, path.getPoint(i).fX, path.getPoint(i).fY);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_037.cpp b/docs/examples/Path_037.cpp
new file mode 100644
index 0000000..5797182
--- /dev/null
+++ b/docs/examples/Path_037.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=af0c66aea3ef81b709664c7007f48aae
+REG_FIDDLE(Path_037, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkDebugf("empty verb count: %d\n", path.countVerbs());
+    path.addRoundRect({10, 20, 30, 40}, 5, 5);
+    SkDebugf("round rect verb count: %d\n", path.countVerbs());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_038.cpp b/docs/examples/Path_038.cpp
new file mode 100644
index 0000000..50ff065
--- /dev/null
+++ b/docs/examples/Path_038.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2ec66880966a6133ddd9331ce7323438
+REG_FIDDLE(Path_038, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path, uint8_t* verbs, int max) -> void {
+         int count = path.getVerbs(verbs, max);
+         SkDebugf("%s verb count: %d  ", prefix, count);
+         const char* verbStr[] = { "move", "line", "quad", "conic", "cubic", "close" };
+         for (int i = 0; i < SkTMin(count, max) && verbs; ++i) {
+             SkDebugf("%s ", verbStr[verbs[i]]);
+         }
+         SkDebugf("\n");
+    };
+    SkPath path;
+    path.lineTo(20, 20);
+    path.lineTo(-10, -10);
+    uint8_t verbs[3];
+    debugster("no verbs",  path, nullptr, 0);
+    debugster("zero max",  path, verbs, 0);
+    debugster("too small",  path, verbs, 2);
+    debugster("just right",  path, verbs, path.countVerbs());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_039.cpp b/docs/examples/Path_039.cpp
new file mode 100644
index 0000000..f411f5c
--- /dev/null
+++ b/docs/examples/Path_039.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4c5ebee2b5039e5faefa07ae63a15467
+REG_FIDDLE(Path_039, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path1, path2;
+    path1.addRect({10, 20, 30, 40});
+    path1.swap(path2);
+    const SkRect& b1 = path1.getBounds();
+    SkDebugf("path1 bounds = %g, %g, %g, %g\n", b1.fLeft, b1.fTop, b1.fRight, b1.fBottom);
+    const SkRect& b2 = path2.getBounds();
+    SkDebugf("path2 bounds = %g, %g, %g, %g\n", b2.fLeft, b2.fTop, b2.fRight, b2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_040.cpp b/docs/examples/Path_040.cpp
new file mode 100644
index 0000000..0581e81
--- /dev/null
+++ b/docs/examples/Path_040.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=45c0fc3acb74fab99d544b80eadd10ad
+REG_FIDDLE(Path_040, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+            const SkRect& bounds = path.getBounds();
+            SkDebugf("%s bounds = %g, %g, %g, %g\n", prefix,
+                     bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    };
+    SkPath path;
+    debugster("empty", path);
+    path.addCircle(50, 45, 25);
+    debugster("circle", path);
+    SkMatrix matrix;
+    matrix.setRotate(45, 50, 45);
+    path.transform(matrix);
+    debugster("rotated circle", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_041.cpp b/docs/examples/Path_041.cpp
new file mode 100644
index 0000000..707e750
--- /dev/null
+++ b/docs/examples/Path_041.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bb761cd858e6d0ca05627262cd22ff5e
+REG_FIDDLE(Path_041, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    double times[2] = { 0, 0 };
+    int N = 100;
+    for (int i = 0; i < N; ++i) {
+      SkPath path;
+      for (int j = 1; j < 100; ++ j) {
+        path.addCircle(50 + j, 45 + j, 25 + j);
+      }
+      if (1 & i) {
+        path.updateBoundsCache();
+      }
+      double start = SkTime::GetNSecs();
+      (void) path.getBounds();
+      times[1 & i] += SkTime::GetNSecs() - start;
+    }
+    SkDebugf("uncached avg: %g ms\n", times[0] / (double)N);
+    SkDebugf("cached avg: %g ms\n", times[1] / (double)N);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_042.cpp b/docs/examples/Path_042.cpp
new file mode 100644
index 0000000..63a2e00
--- /dev/null
+++ b/docs/examples/Path_042.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9a39c56e95b19a657133b7ad1fe0cf03
+REG_FIDDLE(Path_042, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+            const SkRect& bounds = path.computeTightBounds();
+            SkDebugf("%s bounds = %g, %g, %g, %g\n", prefix,
+                     bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    };
+    SkPath path;
+    debugster("empty", path);
+    path.addCircle(50, 45, 25);
+    debugster("circle", path);
+    SkMatrix matrix;
+    matrix.setRotate(45, 50, 45);
+    path.transform(matrix);
+    debugster("rotated circle", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_043.cpp b/docs/examples/Path_043.cpp
new file mode 100644
index 0000000..e17b38d
--- /dev/null
+++ b/docs/examples/Path_043.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=41638d13e40fa449ece354dde5fb1941
+REG_FIDDLE(Path_043, 256, 140, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.addRoundRect({10, 20, 54, 120}, 10, 20);
+    SkRect tests[] = {
+      { 10, 40, 54, 80 },
+      { 25, 20, 39, 120 },
+      { 15, 25, 49, 115 },
+      { 13, 27, 51, 113 },
+    };
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(tests); ++i) {
+      SkPaint paint;
+      paint.setColor(SK_ColorRED);
+      canvas->drawPath(path, paint);
+      bool rectInPath = path.conservativelyContainsRect(tests[i]);
+      paint.setColor(rectInPath ? SK_ColorBLUE : SK_ColorBLACK);
+      canvas->drawRect(tests[i], paint);
+      canvas->translate(64, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_044.cpp b/docs/examples/Path_044.cpp
new file mode 100644
index 0000000..0a09dc7
--- /dev/null
+++ b/docs/examples/Path_044.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f2260f2a170a54aef5bafe5b91c121b3
+REG_FIDDLE(Path_044, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto addPoly = [](int sides, SkScalar size, SkPath* path) -> void {
+        path->moveTo(size, 0);
+        for (int i = 1; i < sides; i++) {
+            SkScalar c, s = SkScalarSinCos(SK_ScalarPI * 2 * i / sides, &c);
+            path->lineTo(c * size, s * size);
+        }
+        path->close();
+    };
+    SkPath path;
+    path.incReserve(3 + 4 + 5 + 6 + 7 + 8 + 9);
+    for (int sides = 3; sides < 10; ++sides) {
+       addPoly(sides, sides, &path);
+    }
+    SkMatrix matrix;
+    matrix.setScale(10, 10, -10, -10);
+    path.transform(matrix);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_045.cpp b/docs/examples/Path_045.cpp
new file mode 100644
index 0000000..5abd258
--- /dev/null
+++ b/docs/examples/Path_045.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=84101d341e934a535a41ad6cf42218ce
+REG_FIDDLE(Path_045, 140, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 20, 20, 120, 80 };
+    SkPath path;
+    path.addRect(rect);
+    path.moveTo(rect.fLeft, rect.fTop);
+    path.lineTo(rect.fRight, rect.fBottom);
+    path.moveTo(rect.fLeft, rect.fBottom);
+    path.lineTo(rect.fRight, rect.fTop);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_046.cpp b/docs/examples/Path_046.cpp
new file mode 100644
index 0000000..8f442c4
--- /dev/null
+++ b/docs/examples/Path_046.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cb8d37990f6e7df3bcc85e7240c81274
+REG_FIDDLE(Path_046, 128, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint data[][3] = {{{30,40},{60,60},{90,30}}, {{30,120},{60,100},{90,120}},
+                         {{60,100},{60,40},{70,30}}, {{60,40},{50,20},{70,30}}};
+    SkPath path;
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(data); ++i) {
+        path.moveTo(data[i][0]);
+        path.lineTo(data[i][1]);
+        path.lineTo(data[i][2]);
+    }
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_047.cpp b/docs/examples/Path_047.cpp
new file mode 100644
index 0000000..5c2246a
--- /dev/null
+++ b/docs/examples/Path_047.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=63e32dec4b2d8440b427f368bf8313a4
+REG_FIDDLE(Path_047, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.addRect({20, 20, 80, 80}, SkPath::kCW_Direction, 2);
+    path.rMoveTo(25, 2);
+    SkVector arrow[] = {{0, -4}, {-20, 0}, {0, -3}, {-5, 5}, {5, 5}, {0, -3}, {20, 0}};
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(arrow); ++i) {
+        path.rLineTo(arrow[i].fX, arrow[i].fY);
+    }
+    SkPaint paint;
+    canvas->drawPath(path, paint);
+    SkPoint lastPt;
+    path.getLastPt(&lastPt);
+    canvas->drawString("start", lastPt.fX, lastPt.fY, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_048.cpp b/docs/examples/Path_048.cpp
new file mode 100644
index 0000000..d2313a4
--- /dev/null
+++ b/docs/examples/Path_048.cpp
@@ -0,0 +1,27 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e311cdd451edacec33b50cc22a4dd5dc
+REG_FIDDLE(Path_048, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(72);
+    canvas->drawString("#", 120, 80, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(5);
+    SkPath path;
+    SkPoint hash[] = {{58, 28}, {43, 80}, {37, 45}, {85, 45}};
+    SkVector offsets[] = {{0, 0}, {17, 0}, {0, 0}, {-5, 17}};
+    unsigned o = 0;
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(hash); i += 2) {
+        for (unsigned j = 0; j < 2; o++, j++) {
+            path.moveTo(hash[i].fX + offsets[o].fX, hash[i].fY + offsets[o].fY);
+            path.lineTo(hash[i + 1].fX + offsets[o].fX, hash[i + 1].fY + offsets[o].fY);
+        }
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_049.cpp b/docs/examples/Path_049.cpp
new file mode 100644
index 0000000..bb0617e
--- /dev/null
+++ b/docs/examples/Path_049.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=41001546a7f7927d08e5a818bcc304f5
+REG_FIDDLE(Path_049, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkVector oxo[] = {{25, 25}, {35, 35}, {25, 35}, {35, 25},
+                      {40, 20}, {40, 80}, {60, 20}, {60, 80},
+                      {20, 40}, {80, 40}, {20, 60}, {80, 60}};
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(oxo); i += 2) {
+        path.moveTo(oxo[i]);
+        path.lineTo(oxo[i + 1]);
+    }
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_050.cpp b/docs/examples/Path_050.cpp
new file mode 100644
index 0000000..24147a9
--- /dev/null
+++ b/docs/examples/Path_050.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6e0be0766b8ca320da51640326e608b3
+REG_FIDDLE(Path_050, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath path;
+    path.moveTo(10, 98);
+    SkScalar x = 0, y = 0;
+    for (int i = 10; i < 100; i += 5) {
+        x += i * ((i & 2) - 1);
+        y += i * (((i + 1) & 2) - 1);
+        path.rLineTo(x, y);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_051.cpp b/docs/examples/Path_051.cpp
new file mode 100644
index 0000000..1a111d4
--- /dev/null
+++ b/docs/examples/Path_051.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=78ad51fa1cd33eb84a6f99061e56e067
+REG_FIDDLE(Path_051, 256, 110, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPoint quadPts[] = {{20, 90}, {120, 10}, {220, 90}};
+    canvas->drawLine(quadPts[0], quadPts[1], paint);
+    canvas->drawLine(quadPts[1], quadPts[2], paint);
+    SkPath path;
+    path.moveTo(quadPts[0]);
+    path.quadTo(quadPts[1], quadPts[2]);
+    paint.setStrokeWidth(3);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_052.cpp b/docs/examples/Path_052.cpp
new file mode 100644
index 0000000..6032f31
--- /dev/null
+++ b/docs/examples/Path_052.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4082f66a42df11bb20462b232b156bb6
+REG_FIDDLE(Path_052, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPoint quadPts[] = {{20, 150}, {120, 10}, {220, 150}};
+    SkColor colors[] = { 0xff88ff00, 0xff0088bb, 0xff6600cc, 0xffbb3377 };
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(colors); ++i) {
+        paint.setColor(0x7fffffff & colors[i]);
+        paint.setStrokeWidth(1);
+        canvas->drawLine(quadPts[0], quadPts[1], paint);
+        canvas->drawLine(quadPts[1], quadPts[2], paint);
+        SkPath path;
+        path.moveTo(quadPts[0]);
+        path.quadTo(quadPts[1], quadPts[2]);
+        paint.setStrokeWidth(3);
+        paint.setColor(colors[i]);
+        canvas->drawPath(path, paint);
+        quadPts[1].fY += 30;
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_053.cpp b/docs/examples/Path_053.cpp
new file mode 100644
index 0000000..4f00bd4
--- /dev/null
+++ b/docs/examples/Path_053.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=60ee3eb747474f5781b0f0dd3a17a866
+REG_FIDDLE(Path_053, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath path;
+    path.moveTo(0, -10);
+    for (int i = 0; i < 128; i += 16) {
+        path.quadTo( 10 + i, -10 - i,  10 + i,       0);
+        path.quadTo( 14 + i,  14 + i,       0,  14 + i);
+        path.quadTo(-18 - i,  18 + i, -18 - i,       0);
+        path.quadTo(-22 - i, -22 - i,       0, -22 - i);
+    }
+    path.offset(128, 128);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_054.cpp b/docs/examples/Path_054.cpp
new file mode 100644
index 0000000..877f96a
--- /dev/null
+++ b/docs/examples/Path_054.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=82621c4df8da1e589d9e627494067826
+REG_FIDDLE(Path_054, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setAntiAlias(true);
+    SkPath path;
+    SkPoint pts[] = {{128, 10}, {10, 214}, {236, 214}};
+    path.moveTo(pts[1]);
+    for (int i = 0; i < 3; ++i) {
+        path.quadTo(pts[i % 3],  pts[(i + 2) % 3]);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_055.cpp b/docs/examples/Path_055.cpp
new file mode 100644
index 0000000..61e9c00
--- /dev/null
+++ b/docs/examples/Path_055.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1c1f4cdef1c572c9aa8fdf3e461191d0
+REG_FIDDLE(Path_055, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPath path;
+    path.moveTo(128, 20);
+    path.rQuadTo(-6, 10, -7, 10);
+    for (int i = 1; i < 32; i += 4) {
+       path.rQuadTo(10 + i, 10 + i, 10 + i * 4, 10);
+       path.rQuadTo(-10 - i, 10 + i, -10 - (i + 2) * 4, 10);
+    }
+    path.quadTo(92, 220, 128, 215);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_056.cpp b/docs/examples/Path_056.cpp
new file mode 100644
index 0000000..8427f26
--- /dev/null
+++ b/docs/examples/Path_056.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2aadded3d20dfef34d1c8abe28c7bc8d
+REG_FIDDLE(Path_056, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* verbNames[] = { "move", "line", "quad", "conic", "cubic", "close", "done" };
+    const int pointCount[]  = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };
+    SkPath path;
+    path.conicTo(20, 30, 50, 60, 1);
+    SkPath::Iter iter(path, false);
+    SkPath::Verb verb;
+    do {
+       SkPoint points[4];
+       verb = iter.next(points);
+       SkDebugf("%s ", verbNames[(int) verb]);
+       for (int i = 0; i < pointCount[(int) verb]; ++i) {
+            SkDebugf("{%g, %g}, ", points[i].fX, points[i].fY);
+       }
+       if (SkPath::kConic_Verb == verb) {
+           SkDebugf("weight = %g", iter.conicWeight());
+       }
+       SkDebugf("\n");
+    } while (SkPath::kDone_Verb != verb);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_057.cpp b/docs/examples/Path_057.cpp
new file mode 100644
index 0000000..3beaf09
--- /dev/null
+++ b/docs/examples/Path_057.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e88f554efacfa9f75f270fb1c0add5b4
+REG_FIDDLE(Path_057, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* verbNames[] = { "move", "line", "quad", "conic", "cubic", "close", "done" };
+    const int pointCount[]  = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };
+    SkPath path;
+    path.arcTo(20, 0, 20, 20, 20);
+    SkPath::Iter iter(path, false);
+    SkPath::Verb verb;
+    do {
+       SkPoint points[4];
+       verb = iter.next(points);
+       SkDebugf("%s ", verbNames[(int) verb]);
+       for (int i = 0; i < pointCount[(int) verb]; ++i) {
+            SkDebugf("{%g, %g}, ", points[i].fX, points[i].fY);
+       }
+       if (SkPath::kConic_Verb == verb) {
+           SkDebugf("weight = %g", iter.conicWeight());
+       }
+       SkDebugf("\n");
+    } while (SkPath::kDone_Verb != verb);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_058.cpp b/docs/examples/Path_058.cpp
new file mode 100644
index 0000000..c1dc83c
--- /dev/null
+++ b/docs/examples/Path_058.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6fb11419e99297fe2fe666c296117fb9
+REG_FIDDLE(Path_058, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* verbNames[] = { "move", "line", "quad", "conic", "cubic", "close", "done" };
+    const int pointCount[]  = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };
+    SkPath path;
+    path.conicTo(20, 0, 20, 20, SK_ScalarInfinity);
+    SkPath::Iter iter(path, false);
+    SkPath::Verb verb;
+    do {
+       SkPoint points[4];
+       verb = iter.next(points);
+       SkDebugf("%s ", verbNames[(int) verb]);
+       for (int i = 0; i < pointCount[(int) verb]; ++i) {
+            SkDebugf("{%g, %g}, ", points[i].fX, points[i].fY);
+       }
+       if (SkPath::kConic_Verb == verb) {
+           SkDebugf("weight = %g", iter.conicWeight());
+       }
+       SkDebugf("\n");
+    } while (SkPath::kDone_Verb != verb);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_059.cpp b/docs/examples/Path_059.cpp
new file mode 100644
index 0000000..f1e94bc
--- /dev/null
+++ b/docs/examples/Path_059.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=358d9b6060b528b0923c007420f09c13
+REG_FIDDLE(Path_059, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPoint conicPts[] = {{20, 150}, {120, 10}, {220, 150}};
+    canvas->drawLine(conicPts[0], conicPts[1], paint);
+    canvas->drawLine(conicPts[1], conicPts[2], paint);
+    SkColor colors[] = { 0xff88ff00, 0xff0088bb, 0xff6600cc, 0xffbb3377 };
+    paint.setStrokeWidth(3);
+    SkScalar weight = 0.5f;
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(colors); ++i) {
+        SkPath path;
+        path.moveTo(conicPts[0]);
+        path.conicTo(conicPts[1], conicPts[2], weight);
+        paint.setColor(colors[i]);
+        canvas->drawPath(path, paint);
+        weight += 0.25f;
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_060.cpp b/docs/examples/Path_060.cpp
new file mode 100644
index 0000000..7651dcb
--- /dev/null
+++ b/docs/examples/Path_060.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=22d25e03b19d5bae92118877e462361b
+REG_FIDDLE(Path_060, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkRect oval = {0, 20, 120, 140};
+    SkPath path;
+    for (int i = 0; i < 4; ++i) {
+        path.moveTo(oval.centerX(), oval.fTop);
+        path.arcTo(oval, -90, 90 - 20 * i, false);
+        oval.inset(15, 15);
+    }
+    path.offset(100, 0);
+    SkScalar conicWeights[] = { 0.707107f, 0.819152f, 0.906308f, 0.965926f };
+    SkPoint conicPts[][3] = { { {40, 20}, {100, 20}, {100, 80} },
+                              { {40, 35}, {71.509f, 35}, {82.286f, 64.6091f} },
+                              { {40, 50}, {53.9892f, 50}, {62.981f, 60.7164f} },
+                              { {40, 65}, {44.0192f, 65}, {47.5f, 67.0096f} } };
+    for (int i = 0; i < 4; ++i) {
+         path.moveTo(conicPts[i][0]);
+         path.conicTo(conicPts[i][1], conicPts[i][2], conicWeights[i]);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_061.cpp b/docs/examples/Path_061.cpp
new file mode 100644
index 0000000..b82e36f
--- /dev/null
+++ b/docs/examples/Path_061.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3d52763e7c0e20c0b1d484a0afa622d2
+REG_FIDDLE(Path_061, 256, 140, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath path;
+    path.moveTo(20, 80);
+    path.rConicTo( 60,   0,  60,  60, 0.707107f);
+    path.rConicTo(  0, -60,  60, -60, 0.707107f);
+    path.rConicTo(-60,   0, -60, -60, 0.707107f);
+    path.rConicTo(  0,  60, -60,  60, 0.707107f);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_062.cpp b/docs/examples/Path_062.cpp
new file mode 100644
index 0000000..8f8af80
--- /dev/null
+++ b/docs/examples/Path_062.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=466445ed991d86de08587066392d654a
+REG_FIDDLE(Path_062, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPoint cubicPts[] = {{20, 150}, {90, 10}, {160, 150}, {230, 10}};
+    SkColor colors[] = { 0xff88ff00, 0xff0088bb, 0xff6600cc, 0xffbb3377 };
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(colors); ++i) {
+        paint.setColor(0x7fffffff & colors[i]);
+        paint.setStrokeWidth(1);
+        for (unsigned j = 0; j < 3; ++j) {
+            canvas->drawLine(cubicPts[j], cubicPts[j + 1], paint);
+        }
+        SkPath path;
+        path.moveTo(cubicPts[0]);
+        path.cubicTo(cubicPts[1], cubicPts[2], cubicPts[3]);
+        paint.setStrokeWidth(3);
+        paint.setColor(colors[i]);
+        canvas->drawPath(path, paint);
+        cubicPts[1].fY += 30;
+        cubicPts[2].fX += 30;
+   }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_063.cpp b/docs/examples/Path_063.cpp
new file mode 100644
index 0000000..bf44dc4
--- /dev/null
+++ b/docs/examples/Path_063.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3e476378e3e0550ab134bbaf61112d98
+REG_FIDDLE(Path_063, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath path;
+    path.moveTo(0, -10);
+    for (int i = 0; i < 128; i += 16) {
+        SkScalar c = i * 0.5f;
+        path.cubicTo( 10 + c, -10 - i,  10 + i, -10 - c,  10 + i,       0);
+        path.cubicTo( 14 + i,  14 + c,  14 + c,  14 + i,       0,  14 + i);
+        path.cubicTo(-18 - c,  18 + i, -18 - i,  18 + c, -18 - i,       0);
+        path.cubicTo(-22 - i, -22 - c, -22 - c, -22 - i,       0, -22 - i);
+    }
+    path.offset(128, 128);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_064.cpp b/docs/examples/Path_064.cpp
new file mode 100644
index 0000000..492f08b
--- /dev/null
+++ b/docs/examples/Path_064.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d38aaf12c6ff5b8d901a2201bcee5476
+REG_FIDDLE(Path_064, 256, 84, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPoint pts[] = { {20, 20}, {300, 80}, {-140, 90}, {220, 10} };
+    SkPath path;
+    path.moveTo(pts[0]);
+    path.cubicTo(pts[1], pts[2], pts[3]);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_065.cpp b/docs/examples/Path_065.cpp
new file mode 100644
index 0000000..ffef23c
--- /dev/null
+++ b/docs/examples/Path_065.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=19f0cfc7eeba8937fe19446ec0b5f932
+REG_FIDDLE(Path_065, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath path;
+    path.moveTo(24, 108);
+    for (int i = 0; i < 16; i++) {
+       SkScalar sx, sy;
+       sx = SkScalarSinCos(i * SK_ScalarPI / 8, &sy);
+       path.rCubicTo(40 * sx, 4 * sy, 4 * sx, 40 * sy, 40 * sx, 40 * sy);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_066.cpp b/docs/examples/Path_066.cpp
new file mode 100644
index 0000000..2b7b21a
--- /dev/null
+++ b/docs/examples/Path_066.cpp
@@ -0,0 +1,47 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5acc77eba0cb4d00bbf3a8f4db0c0aee
+REG_FIDDLE(Path_066, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect oval = {8, 8, 56, 56};
+    SkPaint ovalPaint;
+    ovalPaint.setAntiAlias(true);
+    SkPaint textPaint(ovalPaint);
+    ovalPaint.setStyle(SkPaint::kStroke_Style);
+    SkPaint arcPaint(ovalPaint);
+    arcPaint.setStrokeWidth(5);
+    arcPaint.setColor(SK_ColorBLUE);
+    canvas->translate(-64, 0);
+    for (char arcStyle = '1'; arcStyle <= '6'; ++arcStyle) {
+        '4' == arcStyle ? canvas->translate(-96, 55) : canvas->translate(64, 0);
+        canvas->drawText(&arcStyle, 1, 30, 36, textPaint);
+        canvas->drawOval(oval, ovalPaint);
+        SkPath path;
+        path.moveTo({56, 32});
+        switch (arcStyle) {
+            case '1':
+                path.arcTo(oval, 0, 90, false);
+                break;
+            case '2':
+                canvas->drawArc(oval, 0, 90, false, arcPaint);
+                continue;
+            case '3':
+                path.addArc(oval, 0, 90);
+                break;
+            case '4':
+                path.arcTo({56, 56}, {32, 56}, 24);
+                break;
+            case '5':
+                path.arcTo({24, 24}, 0, SkPath::kSmall_ArcSize, SkPath::kCW_Direction, {32, 56});
+                break;
+            case '6':
+                path.conicTo({56, 56}, {32, 56}, SK_ScalarRoot2Over2);
+                break;
+         }
+         canvas->drawPath(path, arcPaint);
+     }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_067.cpp b/docs/examples/Path_067.cpp
new file mode 100644
index 0000000..edd8747
--- /dev/null
+++ b/docs/examples/Path_067.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5f02890edaa10cb5e1a4243a82b6a382
+REG_FIDDLE(Path_067, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPath path;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(4);
+    path.moveTo(0, 0);
+    path.arcTo({20, 20, 120, 120}, -90, 90, false);
+    canvas->drawPath(path, paint);
+    path.rewind();
+    path.arcTo({120, 20, 220, 120}, -90, 90, false);
+    canvas->drawPath(path, paint);
+    path.rewind();
+    path.moveTo(0, 0);
+    path.arcTo({20, 120, 120, 220}, -90, 90, true);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_068.cpp b/docs/examples/Path_068.cpp
new file mode 100644
index 0000000..3bf95c4
--- /dev/null
+++ b/docs/examples/Path_068.cpp
@@ -0,0 +1,42 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=386000684073fccabc224d7d6dc81cd9
+REG_FIDDLE(Path_068, 256, 226, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint tangentPaint;
+    tangentPaint.setAntiAlias(true);
+    SkPaint textPaint(tangentPaint);
+    tangentPaint.setStyle(SkPaint::kStroke_Style);
+    tangentPaint.setColor(SK_ColorGRAY);
+    SkPaint arcPaint(tangentPaint);
+    arcPaint.setStrokeWidth(5);
+    arcPaint.setColor(SK_ColorBLUE);
+    SkPath path;
+    SkPoint pts[] = { {56, 20}, {200, 20}, {90, 190} };
+    SkScalar radius = 50;
+    path.moveTo(pts[0]);
+    path.arcTo(pts[1], pts[2], radius);
+    canvas->drawLine(pts[0], pts[1], tangentPaint);
+    canvas->drawLine(pts[1], pts[2], tangentPaint);
+    SkPoint lastPt;
+    (void) path.getLastPt(&lastPt);
+    SkVector radial = pts[2] - pts[1];
+    radial.setLength(radius);
+    SkPoint center = { lastPt.fX - radial.fY, lastPt.fY + radial.fX };
+    canvas->drawCircle(center, radius, tangentPaint);
+    canvas->drawLine(lastPt, center, tangentPaint);
+    radial = pts[1] - pts[0];
+    radial.setLength(radius);
+    SkPoint arcStart = { center.fX + radial.fY, center.fY - radial.fX };
+    canvas->drawLine(center, arcStart, tangentPaint);
+    canvas->drawPath(path, arcPaint);
+    canvas->drawString("(x0, y0)", pts[0].fX - 5, pts[0].fY, textPaint);
+    canvas->drawString("(x1, y1)", pts[1].fX + 5, pts[1].fY, textPaint);
+    canvas->drawString("(x2, y2)", pts[2].fX, pts[2].fY + 15, textPaint);
+    canvas->drawString("radius", center.fX + 15, center.fY + 25, textPaint);
+    canvas->drawString("radius", center.fX - 3, center.fY - 16, textPaint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_069.cpp b/docs/examples/Path_069.cpp
new file mode 100644
index 0000000..f11cfe2
--- /dev/null
+++ b/docs/examples/Path_069.cpp
@@ -0,0 +1,41 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=78f3c65fa900610bb52518989b547095
+REG_FIDDLE(Path_069, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint tangentPaint;
+    tangentPaint.setAntiAlias(true);
+    SkPaint textPaint(tangentPaint);
+    tangentPaint.setStyle(SkPaint::kStroke_Style);
+    tangentPaint.setColor(SK_ColorGRAY);
+    SkPaint arcPaint(tangentPaint);
+    arcPaint.setStrokeWidth(5);
+    arcPaint.setColor(SK_ColorBLUE);
+    SkPath path;
+    SkPoint pts[] = { {156, 20}, {200, 20}, {170, 50} };
+    SkScalar radius = 50;
+    path.moveTo(pts[0]);
+    path.arcTo(pts[1], pts[2], radius);
+    canvas->drawLine(pts[0], pts[1], tangentPaint);
+    canvas->drawLine(pts[1], pts[2], tangentPaint);
+    SkPoint lastPt;
+    (void) path.getLastPt(&lastPt);
+    SkVector radial = pts[2] - pts[1];
+    radial.setLength(radius);
+    SkPoint center = { lastPt.fX - radial.fY, lastPt.fY + radial.fX };
+    canvas->drawLine(lastPt, center, tangentPaint);
+    radial = pts[1] - pts[0];
+    radial.setLength(radius);
+    SkPoint arcStart = { center.fX + radial.fY, center.fY - radial.fX };
+    canvas->drawLine(center, arcStart, tangentPaint);
+    canvas->drawPath(path, arcPaint);
+    canvas->drawString("(x0, y0)", pts[0].fX, pts[0].fY - 7, textPaint);
+    canvas->drawString("(x1, y1)", pts[1].fX + 5, pts[1].fY, textPaint);
+    canvas->drawString("(x2, y2)", pts[2].fX, pts[2].fY + 15, textPaint);
+    canvas->drawString("radius", center.fX + 15, center.fY + 25, textPaint);
+    canvas->drawString("radius", center.fX - 5, center.fY - 20, textPaint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_070.cpp b/docs/examples/Path_070.cpp
new file mode 100644
index 0000000..9b83078
--- /dev/null
+++ b/docs/examples/Path_070.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=498360fa0a201cc5db04b1c27256358f
+REG_FIDDLE(Path_070, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo({156, 20});
+    path.arcTo(200, 20, 170, 50, 50);
+    SkPath::Iter iter(path, false);
+    SkPoint p[4];
+    SkPath::Verb verb;
+    while (SkPath::kDone_Verb != (verb = iter.next(p))) {
+        switch (verb) {
+            case SkPath::kMove_Verb:
+                SkDebugf("move to (%g,%g)\n", p[0].fX, p[0].fY);
+                break;
+            case SkPath::kLine_Verb:
+                SkDebugf("line (%g,%g),(%g,%g)\n", p[0].fX, p[0].fY, p[1].fX, p[1].fY);
+                break;
+            case SkPath::kConic_Verb:
+                SkDebugf("conic (%g,%g),(%g,%g),(%g,%g) weight %g\n",
+                         p[0].fX, p[0].fY, p[1].fX, p[1].fY, p[2].fX, p[2].fY, iter.conicWeight());
+                break;
+            default:
+                SkDebugf("unexpected verb\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_071.cpp b/docs/examples/Path_071.cpp
new file mode 100644
index 0000000..5391fc4
--- /dev/null
+++ b/docs/examples/Path_071.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0c056264a361579c18e5d02d3172d4d4
+REG_FIDDLE(Path_071, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo({156, 20});
+    path.arcTo({200, 20}, {170, 20}, 50);
+    SkPath::Iter iter(path, false);
+    SkPoint p[4];
+    SkPath::Verb verb;
+    while (SkPath::kDone_Verb != (verb = iter.next(p))) {
+        switch (verb) {
+            case SkPath::kMove_Verb:
+                SkDebugf("move to (%g,%g)\n", p[0].fX, p[0].fY);
+                break;
+            case SkPath::kLine_Verb:
+                SkDebugf("line (%g,%g),(%g,%g)\n", p[0].fX, p[0].fY, p[1].fX, p[1].fY);
+                break;
+            case SkPath::kConic_Verb:
+                SkDebugf("conic (%g,%g),(%g,%g),(%g,%g) weight %g\n",
+                          p[0].fX, p[0].fY, p[1].fX, p[1].fY, p[2].fX, p[2].fY, iter.conicWeight());
+                break;
+            default:
+                SkDebugf("unexpected verb\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_072.cpp b/docs/examples/Path_072.cpp
new file mode 100644
index 0000000..fbc20ae
--- /dev/null
+++ b/docs/examples/Path_072.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8e40c546eecd9cc213200717240898ba
+REG_FIDDLE(Path_072, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (auto sweep: { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {
+        for (auto arcSize : { SkPath::kSmall_ArcSize, SkPath::kLarge_ArcSize } ) {
+            SkPath path;
+            path.moveTo({120, 50});
+            path.arcTo(70, 40, 30, arcSize, sweep, 156, 100);
+            if (SkPath::kCCW_Direction == sweep && SkPath::kLarge_ArcSize == arcSize) {
+                paint.setColor(SK_ColorBLUE);
+                paint.setStrokeWidth(3);
+            }
+            canvas->drawPath(path, paint);
+         }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_073.cpp b/docs/examples/Path_073.cpp
new file mode 100644
index 0000000..fce18ec
--- /dev/null
+++ b/docs/examples/Path_073.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6b6ea44f659b27918f3a6fa621bf6173
+REG_FIDDLE(Path_073, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (auto sweep: { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {
+        for (auto arcSize : { SkPath::kSmall_ArcSize, SkPath::kLarge_ArcSize } ) {
+            SkPath path;
+            path.moveTo({120, 50});
+            path.arcTo(70, 40, 30, arcSize, sweep, 120.1f, 50);
+            if (SkPath::kCCW_Direction == sweep && SkPath::kLarge_ArcSize == arcSize) {
+                paint.setColor(SK_ColorBLUE);
+                paint.setStrokeWidth(3);
+            }
+            canvas->drawPath(path, paint);
+         }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_074.cpp b/docs/examples/Path_074.cpp
new file mode 100644
index 0000000..22f0396
--- /dev/null
+++ b/docs/examples/Path_074.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3f76a1007416181a4848c1a87fc81dbd
+REG_FIDDLE(Path_074, 256, 108, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPath path;
+    const SkPoint starts[] = {{20, 20}, {120, 20}, {70, 60}};
+    for (auto start : starts) {
+        path.moveTo(start.fX, start.fY);
+        path.rArcTo(20, 20, 0, SkPath::kSmall_ArcSize, SkPath::kCCW_Direction, 60, 0);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_075.cpp b/docs/examples/Path_075.cpp
new file mode 100644
index 0000000..3aa835b
--- /dev/null
+++ b/docs/examples/Path_075.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3f76a1007416181a4848c1a87fc81dbd
+REG_FIDDLE(Path_075, 256, 108, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPath path;
+    const SkPoint starts[] = {{20, 20}, {120, 20}, {70, 60}};
+    for (auto start : starts) {
+        path.moveTo(start.fX, start.fY);
+        path.rArcTo(20, 20, 0, SkPath::kSmall_ArcSize, SkPath::kCCW_Direction, 60, 0);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_076.cpp b/docs/examples/Path_076.cpp
new file mode 100644
index 0000000..1f2589d
--- /dev/null
+++ b/docs/examples/Path_076.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9235f6309271d6420fa5c45dc28664c5
+REG_FIDDLE(Path_076, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(15);
+    paint.setStrokeCap(SkPaint::kRound_Cap);
+    SkPath path;
+    const SkPoint points[] = {{20, 20}, {70, 20}, {40, 90}};
+    path.addPoly(points, SK_ARRAY_COUNT(points), false);
+    for (int loop = 0; loop < 2; ++loop) {
+        for (auto style : {SkPaint::kStroke_Style, SkPaint::kFill_Style,
+                SkPaint::kStrokeAndFill_Style} ) {
+            paint.setStyle(style);
+            canvas->drawPath(path, paint);
+            canvas->translate(85, 0);
+        }
+        path.close();
+        canvas->translate(-255, 128);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_077.cpp b/docs/examples/Path_077.cpp
new file mode 100644
index 0000000..2adb503
--- /dev/null
+++ b/docs/examples/Path_077.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1453856a9d0c73e8192bf298c4143563
+REG_FIDDLE(Path_077, 256, 256, true, 0) {
+#define nameValue(fill) { SkPath::fill, #fill }
+
+void draw(SkCanvas* canvas) {
+    struct {
+        SkPath::FillType fill;
+        const char* name;
+    } fills[] = {
+        nameValue(kWinding_FillType),
+        nameValue(kEvenOdd_FillType),
+        nameValue(kInverseWinding_FillType),
+        nameValue(kInverseEvenOdd_FillType),
+    };
+    for (auto fill: fills ) {
+        SkDebugf("IsInverseFillType(%s) == %s\n", fill.name, SkPath::IsInverseFillType(fill.fill) ?
+                 "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_078.cpp b/docs/examples/Path_078.cpp
new file mode 100644
index 0000000..06be131
--- /dev/null
+++ b/docs/examples/Path_078.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=319f6b124458dcc0f9ce4d7bbde65810
+REG_FIDDLE(Path_078, 256, 256, true, 0) {
+#define nameValue(fill) { SkPath::fill, #fill }
+
+void draw(SkCanvas* canvas) {
+    struct {
+        SkPath::FillType fill;
+        const char* name;
+    } fills[] = {
+        nameValue(kWinding_FillType),
+        nameValue(kEvenOdd_FillType),
+        nameValue(kInverseWinding_FillType),
+        nameValue(kInverseEvenOdd_FillType),
+    };
+    for (unsigned i = 0; i < SK_ARRAY_COUNT(fills); ++i) {
+        if (fills[i].fill != (SkPath::FillType) i) {
+            SkDebugf("fills array order does not match FillType enum order");
+            break;
+        }
+        SkDebugf("ConvertToNonInverseFillType(%s) == %s\n", fills[i].name,
+                fills[(int) SkPath::ConvertToNonInverseFillType(fills[i].fill)].name);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_079.cpp b/docs/examples/Path_079.cpp
new file mode 100644
index 0000000..57571de
--- /dev/null
+++ b/docs/examples/Path_079.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3ba94448a4ba48f926e643baeb5b1016
+REG_FIDDLE(Path_079, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+      SkPaint conicPaint;
+      conicPaint.setAntiAlias(true);
+      conicPaint.setStyle(SkPaint::kStroke_Style);
+      SkPaint quadPaint(conicPaint);
+      quadPaint.setColor(SK_ColorRED);
+      SkPoint conic[] = { {20, 170}, {80, 170}, {80, 230} };
+      for (auto weight : { .25f, .5f, .707f, .85f, 1.f } ) {
+          SkPoint quads[5];
+          SkPath::ConvertConicToQuads(conic[0], conic[1], conic[2], weight, quads, 1);
+          SkPath path;
+          path.moveTo(conic[0]);
+          path.conicTo(conic[1], conic[2], weight);
+          canvas->drawPath(path, conicPaint);
+          path.rewind();
+          path.moveTo(quads[0]);
+          path.quadTo(quads[1], quads[2]);
+          path.quadTo(quads[3], quads[4]);
+          canvas->drawPath(path, quadPaint);
+          canvas->translate(50, -50);
+      }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_080.cpp b/docs/examples/Path_080.cpp
new file mode 100644
index 0000000..f61ce5c
--- /dev/null
+++ b/docs/examples/Path_080.cpp
@@ -0,0 +1,30 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=81a2aac1b8f0ff3d4c8d35ccb9149b16
+REG_FIDDLE(Path_080, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path) -> void {
+        SkRect rect;
+        SkPath::Direction direction;
+        bool isClosed;
+        path.isRect(&rect, &isClosed, &direction) ?
+                SkDebugf("%s is rect (%g, %g, %g, %g); is %s" "closed; direction %s\n", prefix,
+                         rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, isClosed ? "" : "not ",
+                         SkPath::kCW_Direction == direction ? "CW" : "CCW") :
+                SkDebugf("%s is not rect\n", prefix);
+    };
+    SkPath path;
+    debugster("empty", path);
+    path.addRect({10, 20, 30, 40});
+    debugster("addRect", path);
+    path.moveTo(60, 70);
+    debugster("moveTo", path);
+    path.lineTo(60, 70);
+    debugster("lineTo", path);
+    path.reset();
+    const SkPoint pts[] = { {0, 0}, {0, 80}, {80, 80}, {80, 0}, {40, 0}, {20, 0} };
+    path.addPoly(pts, SK_ARRAY_COUNT(pts), false);
+    debugster("addPoly", path);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_081.cpp b/docs/examples/Path_081.cpp
new file mode 100644
index 0000000..701d906
--- /dev/null
+++ b/docs/examples/Path_081.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=77e4394caf9fa083c19c21c2462efe14
+REG_FIDDLE(Path_081, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(5);
+    SkPath path;
+    path.addRect({10, 20, 30, 40});
+    paint.getFillPath(path, &path);
+    SkRect rects[2];
+    SkPath::Direction directions[2];
+    if (path.isNestedFillRects(rects, directions)) {
+        for (int i = 0; i < 2; ++i) {
+            SkDebugf("%s (%g, %g, %g, %g); direction %s\n", i ? "inner" : "outer",
+                     rects[i].fLeft, rects[i].fTop, rects[i].fRight, rects[i].fBottom,
+                     SkPath::kCW_Direction == directions[i] ? "CW" : "CCW");
+        }
+    } else {
+        SkDebugf("is not nested rectangles\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_082.cpp b/docs/examples/Path_082.cpp
new file mode 100644
index 0000000..02d47f7
--- /dev/null
+++ b/docs/examples/Path_082.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0f841e4eaebb613b5069800567917c2d
+REG_FIDDLE(Path_082, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(15);
+    paint.setStrokeCap(SkPaint::kSquare_Cap);
+    float intervals[] = { 5, 21.75f };
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));
+    SkPath path;
+    path.addRect({20, 20, 100, 100}, SkPath::kCW_Direction);
+    canvas->drawPath(path, paint);
+    path.rewind();
+    path.addRect({140, 20, 220, 100}, SkPath::kCCW_Direction);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_083.cpp b/docs/examples/Path_083.cpp
new file mode 100644
index 0000000..250d788
--- /dev/null
+++ b/docs/examples/Path_083.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9202430b3f4f5275af8eec5cc9d7baa8
+REG_FIDDLE(Path_083, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    const SkPoint arrow[] = { {5, -5}, {15, -5}, {20, 0}, {15, 5}, {5, 5}, {10, 0} };
+    const SkRect rect = {10, 10, 54, 54};
+    SkPaint rectPaint;
+    rectPaint.setAntiAlias(true);
+    rectPaint.setStyle(SkPaint::kStroke_Style);
+    SkPaint arrowPaint(rectPaint);
+    SkPath arrowPath;
+    arrowPath.addPoly(arrow, SK_ARRAY_COUNT(arrow), true);
+    arrowPaint.setPathEffect(SkPath1DPathEffect::Make(arrowPath, 176, 0,
+                             SkPath1DPathEffect::kRotate_Style));
+    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {
+        for (unsigned start : { 0, 1, 2, 3 } ) {
+           SkPath path;
+           path.addRect(rect, direction, start);
+           canvas->drawPath(path, rectPaint);
+           canvas->drawPath(path, arrowPaint);
+           canvas->translate(64, 0);
+       }
+       canvas->translate(-256, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_084.cpp b/docs/examples/Path_084.cpp
new file mode 100644
index 0000000..3389ab3
--- /dev/null
+++ b/docs/examples/Path_084.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3837827310e8b88b8c2e128ef9fbbd65
+REG_FIDDLE(Path_084, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(15);
+    paint.setStrokeCap(SkPaint::kSquare_Cap);
+    float intervals[] = { 5, 21.75f };
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));
+    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {
+        SkPath path;
+        path.addRect(20, 20, 100, 100, direction);
+        canvas->drawPath(path, paint);
+        canvas->translate(128, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_085.cpp b/docs/examples/Path_085.cpp
new file mode 100644
index 0000000..ed8b1dc
--- /dev/null
+++ b/docs/examples/Path_085.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cac84cf68e63a453c2a8b64c91537704
+REG_FIDDLE(Path_085, 256, 120, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkPath oval;
+    oval.addOval({20, 20, 160, 80});
+    canvas->drawPath(oval, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_086.cpp b/docs/examples/Path_086.cpp
new file mode 100644
index 0000000..a90b34c
--- /dev/null
+++ b/docs/examples/Path_086.cpp
@@ -0,0 +1,34 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f1122d6fffddac0167e96fab4b9a862f
+REG_FIDDLE(Path_086, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    const SkPoint arrow[] = { {0, -5}, {10, 0}, {0, 5} };
+    const SkRect rect = {10, 10, 54, 54};
+    SkPaint ovalPaint;
+    ovalPaint.setAntiAlias(true);
+    SkPaint textPaint(ovalPaint);
+    ovalPaint.setStyle(SkPaint::kStroke_Style);
+    SkPaint arrowPaint(ovalPaint);
+    SkPath arrowPath;
+    arrowPath.addPoly(arrow, SK_ARRAY_COUNT(arrow), true);
+    arrowPaint.setPathEffect(SkPath1DPathEffect::Make(arrowPath, 176, 0,
+                             SkPath1DPathEffect::kRotate_Style));
+    for (auto direction : { SkPath::kCW_Direction, SkPath::kCCW_Direction } ) {
+        for (unsigned start : { 0, 1, 2, 3 } ) {
+           SkPath path;
+           path.addOval(rect, direction, start);
+           canvas->drawPath(path, ovalPaint);
+           canvas->drawPath(path, arrowPaint);
+           canvas->drawText(&"0123"[start], 1, rect.centerX(), rect.centerY() + 5, textPaint);
+           canvas->translate(64, 0);
+       }
+       canvas->translate(-256, 72);
+       canvas->drawString(SkPath::kCW_Direction == direction ? "clockwise" : "counterclockwise",
+                          128, 0, textPaint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_087.cpp b/docs/examples/Path_087.cpp
new file mode 100644
index 0000000..2ba6fb6
--- /dev/null
+++ b/docs/examples/Path_087.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bd5286cb9a5e5c32cd980f72b8f400fb
+REG_FIDDLE(Path_087, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(10);
+    for (int size = 10; size < 300; size += 20) {
+        SkPath path;
+        path.addCircle(128, 128, size, SkPath::kCW_Direction);
+        canvas->drawPath(path, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_088.cpp b/docs/examples/Path_088.cpp
new file mode 100644
index 0000000..c21bc05
--- /dev/null
+++ b/docs/examples/Path_088.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9cf5122475624e4cf39f06c698f80b1a
+REG_FIDDLE(Path_088, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    for (auto start : { 0, 90, 135, 180, 270 } ) {
+        for (auto sweep : { -450.f, -180.f, -90.f, 90.f, 180.f, 360.1f } ) {
+            SkPath path;
+            path.addArc({10, 10, 35, 45}, start, sweep);
+            canvas->drawPath(path, paint);
+            canvas->translate(252 / 6, 0);
+        }
+        canvas->translate(-252, 255 / 5);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_089.cpp b/docs/examples/Path_089.cpp
new file mode 100644
index 0000000..d45529b
--- /dev/null
+++ b/docs/examples/Path_089.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=24736f685f265cf533f1700c042db353
+REG_FIDDLE(Path_089, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    for (auto xradius : { 0, 7, 13, 20 } ) {
+        for (auto yradius : { 0, 9, 18, 40 } ) {
+            SkPath path;
+            path.addRoundRect({10, 10, 36, 46}, xradius, yradius);
+            paint.setColor(path.isRect(nullptr) ? SK_ColorRED : path.isOval(nullptr) ?
+                           SK_ColorBLUE : path.isConvex() ? SK_ColorGRAY : SK_ColorGREEN);
+            canvas->drawPath(path, paint);
+            canvas->translate(64, 0);
+        }
+        canvas->translate(-256, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_090.cpp b/docs/examples/Path_090.cpp
new file mode 100644
index 0000000..72cba0b
--- /dev/null
+++ b/docs/examples/Path_090.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c43d70606b4ee464d2befbcf448c5e73
+REG_FIDDLE(Path_090, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkScalar radii[] = { 80, 100, 0, 0, 40, 60, 0, 0 };
+    SkPath path;
+    SkMatrix rotate90;
+    rotate90.setRotate(90, 128, 128);
+    for (int i = 0; i < 4; ++i) {
+        path.addRoundRect({10, 10, 110, 110}, radii);
+        path.transform(rotate90);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_091.cpp b/docs/examples/Path_091.cpp
new file mode 100644
index 0000000..01dde23
--- /dev/null
+++ b/docs/examples/Path_091.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d9ecd58081b5bc77a157636fcb345dc6
+REG_FIDDLE(Path_091, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRRect rrect;
+    SkVector radii[] = {{50, 50}, {0, 0}, {0, 0}, {50, 50}};
+    rrect.setRectRadii({10, 10, 110, 110}, radii);
+    SkPath path;
+    SkMatrix rotate90;
+    rotate90.setRotate(90, 128, 128);
+    for (int i = 0; i < 4; ++i) {
+        path.addRRect(rrect);
+        path.transform(rotate90);
+    }
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_092.cpp b/docs/examples/Path_092.cpp
new file mode 100644
index 0000000..a138f31
--- /dev/null
+++ b/docs/examples/Path_092.cpp
@@ -0,0 +1,30 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=888edd4c4a91ca62ceb01bce8ab675b2
+REG_FIDDLE(Path_092, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRRect rrect;
+    rrect.setRectXY({40, 40, 215, 215}, 50, 50);
+    SkPath path;
+    path.addRRect(rrect);
+    canvas->drawPath(path, paint);
+    for (int start = 0; start < 8; ++start) {
+        SkPath textPath;
+        textPath.addRRect(rrect, SkPath::kCW_Direction, start);
+        SkPathMeasure pathMeasure(textPath, false);
+        SkPoint position;
+        SkVector tangent;
+        if (!pathMeasure.getPosTan(0, &position, &tangent)) {
+            continue;
+        }
+        SkRSXform rsxForm = SkRSXform::Make(tangent.fX, tangent.fY,
+               position.fX + tangent.fY * 5, position.fY - tangent.fX * 5);
+        canvas->drawTextRSXform(&"01234567"[start], 1, &rsxForm, nullptr, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_093.cpp b/docs/examples/Path_093.cpp
new file mode 100644
index 0000000..5e7e4fd
--- /dev/null
+++ b/docs/examples/Path_093.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=182b3999772f330f3b0b891b492634ae
+REG_FIDDLE(Path_093, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(15);
+    paint.setStrokeCap(SkPaint::kRound_Cap);
+    const SkPoint points[] = {{20, 20}, {70, 20}, {40, 90}};
+    for (bool close : { false, true } ) {
+        SkPath path;
+        path.addPoly(points, SK_ARRAY_COUNT(points), close);
+        for (auto style : {SkPaint::kStroke_Style, SkPaint::kFill_Style,
+                SkPaint::kStrokeAndFill_Style} ) {
+            paint.setStyle(style);
+            canvas->drawPath(path, paint);
+            canvas->translate(85, 0);
+        }
+        canvas->translate(-255, 128);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_094.cpp b/docs/examples/Path_094.cpp
new file mode 100644
index 0000000..01f0477
--- /dev/null
+++ b/docs/examples/Path_094.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1a6b69acad5ceafede3c5984ec6634cb
+REG_FIDDLE(Path_094, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(15);
+    paint.setStrokeCap(SkPaint::kRound_Cap);
+    for (bool close : { false, true } ) {
+        SkPath path;
+        path.addPoly({{20, 20}, {70, 20}, {40, 90}}, close);
+        for (auto style : {SkPaint::kStroke_Style, SkPaint::kFill_Style,
+                SkPaint::kStrokeAndFill_Style} ) {
+            paint.setStyle(style);
+            canvas->drawPath(path, paint);
+            canvas->translate(85, 0);
+        }
+        canvas->translate(-255, 128);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_095.cpp b/docs/examples/Path_095.cpp
new file mode 100644
index 0000000..34f94ea
--- /dev/null
+++ b/docs/examples/Path_095.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=801b02e74c64aafdb734f2e5cf3e5ab0
+REG_FIDDLE(Path_095, 256, 180, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path, path2;
+    path.moveTo(20, 20);
+    path.lineTo(20, 40);
+    path.lineTo(40, 20);
+    path2.moveTo(60, 60);
+    path2.lineTo(80, 60);
+    path2.lineTo(80, 40);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (int i = 0; i < 2; i++) {
+        for (auto addPathMode : { SkPath::kAppend_AddPathMode, SkPath::kExtend_AddPathMode } ) {
+            SkPath test(path);
+            test.addPath(path2, addPathMode);
+            canvas->drawPath(test, paint);
+            canvas->translate(100, 0);
+        }
+        canvas->translate(-200, 100);
+        path.close();
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_096.cpp b/docs/examples/Path_096.cpp
new file mode 100644
index 0000000..2747e77
--- /dev/null
+++ b/docs/examples/Path_096.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c416bddfe286628974e1c7f0fd66f3f4
+REG_FIDDLE(Path_096, 256, 180, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    paint.setFakeBoldText(true);
+    SkPath dest, text;
+    paint.getTextPath("O", 1, 50, 120, &text);
+    for (int i = 0; i < 3; i++) {
+        dest.addPath(text, i * 20, i * 20);
+    }
+    Simplify(dest, &dest);
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setStrokeWidth(3);
+    canvas->drawPath(dest, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_097.cpp b/docs/examples/Path_097.cpp
new file mode 100644
index 0000000..5ba0471
--- /dev/null
+++ b/docs/examples/Path_097.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=84b2d1c0fc29f1b35e855b6fc6672f9e
+REG_FIDDLE(Path_097, 256, 80, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath dest, path;
+    path.addOval({-80, 20, 0, 60}, SkPath::kCW_Direction, 1);
+    for (int i = 0; i < 2; i++) {
+        dest.addPath(path, SkPath::kExtend_AddPathMode);
+        dest.offset(100, 0);
+    }
+    canvas->drawPath(dest, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_098.cpp b/docs/examples/Path_098.cpp
new file mode 100644
index 0000000..6ca2bef
--- /dev/null
+++ b/docs/examples/Path_098.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3a90a91030f7289d5df0671d342dbbad
+REG_FIDDLE(Path_098, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkPath dest, path;
+    path.addOval({20, 20, 200, 120}, SkPath::kCW_Direction, 1);
+    for (int i = 0; i < 6; i++) {
+        SkMatrix matrix;
+        matrix.reset();
+        matrix.setPerspX(i / 400.f);
+        dest.addPath(path, matrix);
+    }
+    canvas->drawPath(dest, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_099.cpp b/docs/examples/Path_099.cpp
new file mode 100644
index 0000000..fd6dc1d
--- /dev/null
+++ b/docs/examples/Path_099.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5e8513f073db09acde3ff616f6426e3d
+REG_FIDDLE(Path_099, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo(20, 20);
+    path.lineTo(20, 40);
+    path.lineTo(40, 20);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (int i = 0; i < 2; i++) {
+        SkPath path2;
+        path2.moveTo(60, 60);
+        path2.lineTo(80, 60);
+        path2.lineTo(80, 40);
+        for (int j = 0; j < 2; j++) {
+            SkPath test(path);
+            test.reverseAddPath(path2);
+            canvas->drawPath(test, paint);
+            canvas->translate(100, 0);
+            path2.close();
+        }
+        canvas->translate(-200, 100);
+        path.close();
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_100.cpp b/docs/examples/Path_100.cpp
new file mode 100644
index 0000000..94c0cef
--- /dev/null
+++ b/docs/examples/Path_100.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1d1892196ba5bda257df4f3351abd084
+REG_FIDDLE(Path_100, 256, 60, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath pattern;
+    pattern.moveTo(20, 20);
+    pattern.lineTo(20, 40);
+    pattern.lineTo(40, 20);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (int i = 0; i < 10; i++) {
+        SkPath path;
+        pattern.offset(20 * i, 0, &path);
+        canvas->drawPath(path, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_101.cpp b/docs/examples/Path_101.cpp
new file mode 100644
index 0000000..7263dc5
--- /dev/null
+++ b/docs/examples/Path_101.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5188d77585715db30bef228f2dfbcccd
+REG_FIDDLE(Path_101, 256, 60, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo(20, 20);
+    path.lineTo(20, 40);
+    path.lineTo(40, 20);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (int i = 0; i < 10; i++) {
+        canvas->drawPath(path, paint);
+        path.offset(20, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_102.cpp b/docs/examples/Path_102.cpp
new file mode 100644
index 0000000..c772b2a
--- /dev/null
+++ b/docs/examples/Path_102.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=99761add116ce3b0730557224c1b0105
+REG_FIDDLE(Path_102, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath pattern;
+    pattern.moveTo(100, 100);
+    pattern.lineTo(100, 20);
+    pattern.lineTo(20, 100);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (int i = 0; i < 10; i++) {
+        SkPath path;
+        SkMatrix matrix;
+        matrix.setRotate(36 * i, 100, 100);
+        pattern.transform(matrix, &path);
+        canvas->drawPath(path, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_103.cpp b/docs/examples/Path_103.cpp
new file mode 100644
index 0000000..895a2d4
--- /dev/null
+++ b/docs/examples/Path_103.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c40979a3b92a30cfb7bae36abcc1d805
+REG_FIDDLE(Path_103, 256, 200, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo(100, 100);
+    path.quadTo(100, 20, 20, 100);
+    SkPaint paint;
+    paint.setStyle(SkPaint::kStroke_Style);
+    for (int i = 0; i < 10; i++) {
+        SkMatrix matrix;
+        matrix.setRotate(36, 100, 100);
+        path.transform(matrix);
+        canvas->drawPath(path, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_104.cpp b/docs/examples/Path_104.cpp
new file mode 100644
index 0000000..642b0fd
--- /dev/null
+++ b/docs/examples/Path_104.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=df8160dd7ac8aa4b40fce7286fe49952
+REG_FIDDLE(Path_104, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo(100, 100);
+    path.quadTo(100, 20, 20, 100);
+    SkMatrix matrix;
+    matrix.setRotate(36, 100, 100);
+    path.transform(matrix);
+    SkPoint last;
+    path.getLastPt(&last);
+    SkDebugf("last point: %g, %g\n", last.fX, last.fY);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_105.cpp b/docs/examples/Path_105.cpp
new file mode 100644
index 0000000..510dcb0
--- /dev/null
+++ b/docs/examples/Path_105.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=542c5afaea5f57baa11d0561dd402e18
+REG_FIDDLE(Path_105, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath path;
+    paint.getTextPath("@", 1, 60, 100, &path);
+    path.setLastPt(20, 120);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_106.cpp b/docs/examples/Path_106.cpp
new file mode 100644
index 0000000..607dc17
--- /dev/null
+++ b/docs/examples/Path_106.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6fa5e8f9513b3225e106778592e27e94
+REG_FIDDLE(Path_106, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath path, path2;
+    paint.getTextPath("A", 1, 60, 100, &path);
+    paint.getTextPath("Z", 1, 60, 100, &path2);
+    SkPoint pt, pt2;
+    path.getLastPt(&pt);
+    path2.getLastPt(&pt2);
+    path.setLastPt(pt2);
+    path2.setLastPt(pt);
+    canvas->drawPath(path, paint);
+    canvas->drawPath(path2, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_107.cpp b/docs/examples/Path_107.cpp
new file mode 100644
index 0000000..9d0b0be
--- /dev/null
+++ b/docs/examples/Path_107.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a61e5758574e28190ec4ed8c4ae7e7fa
+REG_FIDDLE(Path_107, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.conicTo(10, 10, 20, 30, 1);
+    SkDebugf("Path kConic_SegmentMask is %s\n", path.getSegmentMasks() &
+          SkPath::kConic_SegmentMask ? "set" : "clear");
+    SkDebugf("Path kQuad_SegmentMask is %s\n", path.getSegmentMasks() &
+          SkPath::kQuad_SegmentMask ? "set" : "clear");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_108.cpp b/docs/examples/Path_108.cpp
new file mode 100644
index 0000000..c34032f
--- /dev/null
+++ b/docs/examples/Path_108.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=657a3f3e11acafea92b84d6bb0c13633
+REG_FIDDLE(Path_108, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.quadTo(20, 30, 40, 50);
+    path.close();
+    const char* masks[] = { "line", "quad", "conic", "cubic" };
+    int index = 0;
+    for (auto mask : { SkPath::kLine_SegmentMask, SkPath::kQuad_SegmentMask,
+            SkPath::kConic_SegmentMask, SkPath::kCubic_SegmentMask } ) {
+        if (mask & path.getSegmentMasks()) {
+           SkDebugf("mask %s set\n", masks[index]);
+        }
+        ++index;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_109.cpp b/docs/examples/Path_109.cpp
new file mode 100644
index 0000000..177a088
--- /dev/null
+++ b/docs/examples/Path_109.cpp
@@ -0,0 +1,26 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c0216b3f7ebd80b9589ae5728f08fc80
+REG_FIDDLE(Path_109, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkPaint paint;
+    paint.setTextSize(256);
+    paint.getTextPath("&", 1, 30, 220, &path);
+    for (int y = 2; y < 256; y += 9) {
+       for (int x = 2; x < 256; x += 9) {
+           int coverage = 0;
+           for (int iy = -4; iy <= 4; iy += 2) {
+               for (int ix = -4; ix <= 4; ix += 2) {
+                   coverage += path.contains(x + ix, y + iy);
+               }
+           }
+           paint.setColor(SkColorSetARGB(0x5f, 0xff * coverage / 25, 0, 0xff * (25 - coverage) / 25));
+           canvas->drawCircle(x, y, 8, paint);
+       }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_110.cpp b/docs/examples/Path_110.cpp
new file mode 100644
index 0000000..618cbe9
--- /dev/null
+++ b/docs/examples/Path_110.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8036d764452a62f9953af50846f0f3c0
+REG_FIDDLE(Path_110, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.quadTo(20, 30, 40, 50);
+    for (bool forceClose : { false, true } ) {
+        for (bool dumpAsHex : { false, true } ) {
+            path.dump(nullptr, forceClose, dumpAsHex);
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_111.cpp b/docs/examples/Path_111.cpp
new file mode 100644
index 0000000..441463c
--- /dev/null
+++ b/docs/examples/Path_111.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=92e0032f85181795d1f8b5a2c8e4e4b7
+REG_FIDDLE(Path_111, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path, copy;
+    path.lineTo(6.f / 7, 2.f / 3);
+    path.dump();
+    copy.setFillType(SkPath::kWinding_FillType);
+    copy.moveTo(0, 0);
+    copy.lineTo(0.857143f, 0.666667f);
+    SkDebugf("path is " "%s" "equal to copy\n", path == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_112.cpp b/docs/examples/Path_112.cpp
new file mode 100644
index 0000000..b162bec
--- /dev/null
+++ b/docs/examples/Path_112.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=72a92fe058e8b3be6c8a30fad7fd1266
+REG_FIDDLE(Path_112, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path, copy;
+    path.lineTo(6.f / 7, 2.f / 3);
+    path.dumpHex();
+    copy.setFillType(SkPath::kWinding_FillType);
+    copy.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000));  // 0, 0
+    copy.lineTo(SkBits2Float(0x3f5b6db7), SkBits2Float(0x3f2aaaab));  // 0.857143f, 0.666667f
+    SkDebugf("path is " "%s" "equal to copy\n", path == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_113.cpp b/docs/examples/Path_113.cpp
new file mode 100644
index 0000000..c96c51e
--- /dev/null
+++ b/docs/examples/Path_113.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e5f16eda6a1c2d759556285f72598445
+REG_FIDDLE(Path_113, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path, copy;
+    path.lineTo(6.f / 7, 2.f / 3);
+    size_t size = path.writeToMemory(nullptr);
+    SkTDArray<char> storage;
+    storage.setCount(size);
+    path.writeToMemory(storage.begin());
+    copy.readFromMemory(storage.begin(), size);
+    SkDebugf("path is " "%s" "equal to copy\n", path == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_114.cpp b/docs/examples/Path_114.cpp
new file mode 100644
index 0000000..aff6666
--- /dev/null
+++ b/docs/examples/Path_114.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2c6aff73608cd198659db6d1eeaaae4f
+REG_FIDDLE(Path_114, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path, copy;
+    path.lineTo(6.f / 7, 2.f / 3);
+    sk_sp<SkData> data = path.serialize();
+    copy.readFromMemory(data->data(), data->size());
+    SkDebugf("path is " "%s" "equal to copy\n", path == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_115.cpp b/docs/examples/Path_115.cpp
new file mode 100644
index 0000000..92da15d
--- /dev/null
+++ b/docs/examples/Path_115.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9c6edd836c573a0fd232d2b8aa11a678
+REG_FIDDLE(Path_115, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path, copy;
+    path.lineTo(6.f / 7, 2.f / 3);
+    size_t size = path.writeToMemory(nullptr);
+    SkTDArray<char> storage;
+    storage.setCount(size);
+    path.writeToMemory(storage.begin());
+    size_t wrongSize = size - 4;
+    size_t bytesRead = copy.readFromMemory(storage.begin(), wrongSize);
+    SkDebugf("length = %u; returned by readFromMemory = %u\n", wrongSize, bytesRead);
+    size_t largerSize = size + 4;
+    bytesRead = copy.readFromMemory(storage.begin(), largerSize);
+    SkDebugf("length = %u; returned by readFromMemory = %u\n", largerSize, bytesRead);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_116.cpp b/docs/examples/Path_116.cpp
new file mode 100644
index 0000000..429a9e6
--- /dev/null
+++ b/docs/examples/Path_116.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a0f166715d6479f91258d854e63e586d
+REG_FIDDLE(Path_116, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    SkDebugf("empty genID = %u\n", path.getGenerationID());
+    path.lineTo(1, 2);
+    SkDebugf("1st lineTo genID = %u\n", path.getGenerationID());
+    path.rewind();
+    SkDebugf("empty genID = %u\n", path.getGenerationID());
+    path.lineTo(1, 2);
+    SkDebugf("2nd lineTo genID = %u\n", path.getGenerationID());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_117.cpp b/docs/examples/Path_117.cpp
new file mode 100644
index 0000000..e432731
--- /dev/null
+++ b/docs/examples/Path_117.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2f53df9201769ab7e7c0e164a1334309
+REG_FIDDLE(Path_117, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(256);
+    SkPath asterisk, path;
+    paint.getTextPath("*", 1, 50, 192, &asterisk);
+    SkPath::Iter iter(asterisk, true);
+    SkPoint start[4], pts[4];
+    iter.next(start);  // skip moveTo
+    iter.next(start);  // first quadTo
+    path.moveTo((start[0] + start[1]) * 0.5f);
+    while (SkPath::kClose_Verb != iter.next(pts)) {
+        path.quadTo(pts[0], (pts[0] + pts[1]) * 0.5f);
+    }
+    path.quadTo(start[0], (start[0] + start[1]) * 0.5f);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Path_118.cpp b/docs/examples/Path_118.cpp
new file mode 100644
index 0000000..82bf4d4
--- /dev/null
+++ b/docs/examples/Path_118.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=01648775cb9b354b2f1836dad82a25ab
+REG_FIDDLE(Path_118, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath::Iter iter;
+    SkPoint points[4];
+    SkDebugf("iter is " "%s" "done\n", SkPath::kDone_Verb == iter.next(points) ? "" : "not ");
+    SkPath path;
+    iter.setPath(path, false);
+    SkDebugf("iter is " "%s" "done\n", SkPath::kDone_Verb == iter.next(points) ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_119.cpp b/docs/examples/Path_119.cpp
new file mode 100644
index 0000000..5e679b3
--- /dev/null
+++ b/docs/examples/Path_119.cpp
@@ -0,0 +1,33 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=13044dbf68885c0f15322c0633b633a3
+REG_FIDDLE(Path_119, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, SkPath::Iter& iter) -> void {
+        SkDebugf("%s:\n", prefix);
+        const char* verbStr[] =  { "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done" };
+        const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };
+        SkPath::Verb verb;
+        do {
+           SkPoint points[4];
+           verb = iter.next(points);
+           SkDebugf("k%s_Verb ", verbStr[(int) verb]);
+           for (int i = 0; i < pointCount[(int) verb]; ++i) {
+                SkDebugf("{%g, %g}, ", points[i].fX, points[i].fY);
+           }
+           if (SkPath::kConic_Verb == verb) {
+               SkDebugf("weight = %g", iter.conicWeight());
+           }
+           SkDebugf("\n");
+        } while (SkPath::kDone_Verb != verb);
+        SkDebugf("\n");
+    };
+    SkPath path;
+    path.quadTo(10, 20, 30, 40);
+    SkPath::Iter openIter(path, false);
+    debugster("open", openIter);
+    SkPath::Iter closedIter(path, true);
+    debugster("closed", closedIter);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_120.cpp b/docs/examples/Path_120.cpp
new file mode 100644
index 0000000..f3d0d98
--- /dev/null
+++ b/docs/examples/Path_120.cpp
@@ -0,0 +1,35 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6c9688008cea8937ad5cc188b38ecf16
+REG_FIDDLE(Path_120, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, SkPath::Iter& iter) -> void {
+        SkDebugf("%s:\n", prefix);
+        const char* verbStr[] =  { "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done" };
+        const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };
+        SkPath::Verb verb;
+        do {
+           SkPoint points[4];
+           verb = iter.next(points);
+           SkDebugf("k%s_Verb ", verbStr[(int) verb]);
+           for (int i = 0; i < pointCount[(int) verb]; ++i) {
+                SkDebugf("{%g, %g}, ", points[i].fX, points[i].fY);
+           }
+           if (SkPath::kConic_Verb == verb) {
+               SkDebugf("weight = %g", iter.conicWeight());
+           }
+           SkDebugf("\n");
+        } while (SkPath::kDone_Verb != verb);
+        SkDebugf("\n");
+    };
+    SkPath path;
+    path.quadTo(10, 20, 30, 40);
+    SkPath::Iter iter(path, false);
+    debugster("quad open", iter);
+    SkPath path2;
+    path2.conicTo(1, 2, 3, 4, .5f);
+    iter.setPath(path2, true);
+    debugster("conic closed", iter);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_121.cpp b/docs/examples/Path_121.cpp
new file mode 100644
index 0000000..e5f8e94
--- /dev/null
+++ b/docs/examples/Path_121.cpp
@@ -0,0 +1,38 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=00ae8984856486bdb626d0ed6587855a
+REG_FIDDLE(Path_121, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkPath& path, bool degen, bool exact) -> void {
+        SkPath::Iter iter(path, false);
+        SkDebugf("%s:\n", prefix);
+        const char* verbStr[] =  { "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done" };
+        const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };
+        SkPath::Verb verb;
+        do {
+           SkPoint points[4];
+           verb = iter.next(points, degen, exact);
+           SkDebugf("k%s_Verb ", verbStr[(int) verb]);
+           for (int i = 0; i < pointCount[(int) verb]; ++i) {
+                SkDebugf("{%1.8g, %1.8g}, ", points[i].fX, points[i].fY);
+           }
+           SkDebugf("\n");
+        } while (SkPath::kDone_Verb != verb);
+        SkDebugf("\n");
+    };
+    SkPath path;
+    path.moveTo(10, 10);
+    path.moveTo(20, 20);
+    path.quadTo(10, 20, 30, 40);
+    path.moveTo(1, 1);
+    path.close();
+    path.moveTo(30, 30);
+    path.lineTo(30, 30);
+    path.moveTo(30, 30);
+    path.lineTo(30.00001f, 30);
+    debugster("skip degenerate", path, true, false);
+    debugster("skip degenerate if exact", path, true, true);
+    debugster("skip none", path, false, false);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_122.cpp b/docs/examples/Path_122.cpp
new file mode 100644
index 0000000..ce1344d
--- /dev/null
+++ b/docs/examples/Path_122.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7cdea37741d50f0594c6244eb07fd175
+REG_FIDDLE(Path_122, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPath path;
+   path.conicTo(1, 2, 3, 4, .5f);
+   SkPath::Iter iter(path, false);
+   SkPoint p[4];
+   SkDebugf("first verb is " "%s" "move\n", SkPath::kMove_Verb == iter.next(p) ? "" : "not ");
+   SkDebugf("next verb is " "%s" "conic\n", SkPath::kConic_Verb == iter.next(p) ? "" : "not ");
+   SkDebugf("conic points: {%g,%g}, {%g,%g}, {%g,%g}\n", p[0].fX, p[0].fY, p[1].fX, p[1].fY,
+                p[2].fX, p[2].fY);
+   SkDebugf("conic weight: %g\n", iter.conicWeight());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_123.cpp b/docs/examples/Path_123.cpp
new file mode 100644
index 0000000..b383b37
--- /dev/null
+++ b/docs/examples/Path_123.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7000b501f49341629bfdd9f80e686103
+REG_FIDDLE(Path_123, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPath path;
+   path.moveTo(6, 7);
+   path.conicTo(1, 2, 3, 4, .5f);
+   path.close();
+   SkPath::Iter iter(path, false);
+   SkPoint p[4];
+   SkDebugf("1st verb is " "%s" "move\n", SkPath::kMove_Verb == iter.next(p) ? "" : "not ");
+   SkDebugf("moveTo point: {%g,%g}\n", p[0].fX, p[0].fY);
+   SkDebugf("2nd verb is " "%s" "conic\n", SkPath::kConic_Verb == iter.next(p) ? "" : "not ");
+   SkDebugf("3rd verb is " "%s" "line\n", SkPath::kLine_Verb == iter.next(p) ? "" : "not ");
+   SkDebugf("line points: {%g,%g}, {%g,%g}\n", p[0].fX, p[0].fY, p[1].fX, p[1].fY);
+   SkDebugf("line " "%s" "generated by close\n", iter.isCloseLine() ? "" : "not ");
+   SkDebugf("4th verb is " "%s" "close\n", SkPath::kClose_Verb == iter.next(p) ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_124.cpp b/docs/examples/Path_124.cpp
new file mode 100644
index 0000000..ebd1c68
--- /dev/null
+++ b/docs/examples/Path_124.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b0d48a6e949db1cb545216ae9c3c3c70
+REG_FIDDLE(Path_124, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   for (bool forceClose : { false, true } ) {
+       SkPath path;
+       path.conicTo(1, 2, 3, 4, .5f);
+       SkPath::Iter iter(path, forceClose);
+       SkDebugf("without close(), forceClose is %s: isClosedContour returns %s\n",
+           forceClose ? "true " : "false", iter.isClosedContour() ? "true" : "false");
+       path.close();
+       iter.setPath(path, forceClose);
+       SkDebugf("with close(),    forceClose is %s: isClosedContour returns %s\n",
+           forceClose ? "true " : "false", iter.isClosedContour() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_125.cpp b/docs/examples/Path_125.cpp
new file mode 100644
index 0000000..1d353df
--- /dev/null
+++ b/docs/examples/Path_125.cpp
@@ -0,0 +1,31 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=944a80c7ff8c04e1fecc4aec4a47ea60
+REG_FIDDLE(Path_125, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.moveTo(50, 60);
+    path.quadTo(10, 20, 30, 40);
+    path.close();
+    path.lineTo(30, 30);
+    path.conicTo(1, 2, 3, 4, .5f);
+    path.cubicTo(-1, -2, -3, -4, -5, -6);
+    SkPath::RawIter iter(path);
+    const char* verbStr[] =  { "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done" };
+    const int pointCount[] = {     1 ,     2 ,     3 ,      3 ,      4 ,      1 ,     0  };
+    SkPath::Verb verb;
+    do {
+        SkPoint points[4];
+        verb = iter.next(points);
+        SkDebugf("k%s_Verb ", verbStr[(int) verb]);
+        for (int i = 0; i < pointCount[(int) verb]; ++i) {
+            SkDebugf("{%1.8g, %1.8g}, ", points[i].fX, points[i].fY);
+        }
+        if (SkPath::kConic_Verb == verb) {
+            SkDebugf("weight = %g", iter.conicWeight());
+        }
+        SkDebugf("\n");
+    } while (SkPath::kDone_Verb != verb);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_126.cpp b/docs/examples/Path_126.cpp
new file mode 100644
index 0000000..fe65bc5
--- /dev/null
+++ b/docs/examples/Path_126.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eb5fa5bea23059ce538e883502f828f5
+REG_FIDDLE(Path_126, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPath path;
+    path.quadTo(10, 20, 30, 40);
+    path.conicTo(1, 2, 3, 4, .5f);
+    path.cubicTo(1, 2, 3, 4, .5, 6);
+    SkPath::RawIter iter(path);
+    SkPath::Verb verb, peek = iter.peek();
+    const char* verbStr[] =  { "Move", "Line", "Quad", "Conic", "Cubic", "Close", "Done" };
+    do {
+        SkPoint points[4];
+        verb = iter.next(points);
+        SkDebugf("peek %s %c= verb %s\n", verbStr[peek], peek == verb ? '=' : '!', verbStr[verb]);
+        peek = iter.peek();
+    } while (SkPath::kDone_Verb != verb);
+    SkDebugf("peek %s %c= verb %s\n", verbStr[peek], peek == verb ? '=' : '!', verbStr[verb]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Path_127.cpp b/docs/examples/Path_127.cpp
new file mode 100644
index 0000000..5816b74
--- /dev/null
+++ b/docs/examples/Path_127.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=69f360a0ba8f40c51ef4cd9f972c5893
+REG_FIDDLE(Path_127, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+   SkPath path;
+   path.conicTo(1, 2, 3, 4, .5f);
+   SkPath::RawIter iter(path);
+   SkPoint p[4];
+   SkDebugf("first verb is " "%s" "move\n", SkPath::kMove_Verb == iter.next(p) ? "" : "not ");
+   SkDebugf("next verb is " "%s" "conic\n", SkPath::kConic_Verb == iter.next(p) ? "" : "not ");
+   SkDebugf("conic points: {%g,%g}, {%g,%g}, {%g,%g}\n", p[0].fX, p[0].fY, p[1].fX, p[1].fY,
+                p[2].fX, p[2].fY);
+   SkDebugf("conic weight: %g\n", iter.conicWeight());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_000.cpp b/docs/examples/Picture_000.cpp
new file mode 100644
index 0000000..ba2e48f
--- /dev/null
+++ b/docs/examples/Picture_000.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=56ed920dadbf2b2967ac45fb5a9bded6
+REG_FIDDLE(Picture_000, 256, 256, false, 0) {
+class JustOneDraw : public SkPicture::AbortCallback {
+public:
+    bool abort() override { return fCalls++ > 0; }
+private:
+    int fCalls = 0;
+};
+
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    JustOneDraw callback;
+    picture->playback(canvas, &callback);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_001.cpp b/docs/examples/Picture_001.cpp
new file mode 100644
index 0000000..c1909e8
--- /dev/null
+++ b/docs/examples/Picture_001.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=404fb42560a289c2004cad1caf3b96de
+REG_FIDDLE(Picture_001, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    SkDynamicMemoryWStream writableStream;
+    picture->serialize(&writableStream);
+    std::unique_ptr<SkStreamAsset> readableStream = writableStream.detachAsStream();
+    sk_sp<SkPicture> copy = SkPicture::MakeFromStream(readableStream.get());
+    copy->playback(canvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_002.cpp b/docs/examples/Picture_002.cpp
new file mode 100644
index 0000000..4cb447c
--- /dev/null
+++ b/docs/examples/Picture_002.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=58b44bf47d8816782066618700afdecb
+REG_FIDDLE(Picture_002, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    SkDynamicMemoryWStream writableStream;
+    picture->serialize(&writableStream);
+    sk_sp<SkData> readableData = writableStream.detachAsData();
+    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData.get());
+    copy->playback(canvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_003.cpp b/docs/examples/Picture_003.cpp
new file mode 100644
index 0000000..50987d9
--- /dev/null
+++ b/docs/examples/Picture_003.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=30b9f1b310187db6aff720a5d67591e2
+REG_FIDDLE(Picture_003, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    SkDynamicMemoryWStream writableStream;
+    picture->serialize(&writableStream);
+    sk_sp<SkData> readableData = writableStream.detachAsData();
+    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
+    copy->playback(canvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_004.cpp b/docs/examples/Picture_004.cpp
new file mode 100644
index 0000000..d7997b5
--- /dev/null
+++ b/docs/examples/Picture_004.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6b0ffb03ba05f526b345dc65a1c73fe4
+REG_FIDDLE(Picture_004, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    picture->playback(canvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_005.cpp b/docs/examples/Picture_005.cpp
new file mode 100644
index 0000000..9af6bcb
--- /dev/null
+++ b/docs/examples/Picture_005.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=15bb9a9596b40c5e2045f76e8c1dcf8e
+REG_FIDDLE(Picture_005, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({64, 64, 192, 192});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    picture->playback(canvas);
+    paint.setBlendMode(SkBlendMode::kModulate);
+    paint.setColor(0x40404040);
+    canvas->drawRect(picture->cullRect(), paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_006.cpp b/docs/examples/Picture_006.cpp
new file mode 100644
index 0000000..be74690
--- /dev/null
+++ b/docs/examples/Picture_006.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8e4257245c988c600410fe4fd7293f07
+REG_FIDDLE(Picture_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    recorder.beginRecording({0, 0, 0, 0});
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    SkDebugf("empty picture id = %d\n", picture->uniqueID());
+    sk_sp<SkPicture> placeholder = SkPicture::MakePlaceholder({0, 0, 0, 0});
+    SkDebugf("placeholder id = %d\n", placeholder->uniqueID());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_007.cpp b/docs/examples/Picture_007.cpp
new file mode 100644
index 0000000..626dd22
--- /dev/null
+++ b/docs/examples/Picture_007.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dacdebe1355c884ebd3c2ea038cc7a20
+REG_FIDDLE(Picture_007, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    sk_sp<SkData> readableData = picture->serialize();
+    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
+    copy->playback(canvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_008.cpp b/docs/examples/Picture_008.cpp
new file mode 100644
index 0000000..822e7f8
--- /dev/null
+++ b/docs/examples/Picture_008.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=30b9f1b310187db6aff720a5d67591e2
+REG_FIDDLE(Picture_008, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    SkDynamicMemoryWStream writableStream;
+    picture->serialize(&writableStream);
+    sk_sp<SkData> readableData = writableStream.detachAsData();
+    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
+    copy->playback(canvas);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_009.cpp b/docs/examples/Picture_009.cpp
new file mode 100644
index 0000000..22f931f
--- /dev/null
+++ b/docs/examples/Picture_009.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0d2cbf82f490ffb180e0b4531afa232c
+REG_FIDDLE(Picture_009, 256, 256, false, 0) {
+class MyCanvas : public SkCanvas {
+public:
+    MyCanvas(SkCanvas* c) : canvas(c) {}
+        void onDrawPicture(const SkPicture* picture, const SkMatrix* ,
+                               const SkPaint* ) override {
+        const SkRect rect = picture->cullRect();
+        SkPaint redPaint;
+        redPaint.setColor(SK_ColorRED);
+        canvas->drawRect(rect, redPaint);
+   }
+   SkCanvas* canvas;
+};
+
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    sk_sp<SkPicture> placeholder = SkPicture::MakePlaceholder({10, 40, 80, 110});
+    pictureCanvas->drawPicture(placeholder);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    MyCanvas myCanvas(canvas);
+    myCanvas.drawPicture(picture);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Picture_010.cpp b/docs/examples/Picture_010.cpp
new file mode 100644
index 0000000..c8c55d9
--- /dev/null
+++ b/docs/examples/Picture_010.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4b3d879118ef770d1f11a23c6493b2c4
+REG_FIDDLE(Picture_010, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    picture->playback(canvas);
+    std::string opCount = "approximate op count: " + std::to_string(picture->approximateOpCount());
+    canvas->drawString(opCount.c_str(), 50, 220, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Picture_011.cpp b/docs/examples/Picture_011.cpp
new file mode 100644
index 0000000..39ac1ed
--- /dev/null
+++ b/docs/examples/Picture_011.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ececbda21218bd732394a305dba393a2
+REG_FIDDLE(Picture_011, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPictureRecorder recorder;
+    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
+    SkPaint paint;
+    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
+    paint.setColor(SK_ColorWHITE);
+    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
+    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+    picture->playback(canvas);
+    std::string opCount = "approximate bytes used: " + std::to_string(picture->approximateBytesUsed());
+    canvas->drawString(opCount.c_str(), 20, 220, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Pixmap_000.cpp b/docs/examples/Pixmap_000.cpp
new file mode 100644
index 0000000..bcdf00f
--- /dev/null
+++ b/docs/examples/Pixmap_000.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9547e74a9d37553a667b913ffd1312dd
+REG_FIDDLE(Pixmap_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkPixmap pixmap;
+    for (int i = 0; i < 2; ++i) {
+       SkDebugf("width: %2d  height: %2d", pixmap.width(), pixmap.height());
+       SkDebugf("  color: k%s_SkColorType", colors[pixmap.colorType()]);
+       SkDebugf("  alpha: k%s_SkAlphaType\n", alphas[pixmap.alphaType()]);
+       pixmap.reset(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType),
+                    nullptr, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_001.cpp b/docs/examples/Pixmap_001.cpp
new file mode 100644
index 0000000..0df9717
--- /dev/null
+++ b/docs/examples/Pixmap_001.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9a00774be57d7308313b3a9073e6e696
+REG_FIDDLE(Pixmap_001, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("image alpha only = %s\n", image->isAlphaOnly() ? "true" : "false");
+    SkPMColor pmColors = 0;
+    sk_sp<SkImage> copy = SkImage::MakeRasterCopy({SkImageInfo::MakeA8(1, 1),
+                                                  (uint8_t*)&pmColors,
+                                                  1});
+    SkDebugf("copy alpha only = %s\n", copy->isAlphaOnly() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_002.cpp b/docs/examples/Pixmap_002.cpp
new file mode 100644
index 0000000..9a13d3e
--- /dev/null
+++ b/docs/examples/Pixmap_002.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d9eb583c39f4f0baea79896b89245c98
+REG_FIDDLE(Pixmap_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkPixmap pixmap(SkImageInfo::Make(25, 35, kRGBA_8888_SkColorType, kOpaque_SkAlphaType),
+                    nullptr, 0);
+    for (int i = 0; i < 2; ++i) {
+       SkDebugf("width: %2d  height: %2d", pixmap.width(), pixmap.height());
+       SkDebugf("  color: k%s_SkColorType", colors[pixmap.colorType()]);
+       SkDebugf("  alpha: k%s_SkAlphaType\n", alphas[pixmap.alphaType()]);
+       pixmap.reset();
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_003.cpp b/docs/examples/Pixmap_003.cpp
new file mode 100644
index 0000000..225b598
--- /dev/null
+++ b/docs/examples/Pixmap_003.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9a392b753167cfa849cebeefd5a6e07d
+REG_FIDDLE(Pixmap_003, 256, 64, false, 4) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> pixels;
+    pixels.resize(image->height() * image->width() * 4);
+    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,
+            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);
+    image->readPixels(pixmap, 0, 0);
+    int x = 0;
+    for (auto colorType : { kRGBA_8888_SkColorType, kBGRA_8888_SkColorType } ) {
+        pixmap.reset(SkImageInfo::Make(image->width(), image->height(), colorType,
+                image->alphaType()), (const void*) &pixels.front(), image->width() * 4);
+        SkBitmap bitmap;
+        bitmap.installPixels(pixmap);
+        canvas->drawBitmap(bitmap, x, 0);
+        x += 128;
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_004.cpp b/docs/examples/Pixmap_004.cpp
new file mode 100644
index 0000000..0b9ee53
--- /dev/null
+++ b/docs/examples/Pixmap_004.cpp
@@ -0,0 +1,16 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=30d70aec4de17c831dba71e03dc9664a
+REG_FIDDLE(Pixmap_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPixmap pixmap;
+    sk_sp<SkColorSpace> colorSpace1 = SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma,
+                                                            SkColorSpace::kRec2020_Gamut);
+    SkDebugf("is %sunique\n", colorSpace1->unique() ? "" : "not ");
+    pixmap.setColorSpace(colorSpace1);
+    SkDebugf("is %sunique\n", colorSpace1->unique() ? "" : "not ");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Pixmap_005.cpp b/docs/examples/Pixmap_005.cpp
new file mode 100644
index 0000000..a1e2525
--- /dev/null
+++ b/docs/examples/Pixmap_005.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=febdbfac6cf4cde69837643be2e1f6dd
+REG_FIDDLE(Pixmap_005, 256, 128, false, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> pixels;
+    pixels.resize(image->height() * image->width() * 4);
+    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,
+            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);
+    image->readPixels(pixmap, 0, 0);
+    SkPixmap inset;
+    if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) {
+        SkBitmap bitmap;
+        bitmap.installPixels(inset);
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_006.cpp b/docs/examples/Pixmap_006.cpp
new file mode 100644
index 0000000..5a33bc0
--- /dev/null
+++ b/docs/examples/Pixmap_006.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6e0f558bf7fabc655041116288559134
+REG_FIDDLE(Pixmap_006, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> pixels;
+    pixels.resize(image->height() * image->width() * 4);
+    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,
+            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);
+    image->readPixels(pixmap, 0, 0);
+    SkPixmap inset;
+    if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) {
+        const SkImageInfo& info = inset.info();
+        const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+        const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888",
+                "RGB_888x", "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+        SkDebugf("width: %d height: %d color: %s alpha: %s\n", info.width(), info.height(),
+                 colors[info.colorType()], alphas[info.alphaType()]);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_007.cpp b/docs/examples/Pixmap_007.cpp
new file mode 100644
index 0000000..b8fb048
--- /dev/null
+++ b/docs/examples/Pixmap_007.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=19ac8bb81854680bd408fec8cb797d5c
+REG_FIDDLE(Pixmap_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPixmap badPixmap = {SkImageInfo::MakeA8(4, 4), nullptr, 2};
+    SkPixmap okPixmap = {SkImageInfo::MakeA8(4, 4), nullptr, 8};
+    for (auto& pixmap : { badPixmap, okPixmap } ) {
+        SkDebugf("rowBytes: %d minRowBytes: %d\n", pixmap.rowBytes(),
+           pixmap.info().minRowBytes());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_008.cpp b/docs/examples/Pixmap_008.cpp
new file mode 100644
index 0000000..a9031c0
--- /dev/null
+++ b/docs/examples/Pixmap_008.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=17bcabaaee2dbb7beba562e9ca50b55e
+REG_FIDDLE(Pixmap_008, 256, 256, true, 3) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> pixels;
+    pixels.resize(image->height() * image->width() * 4);
+    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,
+            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);
+    image->readPixels(pixmap, 0, 0);
+    SkDebugf("pixels address: 0x%llx\n", pixmap.addr());
+    SkPixmap inset;
+    if (pixmap.extractSubset(&inset, {128, 128, 512, 512})) {
+         SkDebugf("inset address:  0x%llx\n", inset.addr());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_009.cpp b/docs/examples/Pixmap_009.cpp
new file mode 100644
index 0000000..987a678
--- /dev/null
+++ b/docs/examples/Pixmap_009.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f68617b7153a20b2ed3d7f9ed5c6e5e4
+REG_FIDDLE(Pixmap_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeA8(16, 32);
+    SkPixmap pixmap(info, nullptr, 64);
+    SkDebugf("pixmap width: %d  info width: %d\n", pixmap.width(), info.width());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_010.cpp b/docs/examples/Pixmap_010.cpp
new file mode 100644
index 0000000..9a648de
--- /dev/null
+++ b/docs/examples/Pixmap_010.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4a996d32122f469d51ddd0186efb48cc
+REG_FIDDLE(Pixmap_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);
+    SkDebugf("pixmap height: %d  info height: %d\n", pixmap.height(), pixmap.info().height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_011.cpp b/docs/examples/Pixmap_011.cpp
new file mode 100644
index 0000000..591f926
--- /dev/null
+++ b/docs/examples/Pixmap_011.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0ab5c7af272685f2ce177cc79e6b9457
+REG_FIDDLE(Pixmap_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* colors[] = {"Unknown", "Alpha_8", "RGB_565", "ARGB_4444", "RGBA_8888", "RGB_888x",
+                            "BGRA_8888", "RGBA_1010102", "RGB_101010x", "Gray_8", "RGBA_F16Norm",
+                            "RGBA_F16"};
+    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);
+    SkDebugf("color type: k" "%s" "_SkColorType\n", colors[pixmap.colorType()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_012.cpp b/docs/examples/Pixmap_012.cpp
new file mode 100644
index 0000000..8b29e28
--- /dev/null
+++ b/docs/examples/Pixmap_012.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=070b1a60232be499eb10c6ea62371804
+REG_FIDDLE(Pixmap_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* alphas[] = {"Unknown", "Opaque", "Premul", "Unpremul"};
+    SkPixmap pixmap(SkImageInfo::MakeA8(16, 32), nullptr, 64);
+    SkDebugf("alpha type: k" "%s" "_SkAlphaType\n", alphas[pixmap.alphaType()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_013.cpp b/docs/examples/Pixmap_013.cpp
new file mode 100644
index 0000000..4671266
--- /dev/null
+++ b/docs/examples/Pixmap_013.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3421bb20a302d563832ba7bb45e0cc58
+REG_FIDDLE(Pixmap_013, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPixmap pixmap(SkImageInfo::MakeN32(16, 32, kPremul_SkAlphaType,
+            SkColorSpace::MakeSRGBLinear()), nullptr, 64);
+    SkColorSpace* colorSpace = pixmap.colorSpace();
+    SkDebugf("gammaCloseToSRGB: %s  gammaIsLinear: %s  isSRGB: %s\n",
+            colorSpace->gammaCloseToSRGB() ? "true" : "false",
+            colorSpace->gammaIsLinear() ? "true" : "false",
+            colorSpace->isSRGB() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_014.cpp b/docs/examples/Pixmap_014.cpp
new file mode 100644
index 0000000..63d4060
--- /dev/null
+++ b/docs/examples/Pixmap_014.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=efd083f121e888a523455ea8a49e50d1
+REG_FIDDLE(Pixmap_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    std::vector<uint32_t> pixels;
+    const int height = 2;
+    const int width = 2;
+    pixels.resize(height * width * 4);
+    SkPixmap pixmap(SkImageInfo::Make(width, height, kN32_SkColorType,
+            kPremul_SkAlphaType), (const void*) &pixels.front(), width * 4);
+    for (int index = 0; index < 2; ++index) {
+        pixmap.erase(0x00000000);
+        SkDebugf("isOpaque: %s\n", pixmap.isOpaque() ? "true" : "false");
+        pixmap.erase(0xFFFFFFFF);
+        SkDebugf("isOpaque: %s\n", pixmap.isOpaque() ? "true" : "false");
+        pixmap.reset(pixmap.info().makeAlphaType(kOpaque_SkAlphaType),
+                     (const void*) &pixels.front(), width * 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_015.cpp b/docs/examples/Pixmap_015.cpp
new file mode 100644
index 0000000..459c353
--- /dev/null
+++ b/docs/examples/Pixmap_015.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=79750fb1d898a4e5c8c828b7bc9acec5
+REG_FIDDLE(Pixmap_015, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (int width : { 0, 2 } ) {
+        for (int height : { 0, 2 } ) {
+             SkPixmap pixmap(SkImageInfo::MakeA8(width, height), nullptr, width);
+             SkDebugf("width: %d height: %d empty: %s\n", width, height,
+                      pixmap.bounds().isEmpty() ? "true" : "false");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_016.cpp b/docs/examples/Pixmap_016.cpp
new file mode 100644
index 0000000..2fa2baa
--- /dev/null
+++ b/docs/examples/Pixmap_016.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6231bb212d0c231b5bc44eac626fbcb5
+REG_FIDDLE(Pixmap_016, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (int rowBytes : { 4, 5, 6, 7, 8} ) {
+        SkPixmap pixmap(SkImageInfo::MakeN32(1, 1, kPremul_SkAlphaType), nullptr, rowBytes);
+        SkDebugf("rowBytes: %d rowBytesAsPixels: %d\n", rowBytes, pixmap.rowBytesAsPixels());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_017.cpp b/docs/examples/Pixmap_017.cpp
new file mode 100644
index 0000000..8ebdd5a
--- /dev/null
+++ b/docs/examples/Pixmap_017.cpp
@@ -0,0 +1,36 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bf31ee140e2c163c3957276e6d4c4f0c
+REG_FIDDLE(Pixmap_017, 256, 256, true, 0) {
+const char* color_type(SkColorType ct) {
+    switch (ct) {
+        case kUnknown_SkColorType:      return "Unknown";
+        case kAlpha_8_SkColorType:      return "Alpha_8";
+        case kRGB_565_SkColorType:      return "RGB_565";
+        case kARGB_4444_SkColorType:    return "ARGB_4444";
+        case kRGBA_8888_SkColorType:    return "RGBA_8888";
+        case kRGB_888x_SkColorType:     return "RGB_888x";
+        case kBGRA_8888_SkColorType:    return "BGRA_8888";
+        case kRGBA_1010102_SkColorType: return "RGBA_1010102";
+        case kRGB_101010x_SkColorType:  return "RGB_101010x";
+        case kGray_8_SkColorType:       return "Gray_8";
+        case kRGBA_F16Norm_SkColorType: return "RGBA_F16Norm";
+        case kRGBA_F16_SkColorType:     return "RGBA_F16";
+        case kRGBA_F32_SkColorType:     return "RGBA_F32";
+        default: SkASSERT(false); return nullptr;
+    }
+}
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeA8(1, 1);
+    for (SkColorType colorType : { kUnknown_SkColorType,   kAlpha_8_SkColorType,
+                                   kRGB_565_SkColorType,   kARGB_4444_SkColorType,
+                                   kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
+                                   kGray_8_SkColorType,    kRGBA_F16_SkColorType } ) {
+        SkPixmap pixmap(info.makeColorType(colorType), nullptr, 4);
+        SkDebugf("color: k" "%s" "_SkColorType" "%*s" "bytesPerPixel: %d shiftPerPixel: %d\n",
+                color_type(colorType), 10 - strlen(color_type(colorType)), " ",
+                pixmap.info().bytesPerPixel(), pixmap.shiftPerPixel());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_018.cpp b/docs/examples/Pixmap_018.cpp
new file mode 100644
index 0000000..6f56de2
--- /dev/null
+++ b/docs/examples/Pixmap_018.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=410d14ddc45d272598c5a4e52bb047de
+REG_FIDDLE(Pixmap_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPixmap pixmap;
+    for (int width : { 1, 1000, 1000000 } ) {
+        for (int height: { 1, 1000, 1000000 } ) {
+            SkImageInfo imageInfo = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
+            pixmap.reset(imageInfo, nullptr, width * 5);
+            SkDebugf("width: %7d height: %7d computeByteSize: %13lld\n", width, height,
+                     pixmap.computeByteSize());
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_019.cpp b/docs/examples/Pixmap_019.cpp
new file mode 100644
index 0000000..32482bd
--- /dev/null
+++ b/docs/examples/Pixmap_019.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6ef37d5be03d0bfaec992dbb5a94c66f
+REG_FIDDLE(Pixmap_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    std::vector<uint32_t> pixels;
+    const int height = 2;
+    const int width = 2;
+    pixels.resize(height * width * 4);
+    SkPixmap pixmap(SkImageInfo::Make(width, height, kN32_SkColorType,
+            kPremul_SkAlphaType), (const void*) &pixels.front(), width * 4);
+    for (int index = 0; index < 2; ++index) {
+        pixmap.erase(0x00000000);
+        SkDebugf("computeIsOpaque: %s\n", pixmap.computeIsOpaque() ? "true" : "false");
+        pixmap.erase(0xFFFFFFFF);
+        SkDebugf("computeIsOpaque: %s\n", pixmap.computeIsOpaque() ? "true" : "false");
+        pixmap.reset(pixmap.info().makeAlphaType(kOpaque_SkAlphaType),
+                     (const void*) &pixels.front(), width * 4);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_020.cpp b/docs/examples/Pixmap_020.cpp
new file mode 100644
index 0000000..1d795f5
--- /dev/null
+++ b/docs/examples/Pixmap_020.cpp
@@ -0,0 +1,29 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=94ad244056dc80ecd87daae004266334
+REG_FIDDLE(Pixmap_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    std::vector<SkPMColor> storage;
+    storage.resize(w * h);
+    SkDebugf("Premultiplied:\n");
+    for (int y = 0; y < h; ++y) {
+        SkDebugf("(0, %d) ", y);
+        for (int x = 0; x < w; ++x) {
+            int a = 0xFF * (x + y) / (w - 1 + h - 1);
+            storage[x + y * w] = SkPackARGB32(a, a * x / (w - 1), a * y / (h - 1), a);
+            SkDebugf("0x%08x%c", storage[x + y * w], x == w - 1 ? '\n' : ' ');
+        }
+    }
+    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), &storage.front(), w * 4);
+    SkDebugf("Unpremultiplied:\n");
+    for (int y = 0; y < h; ++y) {
+        SkDebugf("(0, %d) ", y);
+        for (int x = 0; x < w; ++x) {
+            SkDebugf("0x%08x%c", pixmap.getColor(x, y), x == w - 1 ? '\n' : ' ');
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_021.cpp b/docs/examples/Pixmap_021.cpp
new file mode 100644
index 0000000..aa393c8
--- /dev/null
+++ b/docs/examples/Pixmap_021.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6e6e29e860eafed77308c973400cc84d
+REG_FIDDLE(Pixmap_021, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    std::vector<SkPMColor> storage;
+    storage.resize(w * h);
+    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), &storage.front(), w * 4);
+    SkDebugf("pixmap.addr(1, 2) %c= &storage[1 + 2 * w]\n",
+              pixmap.addr(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_022.cpp b/docs/examples/Pixmap_022.cpp
new file mode 100644
index 0000000..f716f09
--- /dev/null
+++ b/docs/examples/Pixmap_022.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9adda80b2dd1b08ec5ccf66da7c8bd91
+REG_FIDDLE(Pixmap_022, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint8_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kGray_8_SkColorType, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr8() %c= storage\n",
+              pixmap.addr8()  == storage ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_023.cpp b/docs/examples/Pixmap_023.cpp
new file mode 100644
index 0000000..7e85e1c
--- /dev/null
+++ b/docs/examples/Pixmap_023.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9b16012d265c954c6de13f3fc960da52
+REG_FIDDLE(Pixmap_023, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint16_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kARGB_4444_SkColorType, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr16() %c= storage\n",
+              pixmap.addr16()  == storage ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_024.cpp b/docs/examples/Pixmap_024.cpp
new file mode 100644
index 0000000..b90cc16
--- /dev/null
+++ b/docs/examples/Pixmap_024.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6b90c7ae9f254fe4ea9ef638f893a3e6
+REG_FIDDLE(Pixmap_024, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint32_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr32() %c= storage\n",
+              pixmap.addr32()  == storage ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_025.cpp b/docs/examples/Pixmap_025.cpp
new file mode 100644
index 0000000..b50378c
--- /dev/null
+++ b/docs/examples/Pixmap_025.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0d17085a4698a8a2e2235fad9041b4b4
+REG_FIDDLE(Pixmap_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint64_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr64() %c= storage\n",
+              pixmap.addr64()  == storage ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_026.cpp b/docs/examples/Pixmap_026.cpp
new file mode 100644
index 0000000..7b96fff
--- /dev/null
+++ b/docs/examples/Pixmap_026.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=54e8525a592f05623c33b375aebc90c1
+REG_FIDDLE(Pixmap_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint16_t storage[w * h * 4];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),
+                    storage, w * 4 * sizeof(storage[0]));
+    SkDebugf("pixmap.addrF16() %c= storage\n",
+              pixmap.addrF16()  == storage ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_027.cpp b/docs/examples/Pixmap_027.cpp
new file mode 100644
index 0000000..ce3f8eb
--- /dev/null
+++ b/docs/examples/Pixmap_027.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5b986272268ef2c52045c1856f8b6107
+REG_FIDDLE(Pixmap_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint8_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kGray_8_SkColorType, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr8(1, 2) %c= &storage[1 + 2 * w]\n",
+              pixmap.addr8(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_028.cpp b/docs/examples/Pixmap_028.cpp
new file mode 100644
index 0000000..469d46d
--- /dev/null
+++ b/docs/examples/Pixmap_028.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2c0c88a546d4ef093ab63ff72dac00b9
+REG_FIDDLE(Pixmap_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint16_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kARGB_4444_SkColorType, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr16(1, 2) %c= &storage[1 + 2 * w]\n",
+              pixmap.addr16(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_029.cpp b/docs/examples/Pixmap_029.cpp
new file mode 100644
index 0000000..eb59c7f
--- /dev/null
+++ b/docs/examples/Pixmap_029.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=12f8b5ce9fb25604f33df336677f5d62
+REG_FIDDLE(Pixmap_029, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint32_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_8888_SkColorType, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr32(1, 2) %c= &storage[1 + 2 * w]\n",
+              pixmap.addr32(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_030.cpp b/docs/examples/Pixmap_030.cpp
new file mode 100644
index 0000000..1ca459e
--- /dev/null
+++ b/docs/examples/Pixmap_030.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5449f65fd7673273b0b57807fd3117ff
+REG_FIDDLE(Pixmap_030, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    uint64_t storage[w * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),
+                    storage, w * sizeof(storage[0]));
+    SkDebugf("pixmap.addr64(1, 2) %c= &storage[1 + 2 * w]\n",
+              pixmap.addr64(1, 2)  == &storage[1 + 2 * w] ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_031.cpp b/docs/examples/Pixmap_031.cpp
new file mode 100644
index 0000000..0f4ccd5
--- /dev/null
+++ b/docs/examples/Pixmap_031.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f6076cad455bc80af5d06eb121d3b6f2
+REG_FIDDLE(Pixmap_031, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    const int wordsPerPixel = 4;
+    const int rowWords = w * wordsPerPixel;
+    uint16_t storage[rowWords * h];
+    SkPixmap pixmap(SkImageInfo::Make(w, h, kRGBA_F16_SkColorType, kPremul_SkAlphaType),
+                    storage, rowWords * sizeof(storage[0]));
+    SkDebugf("pixmap.addrF16(1, 2) %c= &storage[1 * wordsPerPixel + 2 * rowWords]\n",
+              pixmap.addrF16(1, 2)  == &storage[1 * wordsPerPixel + 2 * rowWords] ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_032.cpp b/docs/examples/Pixmap_032.cpp
new file mode 100644
index 0000000..090b82b
--- /dev/null
+++ b/docs/examples/Pixmap_032.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=74ef460f89ed5904334d0f8883e781c4
+REG_FIDDLE(Pixmap_032, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    SkPMColor storage[w * h * 4];
+    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), storage, w * 4);
+    SkDebugf("pixmap.writable_addr() %c= (void *)storage\n",
+              pixmap.writable_addr()  == (void *)storage ? '=' : '!');
+    pixmap.erase(0x00000000);
+    *(SkPMColor*)pixmap.writable_addr() = 0xFFFFFFFF;
+    SkDebugf("pixmap.getColor(0, 1) %c= 0x00000000\n",
+              pixmap.getColor(0, 1)  == 0x00000000 ? '=' : '!');
+    SkDebugf("pixmap.getColor(0, 0) %c= 0xFFFFFFFF\n",
+              pixmap.getColor(0, 0)  == 0xFFFFFFFF ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_033.cpp b/docs/examples/Pixmap_033.cpp
new file mode 100644
index 0000000..c739957
--- /dev/null
+++ b/docs/examples/Pixmap_033.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=559eaca89c765bc8466ea1ba3331d4db
+REG_FIDDLE(Pixmap_033, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int w = 4;
+    const int h = 4;
+    SkPMColor storage[w * h * 4];
+    SkPixmap pixmap(SkImageInfo::MakeN32(w, h, kPremul_SkAlphaType), storage, w * 4);
+    SkDebugf("pixmap.writable_addr() %c= (void *)storage\n",
+              pixmap.writable_addr()  == (void *)storage ? '=' : '!');
+    pixmap.erase(0x00000000);
+    *(SkPMColor*)pixmap.writable_addr(1, 2) = 0xFFFFFFFF;
+    SkDebugf("pixmap.getColor(0, 0) %c= 0x00000000\n",
+              pixmap.getColor(0, 0)  == 0x00000000 ? '=' : '!');
+    SkDebugf("pixmap.getColor(1, 2) %c= 0xFFFFFFFF\n",
+              pixmap.getColor(1, 2)  == 0xFFFFFFFF ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_034.cpp b/docs/examples/Pixmap_034.cpp
new file mode 100644
index 0000000..d3f0637
--- /dev/null
+++ b/docs/examples/Pixmap_034.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=809284db136748208b3efc31cd89de29
+REG_FIDDLE(Pixmap_034, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint8_t storage[][5] = {{ 0,   0,  64,   0,  0},
+                            { 0, 128, 255, 128,  0},
+                            {64, 255, 255, 255, 64},
+                            { 0, 128, 255, 128,  0},
+                            { 0,   0,  64,   0,  0}};
+    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kGray_8_SkColorType, kPremul_SkAlphaType);
+    SkPixmap pixmap(imageInfo, storage[0], 5);
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->scale(10, 10);
+    canvas->drawBitmap(bitmap, 0, 0);
+    *pixmap.writable_addr8(2, 2) = 0;
+//  bitmap.installPixels(pixmap);      // uncomment to fix on GPU
+    canvas->drawBitmap(bitmap, 10, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_035.cpp b/docs/examples/Pixmap_035.cpp
new file mode 100644
index 0000000..c026a29
--- /dev/null
+++ b/docs/examples/Pixmap_035.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6da54774f6432b46b47ea9013c15f280
+REG_FIDDLE(Pixmap_035, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint16_t storage[][5] = {{ 0xCABF, 0xDABE, 0xCA9D, 0xC96C, 0xA39B },
+                             { 0xACEE, 0xA87C, 0x893A, 0x4779, 0x8708 },
+                             { 0x4B7C, 0x255B, 0x2559, 0x2557, 0x4656 },
+                             { 0x9099, 0x8128, 0x2557, 0x4124, 0x3323 },
+                             { 0x7547, 0x5505, 0x4434, 0x2012, 0x0000 }};
+    SkImageInfo imageInfo = SkImageInfo::Make(5, 5, kARGB_4444_SkColorType, kPremul_SkAlphaType);
+    SkPixmap pixmap(imageInfo, storage[0], sizeof(storage) / 5);
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->scale(10, 10);
+    canvas->drawBitmap(bitmap, 0, 0);
+    *pixmap.writable_addr16(2, 2) = 0x000F;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 10, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_036.cpp b/docs/examples/Pixmap_036.cpp
new file mode 100644
index 0000000..cea073a
--- /dev/null
+++ b/docs/examples/Pixmap_036.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=086866243bf9e4c14c3b215a2aa69ad9
+REG_FIDDLE(Pixmap_036, 256, 72, false, 4) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> pixels;
+    pixels.resize(image->height() * image->width() * 4);
+    SkPixmap pixmap(SkImageInfo::Make(image->width(), image->height(), kN32_SkColorType,
+            image->alphaType()), (const void*) &pixels.front(), image->width() * 4);
+    image->readPixels(pixmap, 0, 0);
+    for (int y = 0; y < pixmap.height() / 2; ++y) {
+        for (int x = 0; x < pixmap.width(); ++x) {
+            if ((x & 4) == (y & 4)) {
+                *pixmap.writable_addr32(x, y) =
+                        *pixmap.writable_addr32(pixmap.width() - x - 1, pixmap.height() - y - 1);
+            }
+        }
+    }
+    SkBitmap bitmap;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_037.cpp b/docs/examples/Pixmap_037.cpp
new file mode 100644
index 0000000..3d60746
--- /dev/null
+++ b/docs/examples/Pixmap_037.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=de14d8d30e4a7b6462103d0e0dd96b0b
+REG_FIDDLE(Pixmap_037, 256, 40, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::Make(3, 3, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
+    uint64_t storage[9];
+    SkPixmap pixmap(info, storage, 3 * sizeof(uint64_t));
+    SkColor4f c4 { 1, 0.45f, 0.25f, 0.65f };
+    pixmap.erase(c4);
+    SkBitmap bitmap;
+    canvas->scale(10, 10);
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+    *pixmap.writable_addr64(1, 1) |= 0x00ff000000000000LL;
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 10, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_038.cpp b/docs/examples/Pixmap_038.cpp
new file mode 100644
index 0000000..5e1da9e
--- /dev/null
+++ b/docs/examples/Pixmap_038.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7822d78f5cacf5c04267cbbc6c6d0b80
+REG_FIDDLE(Pixmap_038, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::Make(1, 2, kRGBA_F16_SkColorType, kPremul_SkAlphaType);
+    uint16_t storage[2][4];
+    SkPixmap pixmap(info, storage[0], sizeof(uint64_t));
+    SkIRect topPixelBounds = {0, 0, 1, 1};
+    pixmap.erase({ 0.65f, 0.45f, 0.25f, 1 }, &topPixelBounds);
+    SkIRect bottomPixelBounds = {0, 1, 1, 2};
+    pixmap.erase({ 0.25f, 0.65f, 0.45f, 1 }, &bottomPixelBounds);
+    SkBitmap bitmap;
+    canvas->scale(20, 20);
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+    uint16_t* pixel2 = pixmap.writable_addrF16(0, 1);
+    for (int i = 0; i < 4; ++i) {
+        pixel2[i] = storage[0][i];
+    }
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 4, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_039.cpp b/docs/examples/Pixmap_039.cpp
new file mode 100644
index 0000000..84a51d2
--- /dev/null
+++ b/docs/examples/Pixmap_039.cpp
@@ -0,0 +1,31 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=df4e355c4845350daede833b4fd21ec1
+REG_FIDDLE(Pixmap_039, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    std::vector<int32_t> pixels;
+    const int width = 256;
+    const int height = 64;
+    pixels.resize(height * width * 4);
+    SkImageInfo srcInfo = SkImageInfo::MakeN32Premul(width, height);
+    SkPixmap srcPixmap(srcInfo, (const void*) &pixels.front(), width * 4);
+    SkColor  gradColors[] = { 0xFFAA3300, 0x7F881122 };
+    SkPoint  gradPoints[] = { { 0, 0 }, { 256, 0 } };
+    SkPaint paint;
+    paint.setShader(SkGradientShader::MakeLinear(gradPoints, gradColors, nullptr,
+                    SK_ARRAY_COUNT(gradColors), SkShader::kClamp_TileMode));
+    SkBitmap bitmap;
+    bitmap.installPixels(srcPixmap);
+    SkCanvas srcCanvas(bitmap);
+    srcCanvas.drawRect(SkRect::MakeWH(width, height), paint);
+    canvas->drawBitmap(bitmap, 0, 0);
+    std::vector<int32_t> dstPixels;
+    dstPixels.resize(height * width * 2);
+    SkImageInfo dstInfo = srcInfo.makeColorType(kARGB_4444_SkColorType);
+    srcPixmap.readPixels(dstInfo, &dstPixels.front(), width * 2);
+    SkPixmap dstPixmap(dstInfo, &dstPixels.front(), width * 2);
+    bitmap.installPixels(dstPixmap);
+    canvas->drawBitmap(bitmap, 0, 128);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_040.cpp b/docs/examples/Pixmap_040.cpp
new file mode 100644
index 0000000..2bd656c
--- /dev/null
+++ b/docs/examples/Pixmap_040.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=094ca0bd37588cc7be241bb387a3e17b
+REG_FIDDLE(Pixmap_040, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());
+    std::vector<int32_t> srcPixels;
+    const int rowBytes = image->width() * 4;
+    srcPixels.resize(image->height() * rowBytes);
+    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);
+    image->readPixels(pixmap, 0, 0);
+    for (int offset : { 32, 64, 96 } ) {
+        std::vector<int32_t> dstPixels;
+        dstPixels.resize(image->height() * rowBytes);
+        pixmap.readPixels(info, &dstPixels.front(), rowBytes, offset, 0);
+        SkBitmap bitmap;
+        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);
+        bitmap.installPixels(dstmap);
+        canvas->translate(32, 32);
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_041.cpp b/docs/examples/Pixmap_041.cpp
new file mode 100644
index 0000000..21d9a34
--- /dev/null
+++ b/docs/examples/Pixmap_041.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6ec7f7b2cc163cd29f627eef6d4b061c
+REG_FIDDLE(Pixmap_041, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());
+    std::vector<int32_t> srcPixels;
+    const int rowBytes = image->width() * 4;
+    srcPixels.resize(image->height() * rowBytes);
+    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);
+    image->readPixels(pixmap, 0, 0);
+    for (int offset : { 32, 64, 96 } ) {
+        std::vector<int32_t> dstPixels;
+        dstPixels.resize(image->height() * rowBytes);
+        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);
+        pixmap.readPixels(dstmap, offset, 0);
+        SkBitmap bitmap;
+        bitmap.installPixels(dstmap);
+        canvas->translate(32, 32);
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_042.cpp b/docs/examples/Pixmap_042.cpp
new file mode 100644
index 0000000..8fda3d0
--- /dev/null
+++ b/docs/examples/Pixmap_042.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e18549b5ee1039cb61b0bb38c2104fc9
+REG_FIDDLE(Pixmap_042, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());
+    std::vector<int32_t> srcPixels;
+    const int rowBytes = image->width() * 4;
+    srcPixels.resize(image->height() * rowBytes);
+    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);
+    image->readPixels(pixmap, 0, 0);
+    for (int index = 0; index < 3; ++index ) {
+        std::vector<int32_t> dstPixels;
+        dstPixels.resize(image->height() * rowBytes);
+        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);
+        pixmap.readPixels(dstmap);
+        SkBitmap bitmap;
+        bitmap.installPixels(dstmap);
+        canvas->translate(32, 32);
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_043.cpp b/docs/examples/Pixmap_043.cpp
new file mode 100644
index 0000000..c6f18eb
--- /dev/null
+++ b/docs/examples/Pixmap_043.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8e3c8a9c1d0d2e9b8bf66e24d274f792
+REG_FIDDLE(Pixmap_043, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(image->width(), image->height());
+    std::vector<int32_t> srcPixels;
+    int rowBytes = image->width() * 4;
+    srcPixels.resize(image->height() * rowBytes);
+    SkPixmap pixmap(info, (const void*) &srcPixels.front(), rowBytes);
+    image->readPixels(pixmap, 0, 0);
+    for (int offset : { 32, 64, 96 } ) {
+        info = SkImageInfo::MakeN32Premul(image->width() + offset, image->height());
+        rowBytes = info.width() * 4;
+        std::vector<int32_t> dstPixels;
+        dstPixels.resize(image->height() * rowBytes);
+        SkPixmap dstmap(info, &dstPixels.front(), rowBytes);
+        pixmap.scalePixels(dstmap, kMedium_SkFilterQuality);
+        SkBitmap bitmap;
+        bitmap.installPixels(dstmap);
+        canvas->translate(32, 32);
+        canvas->drawBitmap(bitmap, 0, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_044.cpp b/docs/examples/Pixmap_044.cpp
new file mode 100644
index 0000000..64b9c79
--- /dev/null
+++ b/docs/examples/Pixmap_044.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a0cdbafed4786788cc90681e7b294234
+REG_FIDDLE(Pixmap_044, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t storage[2];
+    SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2);
+    SkPixmap pixmap(info, storage, info.minRowBytes());
+    pixmap.erase(SK_ColorBLUE, {0, 0, 1, 1});
+    pixmap.erase(SK_ColorRED, {0, 1, 1, 2});
+    SkBitmap bitmap;
+    canvas->scale(20, 20);
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_045.cpp b/docs/examples/Pixmap_045.cpp
new file mode 100644
index 0000000..8d2c5b4
--- /dev/null
+++ b/docs/examples/Pixmap_045.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=838202e0d49cad2eb3eeb495834f6d63
+REG_FIDDLE(Pixmap_045, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t storage[2];
+    SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2);
+    SkPixmap pixmap(info, storage, info.minRowBytes());
+    pixmap.erase(SK_ColorBLUE);
+    SkBitmap bitmap;
+    canvas->scale(20, 20);
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Pixmap_046.cpp b/docs/examples/Pixmap_046.cpp
new file mode 100644
index 0000000..faa333b
--- /dev/null
+++ b/docs/examples/Pixmap_046.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f884f3f46a565f052a5e252ae2f36e9b
+REG_FIDDLE(Pixmap_046, 256, 50, false, 0) {
+void draw(SkCanvas* canvas) {
+    uint32_t storage[2];
+    SkImageInfo info = SkImageInfo::MakeN32Premul(1, 2);
+    SkPixmap pixmap(info, storage, info.minRowBytes());
+    SkIRect topPixelBounds = {0, 0, 1, 1};
+    pixmap.erase({ 0.65f, 0.45f, 0.25f, 1 }, &topPixelBounds);
+    SkIRect bottomPixelBounds = {0, 1, 1, 2};
+    pixmap.erase({ 0.25f, 0.65f, 0.45f, 1 }, &bottomPixelBounds);
+    SkBitmap bitmap;
+    canvas->scale(20, 20);
+    bitmap.installPixels(pixmap);
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_000.cpp b/docs/examples/Point_000.cpp
new file mode 100644
index 0000000..209721d
--- /dev/null
+++ b/docs/examples/Point_000.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d266e70977847001f7c42f8a2513bee7
+REG_FIDDLE(Point_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint pt1 = {45, 66};
+    SkPoint pt2 = SkPoint::Make(45, 66);
+    SkVector v1 = {45, 66};
+    SkVector v2 = SkPoint::Make(45, 66);
+    SkDebugf("all %s" "equal\n", pt1 == pt2 && pt2 == v1 && v1 == v2 ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_001.cpp b/docs/examples/Point_001.cpp
new file mode 100644
index 0000000..32dbbd1
--- /dev/null
+++ b/docs/examples/Point_001.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9f3fe446b800ae1d940785d438634941
+REG_FIDDLE(Point_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint pt1 = {45, 66};
+    SkDebugf("pt1.fX %c= pt1.x()\n", pt1.fX == pt1.x() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_002.cpp b/docs/examples/Point_002.cpp
new file mode 100644
index 0000000..8141026
--- /dev/null
+++ b/docs/examples/Point_002.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4c962850c2dbea4d2325df469400680e
+REG_FIDDLE(Point_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint pt1 = {45, 66};
+    SkDebugf("pt1.fY %c= pt1.y()\n", pt1.fY == pt1.y() ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_003.cpp b/docs/examples/Point_003.cpp
new file mode 100644
index 0000000..ec08424
--- /dev/null
+++ b/docs/examples/Point_003.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=81b9665110b88ef6bcbc20464aed7da1
+REG_FIDDLE(Point_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint pt = { 0.f, -0.f};
+    SkDebugf("pt.fX=%c%g pt.fY=%c%g\n", std::signbit(pt.fX) ? '-' : '+', fabsf(pt.fX),
+                                        std::signbit(pt.fY) ? '-' : '+', fabsf(pt.fY));
+    SkDebugf("pt.isZero() == %s\n", pt.isZero() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_004.cpp b/docs/examples/Point_004.cpp
new file mode 100644
index 0000000..36e7c67
--- /dev/null
+++ b/docs/examples/Point_004.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d08d1e7dafcad4342d1619fdbb2f5781
+REG_FIDDLE(Point_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint pt1, pt2 = { SK_ScalarPI, SK_ScalarSqrt2 };
+    pt1.set(SK_ScalarPI, SK_ScalarSqrt2);
+    SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_005.cpp b/docs/examples/Point_005.cpp
new file mode 100644
index 0000000..b95ad76
--- /dev/null
+++ b/docs/examples/Point_005.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0d9e8ed734981b5b113f22c7bfde5357
+REG_FIDDLE(Point_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint pt1, pt2 = { SK_MinS16, SK_MaxS16 };
+    pt1.iset(SK_MinS16, SK_MaxS16);
+    SkDebugf("pt1 %c= pt2\n", pt1 == pt2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_006.cpp b/docs/examples/Point_006.cpp
new file mode 100644
index 0000000..1108039
--- /dev/null
+++ b/docs/examples/Point_006.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=12b7164a769e232bb772f19c59600ee7
+REG_FIDDLE(Point_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIPoint iPt = { SK_MinS32, SK_MaxS32 };
+    SkPoint fPt;
+    fPt.iset(iPt);
+    SkDebugf("iPt: %d, %d\n", iPt.fX, iPt.fY);
+    SkDebugf("fPt: %g, %g\n", fPt.fX, fPt.fY);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_007.cpp b/docs/examples/Point_007.cpp
new file mode 100644
index 0000000..e03bf07
--- /dev/null
+++ b/docs/examples/Point_007.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7f70860e820b67a347cff03c00488426
+REG_FIDDLE(Point_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint test[] = { {0.f, -0.f}, {-1, -2},
+                       { SK_ScalarInfinity, SK_ScalarNegativeInfinity },
+                       { SK_ScalarNaN, -SK_ScalarNaN } };
+    for (const SkPoint& pt : test) {
+        SkPoint absPt;
+        absPt.setAbs(pt);
+        SkDebugf("pt: %g, %g  abs: %g, %g\n", pt.fX, pt.fY, absPt.fX, absPt.fY);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_008.cpp b/docs/examples/Point_008.cpp
new file mode 100644
index 0000000..3f0d052
--- /dev/null
+++ b/docs/examples/Point_008.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f0f24726df78a5d797bcf311e694a0a3
+REG_FIDDLE(Point_008, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(30, 15);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    SkPoint::Offset(points, SK_ARRAY_COUNT(points), { 1, 9 } );
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_009.cpp b/docs/examples/Point_009.cpp
new file mode 100644
index 0000000..564cabf
--- /dev/null
+++ b/docs/examples/Point_009.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=532849faa838de885b86d3ebffae3712
+REG_FIDDLE(Point_009, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(30, 15);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    SkPoint::Offset(points, SK_ARRAY_COUNT(points), 1, 9);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_010.cpp b/docs/examples/Point_010.cpp
new file mode 100644
index 0000000..496dbf0
--- /dev/null
+++ b/docs/examples/Point_010.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=02750ceaa874f956e6e6544ef6b858ee
+REG_FIDDLE(Point_010, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(30, 15);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    points[1].offset(1, 1);
+    paint.setColor(SK_ColorRED);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_011.cpp b/docs/examples/Point_011.cpp
new file mode 100644
index 0000000..514e807
--- /dev/null
+++ b/docs/examples/Point_011.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8363ab179447ee4b827679e20d3d81eb
+REG_FIDDLE(Point_011, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };
+    const SkPoint origin = {30, 140};
+    for (auto point : points) {
+        canvas->drawLine(origin, point, paint);
+        SkAutoCanvasRestore acr(canvas, true);
+        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
+        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
+        SkString length("length = ");
+        length.appendScalar(point.length());
+        canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_012.cpp b/docs/examples/Point_012.cpp
new file mode 100644
index 0000000..11a6f7f
--- /dev/null
+++ b/docs/examples/Point_012.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=812cf26d91b1cdcd2c6b9438a8172518
+REG_FIDDLE(Point_012, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
+    const SkPoint origin = {0, 0};
+    canvas->translate(30, 140);
+    for (auto point : points) {
+        canvas->drawLine(origin, point, paint);
+        SkAutoCanvasRestore acr(canvas, true);
+        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
+        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
+        SkString distance("distance = ");
+        distance.appendScalar(point.distanceToOrigin());
+        canvas->drawString(distance, origin.fX + 25, origin.fY - 4, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_013.cpp b/docs/examples/Point_013.cpp
new file mode 100644
index 0000000..f060803
--- /dev/null
+++ b/docs/examples/Point_013.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d84fce292d86c7d9ef37ae2d179c03c7
+REG_FIDDLE(Point_013, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint lines[][2] = { {{  30, 110 }, { 190,  30 }},
+                                 {{ 120, 140 }, {  30, 220 }}};
+    for (auto line : lines) {
+        canvas->drawLine(line[0], line[1], paint);
+        SkVector vector = line[1] - line[0];
+        if (vector.normalize()) {
+            SkVector rotate90 = { -vector.fY, vector.fX };
+            rotate90 *= 10.f;
+            canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);
+            canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_014.cpp b/docs/examples/Point_014.cpp
new file mode 100644
index 0000000..d75f31a
--- /dev/null
+++ b/docs/examples/Point_014.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3e4f147d143a388802484bf0d26534c2
+REG_FIDDLE(Point_014, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
+    const SkPoint origin = {0, 0};
+    canvas->translate(30, 140);
+    for (auto point : points) {
+        paint.setStrokeWidth(1);
+        paint.setColor(SK_ColorBLACK);
+        canvas->drawLine(origin, point, paint);
+        SkVector normal;
+        normal.setNormalize(point.fX, point.fY);
+        normal *= 100;
+        paint.setStrokeWidth(10);
+        paint.setColor(0x3f4512bf);
+        canvas->drawLine(origin, normal, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_015.cpp b/docs/examples/Point_015.cpp
new file mode 100644
index 0000000..35c4889
--- /dev/null
+++ b/docs/examples/Point_015.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cbe7db206ece825aa3b9b7c3256aeaf0
+REG_FIDDLE(Point_015, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
+    const SkPoint origin = {0, 0};
+    canvas->translate(30, 140);
+    for (auto point : points) {
+        paint.setStrokeWidth(1);
+        paint.setColor(SK_ColorBLACK);
+        canvas->drawLine(origin, point, paint);
+        SkVector normal = point;
+        normal.setLength(100);
+        paint.setStrokeWidth(10);
+        paint.setColor(0x3f45bf12);
+        canvas->drawLine(origin, normal, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_016.cpp b/docs/examples/Point_016.cpp
new file mode 100644
index 0000000..7bb0241
--- /dev/null
+++ b/docs/examples/Point_016.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3cc0662b6fbbee1fe3442a0acfece22c
+REG_FIDDLE(Point_016, 256, 160, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint points[] = { { 60, -110 }, { 90, 10 }, { 120, -110 }, { 180, -50 } };
+    const SkPoint origin = {0, 0};
+    canvas->translate(30, 140);
+    for (auto point : points) {
+        paint.setStrokeWidth(1);
+        paint.setColor(SK_ColorBLACK);
+        canvas->drawLine(origin, point, paint);
+        SkVector normal;
+        normal.setLength(point.fX, point.fY, 100);
+        paint.setStrokeWidth(10);
+        paint.setColor(0x3fbf4512);
+        canvas->drawLine(origin, normal, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_017.cpp b/docs/examples/Point_017.cpp
new file mode 100644
index 0000000..c78beb9
--- /dev/null
+++ b/docs/examples/Point_017.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=972e4e230806281adb928e068bcd8551
+REG_FIDDLE(Point_017, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint point = {40, -15}, scaled;
+    SkPoint origin = {30, 110};
+    for (auto scale : {1, 2, 3, 5}) {
+        paint.setStrokeWidth(scale * 5);
+        paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);
+        point.scale(scale, &scaled);
+        canvas->drawLine(origin, origin + scaled, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_018.cpp b/docs/examples/Point_018.cpp
new file mode 100644
index 0000000..f7fc6fd
--- /dev/null
+++ b/docs/examples/Point_018.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1060a4f27d8ef29519e6ac006ce90f2b
+REG_FIDDLE(Point_018, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint point = {40, -15};
+    SkPoint origin = {30, 110};
+    for (auto scale : {1, 2, 3, 5}) {
+        paint.setStrokeWidth(scale * 5);
+        paint.setARGB(0x7f, 0x9f, 0xbf, 0x33 * scale);
+        point.scale(scale);
+        canvas->drawLine(origin, origin + point, paint);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_019.cpp b/docs/examples/Point_019.cpp
new file mode 100644
index 0000000..387399d
--- /dev/null
+++ b/docs/examples/Point_019.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=312c0c8065ab5d0adfda80cccf2d11e6
+REG_FIDDLE(Point_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint test[] = { {0.f, -0.f}, {-1, -2},
+                       { SK_ScalarInfinity, SK_ScalarNegativeInfinity },
+                       { SK_ScalarNaN, -SK_ScalarNaN } };
+    for (const SkPoint& pt : test) {
+        SkPoint negPt = pt;
+        negPt.negate();
+        SkDebugf("pt: %g, %g  negate: %g, %g\n", pt.fX, pt.fY, negPt.fX, negPt.fY);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_020.cpp b/docs/examples/Point_020.cpp
new file mode 100644
index 0000000..10be1dc
--- /dev/null
+++ b/docs/examples/Point_020.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9baf247cfcd8272c0ddf6ce93f676b37
+REG_FIDDLE(Point_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint test[] = { {0.f, -0.f}, {-1, -2},
+                       { SK_ScalarInfinity, SK_ScalarNegativeInfinity },
+                       { SK_ScalarNaN, -SK_ScalarNaN } };
+    for (const SkPoint& pt : test) {
+        SkPoint negPt = -pt;
+        SkDebugf("pt: %g, %g  negate: %g, %g\n", pt.fX, pt.fY, negPt.fX, negPt.fY);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_021.cpp b/docs/examples/Point_021.cpp
new file mode 100644
index 0000000..f9bfb35
--- /dev/null
+++ b/docs/examples/Point_021.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b4e79109e2381345258cb744881b20c
+REG_FIDDLE(Point_021, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(30, 15);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    points[1] += {1, 1};
+    points[2] += {-1, -1};
+    paint.setColor(SK_ColorRED);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_022.cpp b/docs/examples/Point_022.cpp
new file mode 100644
index 0000000..bb59540
--- /dev/null
+++ b/docs/examples/Point_022.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=86c0399704d8dff4091bf87b8d87d40b
+REG_FIDDLE(Point_022, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(30, 15);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    points[1] -= {1, 1};
+    points[2] -= {-1, -1};
+    paint.setColor(SK_ColorRED);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_023.cpp b/docs/examples/Point_023.cpp
new file mode 100644
index 0000000..c74e5ec
--- /dev/null
+++ b/docs/examples/Point_023.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=35b3bc675779de043706ae4817ee950c
+REG_FIDDLE(Point_023, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(15, 10);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    for (auto& point : points) {
+        point = point * 1.5f;
+    }
+    paint.setColor(SK_ColorRED);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_024.cpp b/docs/examples/Point_024.cpp
new file mode 100644
index 0000000..55d28ec
--- /dev/null
+++ b/docs/examples/Point_024.cpp
@@ -0,0 +1,22 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3ce3db36235d80dbac4d39504cf756da
+REG_FIDDLE(Point_024, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(15, 10);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    for (auto& point : points) {
+        point *= 2;
+    }
+    paint.setColor(SK_ColorRED);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_025.cpp b/docs/examples/Point_025.cpp
new file mode 100644
index 0000000..cdee460
--- /dev/null
+++ b/docs/examples/Point_025.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=937cc166cc0e220f33fb82501141d0b3
+REG_FIDDLE(Point_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
+    for (const SkPoint& pt : test) {
+        SkDebugf("pt: %g, %g  finite: %s\n", pt.fX, pt.fY, pt.isFinite() ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_026.cpp b/docs/examples/Point_026.cpp
new file mode 100644
index 0000000..269b7cb
--- /dev/null
+++ b/docs/examples/Point_026.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4cecb878c8b66beffda051f26c00f817
+REG_FIDDLE(Point_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
+    for (const SkPoint& pt : test) {
+        SkDebugf("pt: %g, %g  %c= pt\n", pt.fX, pt.fY, pt.equals(pt.fX, pt.fY) ? '=' : '!');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_027.cpp b/docs/examples/Point_027.cpp
new file mode 100644
index 0000000..0859829
--- /dev/null
+++ b/docs/examples/Point_027.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=741f793334a48a35dadf4310d7ea52cb
+REG_FIDDLE(Point_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
+    for (const SkPoint& pt : test) {
+        SkDebugf("pt: %g, %g  %c= pt\n", pt.fX, pt.fY, pt == pt ? '=' : '!');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_028.cpp b/docs/examples/Point_028.cpp
new file mode 100644
index 0000000..fec8e11
--- /dev/null
+++ b/docs/examples/Point_028.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8fe8572685eaa617f25a5a6767a874dc
+REG_FIDDLE(Point_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint test[] = { {0, -0.f}, {-1, -2}, {SK_ScalarInfinity, 1}, {SK_ScalarNaN, -1} };
+    for (const SkPoint& pt : test) {
+        SkDebugf("pt: %g, %g  %c= pt\n", pt.fX, pt.fY, pt != pt ? '!' : '=');
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_029.cpp b/docs/examples/Point_029.cpp
new file mode 100644
index 0000000..2ee9047
--- /dev/null
+++ b/docs/examples/Point_029.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b6c4943ecd0b2dccf9d220b8944009e0
+REG_FIDDLE(Point_029, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(30, 15);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    points[1] += points[0] - points[2];
+    points[2] -= points[3] - points[5];
+    paint.setColor(SK_ColorRED);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_030.cpp b/docs/examples/Point_030.cpp
new file mode 100644
index 0000000..7e47134
--- /dev/null
+++ b/docs/examples/Point_030.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=911a84253dfec4dabf94dbe3c71766f0
+REG_FIDDLE(Point_030, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkPoint points[] = { { 3, 1 }, { 4, 2 }, { 5, 1 }, { 7, 3 },
+                         { 6, 4 }, { 7, 5 }, { 5, 7 },
+                         { 4, 6 }, { 3, 7 }, { 1, 5 },
+                         { 2, 4 }, { 1, 3 }, { 3, 1 } };
+    canvas->scale(30, 15);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+    SkVector mod = {1, 1};
+    for (auto& point : points) {
+        point = point + mod;
+        mod.fX *= 1.1f;
+        mod.fY += .2f;
+    }
+    paint.setColor(SK_ColorRED);
+    canvas->drawPoints(SkCanvas::kPolygon_PointMode, SK_ARRAY_COUNT(points), points, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Point_031.cpp b/docs/examples/Point_031.cpp
new file mode 100644
index 0000000..6507ed8
--- /dev/null
+++ b/docs/examples/Point_031.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c98773d8b4509969d78cb8121e4b77f6
+REG_FIDDLE(Point_031, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint points[] = { { 90, 30 }, { 120, 150 }, { 150, 30 }, { 210, 90 } };
+    const SkPoint origin = {30, 140};
+    for (auto point : points) {
+        canvas->drawLine(origin, point, paint);
+        SkAutoCanvasRestore acr(canvas, true);
+        SkScalar angle = SkScalarATan2((point.fY - origin.fY), point.fX - origin.fX);
+        canvas->rotate(angle * 180 / SK_ScalarPI, origin.fX, origin.fY);
+        SkString length("length = ");
+        length.appendScalar(SkPoint::Length(point.fX, point.fY));
+        canvas->drawString(length, origin.fX + 25, origin.fY - 4, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_032.cpp b/docs/examples/Point_032.cpp
new file mode 100644
index 0000000..0c33b78
--- /dev/null
+++ b/docs/examples/Point_032.cpp
@@ -0,0 +1,26 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=60a08f3ce75374fc815384616d114df7
+REG_FIDDLE(Point_032, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint lines[][2] = { {{  30, 110 }, { 190,  30 }},
+                                 {{  30, 220 }, { 120, 140 }}};
+    for (auto line : lines) {
+        canvas->drawLine(line[0], line[1], paint);
+        SkVector vector = line[1] - line[0];
+        SkScalar priorLength = SkPoint::Normalize(&vector);
+        SkVector rotate90 = { -vector.fY, vector.fX };
+        rotate90 *= 10.f;
+        canvas->drawLine(line[0] - rotate90, line[0] + rotate90, paint);
+        canvas->drawLine(line[1] - rotate90, line[1] + rotate90, paint);
+        SkString length("length = ");
+        length.appendScalar(priorLength);
+        canvas->drawString(length, line[0].fX + 25, line[0].fY - 4, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_033.cpp b/docs/examples/Point_033.cpp
new file mode 100644
index 0000000..e3fc00b
--- /dev/null
+++ b/docs/examples/Point_033.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9e0a2de2eb94dba4521d733e73f2bda5
+REG_FIDDLE(Point_033, 256, 192, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    const SkPoint lines[][2] = {{{-10, -10}, {90, 30}}, {{0, 0}, {150, 30}}, {{10, 25}, {120, 150}}};
+    const SkPoint origin = {30, 160};
+    for (auto line : lines) {
+        SkPoint a = origin + line[0];
+        const SkPoint& b = line[1];
+        canvas->drawLine(a, b, paint);
+        SkAutoCanvasRestore acr(canvas, true);
+        SkScalar angle = SkScalarATan2((b.fY - a.fY), b.fX - a.fX);
+        canvas->rotate(angle * 180 / SK_ScalarPI, a.fX, a.fY);
+        SkString distance("distance = ");
+        distance.appendScalar(SkPoint::Distance(a, b));
+        canvas->drawString(distance, a.fX + 25, a.fY - 4, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_034.cpp b/docs/examples/Point_034.cpp
new file mode 100644
index 0000000..f961386
--- /dev/null
+++ b/docs/examples/Point_034.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=496db0131a003162faba7d7f98b30340
+REG_FIDDLE(Point_034, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
+                             {{-20, -24}, {-24, -20}}};
+    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
+    paint.setStrokeWidth(2);
+    for (size_t i = 0; i < 4; ++i) {
+        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
+        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
+        SkString str;
+        str.printf("dot = %g", SkPoint::DotProduct(vectors[i][0], vectors[i][1]));
+        canvas->drawString(str, center[i].fX, center[i].fY, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_035.cpp b/docs/examples/Point_035.cpp
new file mode 100644
index 0000000..118fe04
--- /dev/null
+++ b/docs/examples/Point_035.cpp
@@ -0,0 +1,27 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b8a4cd8a29d22bb9c5e63b70357bd65
+REG_FIDDLE(Point_035, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
+                             {{-20, -24}, {-24, -20}}};
+    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
+    paint.setStrokeWidth(2);
+    for (size_t i = 0; i < 4; ++i) {
+        paint.setColor(SK_ColorRED);
+        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
+        paint.setColor(SK_ColorBLUE);
+        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
+        SkString str;
+        SkScalar cross = SkPoint::CrossProduct(vectors[i][1], vectors[i][0]);
+        str.printf("cross = %g", cross);
+        paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);
+        canvas->drawString(str, center[i].fX, center[i].fY, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_036.cpp b/docs/examples/Point_036.cpp
new file mode 100644
index 0000000..3a95a32
--- /dev/null
+++ b/docs/examples/Point_036.cpp
@@ -0,0 +1,27 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0bc7b3997357e499817278b78bdfbf1d
+REG_FIDDLE(Point_036, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
+                             {{-20, -24}, {-24, -20}}};
+    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
+    paint.setStrokeWidth(2);
+    for (size_t i = 0; i < 4; ++i) {
+        paint.setColor(SK_ColorRED);
+        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
+        paint.setColor(SK_ColorBLUE);
+        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
+        SkString str;
+        SkScalar cross = vectors[i][0].cross(vectors[i][1]);
+        str.printf("cross = %g", cross);
+        paint.setColor(cross >= 0 ? SK_ColorRED : SK_ColorBLUE);
+        canvas->drawString(str, center[i].fX, center[i].fY, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Point_037.cpp b/docs/examples/Point_037.cpp
new file mode 100644
index 0000000..3f5b103
--- /dev/null
+++ b/docs/examples/Point_037.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=56d01ccfedd71d3c504b09afa2875d38
+REG_FIDDLE(Point_037, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkVector vectors[][2] = {{{50, 2}, {-14, 20}}, {{0, 50}, {-50, 0}}, {{-20, 25}, {25, -20}},
+                             {{-20, -24}, {-24, -20}}};
+    SkPoint center[] = {{32, 32}, {160, 32}, {32, 160}, {160, 160}};
+    paint.setStrokeWidth(2);
+    for (size_t i = 0; i < 4; ++i) {
+        canvas->drawLine(center[i], center[i] + vectors[i][0], paint);
+        canvas->drawLine(center[i], center[i] + vectors[i][1], paint);
+        SkString str;
+        str.printf("dot = %g", vectors[i][0].dot(vectors[i][1]));
+        canvas->drawString(str, center[i].fX, center[i].fY, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_000.cpp b/docs/examples/RRect_000.cpp
new file mode 100644
index 0000000..487317f
--- /dev/null
+++ b/docs/examples/RRect_000.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=471e7aad0feaf9ec3a21757a317a64f5
+REG_FIDDLE(RRect_000, 256, 60, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect;
+    SkPaint p;
+    p.setStyle(SkPaint::kStroke_Style);
+    p.setStrokeWidth(10);
+    canvas->drawRRect(rrect, p);
+    rrect.setRect({10, 10, 100, 50});
+    canvas->drawRRect(rrect, p);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_001.cpp b/docs/examples/RRect_001.cpp
new file mode 100644
index 0000000..66942e9
--- /dev/null
+++ b/docs/examples/RRect_001.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ad8f5d49edfcee60eddfe2a955b6c5f5
+REG_FIDDLE(RRect_001, 256, 60, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50});
+    SkRRect rrect2(rrect);
+    rrect2.inset(20, 20);
+    SkPaint p;
+    p.setStyle(SkPaint::kStroke_Style);
+    p.setStrokeWidth(10);
+    canvas->drawRRect(rrect, p);
+    canvas->drawRRect(rrect2, p);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_002.cpp b/docs/examples/RRect_002.cpp
new file mode 100644
index 0000000..6632e9e
--- /dev/null
+++ b/docs/examples/RRect_002.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=52926c98c1cca00606d3ea99f23fea3d
+REG_FIDDLE(RRect_002, 256, 110, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({40, 40, 100, 70});
+    SkRRect rrect2 = rrect;
+    rrect2.inset(-20, -20);
+    SkPaint p;
+    p.setStyle(SkPaint::kStroke_Style);
+    p.setStrokeWidth(10);
+    canvas->drawRRect(rrect, p);
+    canvas->drawRRect(rrect2, p);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_003.cpp b/docs/examples/RRect_003.cpp
new file mode 100644
index 0000000..6abcbb2
--- /dev/null
+++ b/docs/examples/RRect_003.cpp
@@ -0,0 +1,27 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a4233634c75b72fc7a2815ddb69bd669
+REG_FIDDLE(RRect_003, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    struct Radii { SkVector data[4]; };
+    auto drawRRectType = [=](const SkRect& rect, const Radii& radii) {
+        SkRRect rrect;
+        rrect.setRectRadii(rect, radii.data);
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        const char* typeStr[] = { "empty", "rect", "oval", "simple", "nine patch", "complex" };
+        canvas->drawString(typeStr[(int) rrect.type()], rect.centerX(), rect.bottom() + 20, paint);
+        paint.setStyle(SkPaint::kStroke_Style);
+        canvas->drawRRect(rrect, paint);
+    };
+    drawRRectType({ 45,  30,  45,  30}, {{{ 5,  5}, { 5,  5}, { 5,  5}, { 5,  5}}});
+    drawRRectType({ 90,  10, 140,  30}, {{{ 0,  0}, { 0,  0}, { 0,  0}, { 0,  0}}});
+    drawRRectType({160,  10, 210,  30}, {{{25, 10}, {25, 10}, {25, 10}, {25, 10}}});
+    drawRRectType({ 20,  80,  70, 100}, {{{ 5,  5}, { 5,  5}, { 5,  5}, { 5,  5}}});
+    drawRRectType({ 90,  80, 140, 100}, {{{ 5,  5}, {10,  5}, {10,  5}, { 5,  5}}});
+    drawRRectType({160,  80, 210, 100}, {{{ 5,  5}, {10,  5}, { 5,  5}, { 5,  5}}});
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_004.cpp b/docs/examples/RRect_004.cpp
new file mode 100644
index 0000000..2975250
--- /dev/null
+++ b/docs/examples/RRect_004.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ace8f4aebf90527d43e4b7291375c9ad
+REG_FIDDLE(RRect_004, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50});
+    SkRRect rrect2(rrect);
+    rrect2.inset(20, 20);
+    SkPaint p;
+    p.setStyle(SkPaint::kStroke_Style);
+    p.setStrokeWidth(10);
+    std::string str("Type ");
+    str += SkRRect::kRect_Type == rrect2.getType() ? "=" : "!";
+    str += "= SkRRect::kRect_Type";
+    canvas->drawString(str.c_str(), 20, 80, SkPaint());
+    canvas->drawRRect(rrect2, p);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_005.cpp b/docs/examples/RRect_005.cpp
new file mode 100644
index 0000000..a88801f
--- /dev/null
+++ b/docs/examples/RRect_005.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1080805c8449406a4e26d694bc56d2dc
+REG_FIDDLE(RRect_005, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({10, 10, 100, 50});
+    SkRRect rrect2(rrect);
+    rrect2.inset(20, 20);
+    SkPaint p;
+    p.setStyle(SkPaint::kStroke_Style);
+    p.setStrokeWidth(10);
+    std::string str("Type ");
+    str += SkRRect::kEmpty_Type == rrect2.type() ? "=" : "!";
+    str += "= SkRRect::kEmpty_Type";
+    canvas->drawString(str.c_str(), 20, 80, SkPaint());
+    canvas->drawRRect(rrect2, p);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_006.cpp b/docs/examples/RRect_006.cpp
new file mode 100644
index 0000000..08f29fc
--- /dev/null
+++ b/docs/examples/RRect_006.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=099d79ecfbdfb0a19c10deb7201859c3
+REG_FIDDLE(RRect_006, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(16);
+    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 10, 5);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isEmpty() ? "empty" : "not empty", 64, 90, paint);
+    rrect.inset(40, 0);
+    canvas->translate(128, 0);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isEmpty() ? "empty" : "not empty", 64, 90, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_007.cpp b/docs/examples/RRect_007.cpp
new file mode 100644
index 0000000..0ee1dff
--- /dev/null
+++ b/docs/examples/RRect_007.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bc931c9a6eb8ffe7ea8d3fb47e07a475
+REG_FIDDLE(RRect_007, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(16);
+    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isRect() ? "rect" : "not rect", 64, 90, paint);
+    SkVector radii[] = {{10, 10}, {0, 0}, {0, 0}, {0, 0}};
+    rrect.setRectRadii(rrect.getBounds(), radii);
+    canvas->translate(128, 0);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isRect() ? "rect" : "not rect", 64, 90, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_008.cpp b/docs/examples/RRect_008.cpp
new file mode 100644
index 0000000..c779396
--- /dev/null
+++ b/docs/examples/RRect_008.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4dfdb28d8343958425f2c1323fe8170d
+REG_FIDDLE(RRect_008, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(16);
+    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 40, 30);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isOval() ? "oval" : "not oval", 64, 90, paint);
+    rrect.setRectXY(rrect.getBounds(), 35, 25);
+    canvas->translate(128, 0);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isOval() ? "oval" : "not oval", 64, 90, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_009.cpp b/docs/examples/RRect_009.cpp
new file mode 100644
index 0000000..75a0263
--- /dev/null
+++ b/docs/examples/RRect_009.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f6959ea422a7c6e98ddfad216a52c707
+REG_FIDDLE(RRect_009, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(16);
+    SkVector radii[] = {{40, 30}, {40, 30}, {40, 30}, {40, 30}};
+    SkRRect rrect;
+    rrect.setRectRadii({30, 10, 100, 60}, radii);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isSimple() ? "simple" : "not simple", 64, 90, paint);
+    radii[0].fX = 35;
+    rrect.setRectRadii(rrect.getBounds(), radii);
+    canvas->translate(128, 0);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isSimple() ? "simple" : "not simple", 64, 90, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_010.cpp b/docs/examples/RRect_010.cpp
new file mode 100644
index 0000000..ef37598
--- /dev/null
+++ b/docs/examples/RRect_010.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=429f6dfd4cf6287df3c3c77fa7681c99
+REG_FIDDLE(RRect_010, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(16);
+    SkVector radii[] = {{20, 30}, {40, 30}, {40, 30}, {20, 30}};
+    SkRRect rrect;
+    rrect.setRectRadii({30, 10, 100, 60}, radii);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isNinePatch() ? "9 patch" : "not 9 patch", 64, 90, paint);
+    radii[0].fX = 35;
+    rrect.setRectRadii(rrect.getBounds(), radii);
+    canvas->translate(128, 0);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isNinePatch() ? "9 patch" : "not 9 patch", 64, 90, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_011.cpp b/docs/examples/RRect_011.cpp
new file mode 100644
index 0000000..60ce3f0
--- /dev/null
+++ b/docs/examples/RRect_011.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b62c183dc435d1fc091111fb2f3c3f8e
+REG_FIDDLE(RRect_011, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(16);
+    SkVector radii[] = {{25, 30}, {40, 30}, {40, 30}, {20, 30}};
+    SkRRect rrect;
+    rrect.setRectRadii({30, 10, 100, 60}, radii);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isComplex() ? "complex" : "not complex", 64, 90, paint);
+    radii[0].fX = 20;
+    rrect.setRectRadii(rrect.getBounds(), radii);
+    canvas->translate(128, 0);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawString(rrect.isComplex() ? "complex" : "not complex", 64, 90, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_012.cpp b/docs/examples/RRect_012.cpp
new file mode 100644
index 0000000..cb85a8e
--- /dev/null
+++ b/docs/examples/RRect_012.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c675a480b41dee157f84fa2550a2a53c
+REG_FIDDLE(RRect_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect unsorted = SkRRect::MakeRect({ 15, 25, 10, 5 });
+    SkDebugf("unsorted width: %g\n", unsorted.width());
+    SkRRect large = SkRRect::MakeRect({ -FLT_MAX, 1, FLT_MAX, 2 });
+    SkDebugf("large width: %.0f\n", large.width());
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_013.cpp b/docs/examples/RRect_013.cpp
new file mode 100644
index 0000000..f0fbcbe
--- /dev/null
+++ b/docs/examples/RRect_013.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5a3eb1755164a7becec33cec6e6eca31
+REG_FIDDLE(RRect_013, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect unsorted = SkRRect::MakeRect({ 15, 25, 10, 20 });
+    SkDebugf("unsorted height: %g\n", unsorted.height());
+    SkRRect large = SkRRect::MakeRect({ 1, -FLT_MAX, 2, FLT_MAX });
+    SkDebugf("large height: %.0f\n", large.height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_014.cpp b/docs/examples/RRect_014.cpp
new file mode 100644
index 0000000..35d9179
--- /dev/null
+++ b/docs/examples/RRect_014.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=81345f7619a072bb2b0cf59810fe86d0
+REG_FIDDLE(RRect_014, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto drawDetails = [=](const SkRRect& rrect) {
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        paint.setTextSize(12);
+        canvas->drawRRect(rrect, paint);
+        SkVector corner = rrect.getSimpleRadii();
+        std::string label = "corner: " + std::to_string(corner.fX).substr(0, 3) + ", " +
+                        std::to_string(corner.fY).substr(0, 3);
+        canvas->drawString(label.c_str(), 64, 90, paint);
+        canvas->translate(128, 0);
+    };
+    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});
+    drawDetails(rrect);
+    rrect.setRectXY(rrect.getBounds(), 5, 8);
+    drawDetails(rrect);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_015.cpp b/docs/examples/RRect_015.cpp
new file mode 100644
index 0000000..f7d17ac
--- /dev/null
+++ b/docs/examples/RRect_015.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=44e9a9c2c5ef1af2a616086ff46a9037
+REG_FIDDLE(RRect_015, 256, 80, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});
+    canvas->drawRRect(rrect, paint);
+    rrect.setEmpty();
+    paint.setColor(SK_ColorBLUE);
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_016.cpp b/docs/examples/RRect_016.cpp
new file mode 100644
index 0000000..6d19494
--- /dev/null
+++ b/docs/examples/RRect_016.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3afc3ac9bebd1d7387822cc608571e82
+REG_FIDDLE(RRect_016, 256, 90, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});
+    canvas->drawRRect(rrect, paint);
+    rrect.setRect({60, 30, 120, 80});
+    paint.setColor(SK_ColorBLUE);
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_017.cpp b/docs/examples/RRect_017.cpp
new file mode 100644
index 0000000..28ad968
--- /dev/null
+++ b/docs/examples/RRect_017.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c6c6be3b3c137226adbb5b5af9203d27
+REG_FIDDLE(RRect_017, 256, 90, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeEmpty();
+    SkRRect rrect2(rrect);
+    rrect2.inset(-20, -20);
+    SkPaint p;
+    p.setStyle(SkPaint::kStroke_Style);
+    p.setStrokeWidth(10);
+    std::string str("Type ");
+    str += SkRRect::kEmpty_Type == rrect2.type() ? "=" : "!";
+    str += "= SkRRect::kEmpty_Type";
+    canvas->drawString(str.c_str(), 20, 80, SkPaint());
+    canvas->drawRRect(rrect2, p);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_018.cpp b/docs/examples/RRect_018.cpp
new file mode 100644
index 0000000..e60f64f
--- /dev/null
+++ b/docs/examples/RRect_018.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5295b07fe4d2cdcd077979a9e19854d9
+REG_FIDDLE(RRect_018, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeRect({30, 10, 100, 60});
+    canvas->drawRRect(rrect, paint);
+    rrect.setOval(rrect.getBounds());
+    paint.setColor(SK_ColorBLUE);
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_019.cpp b/docs/examples/RRect_019.cpp
new file mode 100644
index 0000000..d9c9439
--- /dev/null
+++ b/docs/examples/RRect_019.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0b99ee38fd154f769f6031242e02fa7a
+REG_FIDDLE(RRect_019, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeOval({30, 10, 100, 60});
+    canvas->drawRRect(rrect, paint);
+    rrect.setRect(rrect.getBounds());
+    paint.setColor(SK_ColorBLUE);
+    paint.setBlendMode(SkBlendMode::kDifference);
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_020.cpp b/docs/examples/RRect_020.cpp
new file mode 100644
index 0000000..dd61bbb
--- /dev/null
+++ b/docs/examples/RRect_020.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2b24a1247637cbc94f8b3c77d37ed3e2
+REG_FIDDLE(RRect_020, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20);
+    canvas->drawRRect(rrect, paint);
+    rrect.setRect(rrect.getBounds());
+    paint.setColor(SK_ColorBLUE);
+    paint.setBlendMode(SkBlendMode::kModulate);
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_021.cpp b/docs/examples/RRect_021.cpp
new file mode 100644
index 0000000..58c1ea4
--- /dev/null
+++ b/docs/examples/RRect_021.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cf418af29cbab6243ac16aacd1217ffe
+REG_FIDDLE(RRect_021, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20);
+    canvas->drawRRect(rrect, paint);
+    rrect.setOval(rrect.getBounds());
+    paint.setColor(SK_ColorWHITE);
+    paint.setBlendMode(SkBlendMode::kExclusion);
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_022.cpp b/docs/examples/RRect_022.cpp
new file mode 100644
index 0000000..198679e
--- /dev/null
+++ b/docs/examples/RRect_022.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6ac569e40fb68c758319e85428b9ae95
+REG_FIDDLE(RRect_022, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeRectXY({30, 10, 100, 60}, 20, 20);
+    canvas->drawRRect(rrect, paint);
+    rrect.setRectXY(rrect.getBounds(), 5, 5);
+    paint.setColor(SK_ColorWHITE);
+    paint.setBlendMode(SkBlendMode::kExclusion);
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_023.cpp b/docs/examples/RRect_023.cpp
new file mode 100644
index 0000000..cb14e6b
--- /dev/null
+++ b/docs/examples/RRect_023.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c4620df2eaba447b581688d3100053b1
+REG_FIDDLE(RRect_023, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRRect rrect;
+    rrect.setNinePatch({30, 10, 100, 60}, 10, 20, 20, 10);
+    canvas->drawRRect(rrect, paint);
+    paint.setColor(SK_ColorWHITE);
+    const SkRect r = rrect.getBounds();
+    canvas->drawLine(r.fLeft, r.fTop + rrect.radii(SkRRect::kUpperLeft_Corner).fY,
+                     r.fRight, r.fTop + rrect.radii(SkRRect::kUpperRight_Corner).fY, paint);
+    canvas->drawLine(r.fLeft, r.fBottom - rrect.radii(SkRRect::kLowerLeft_Corner).fY,
+                     r.fRight, r.fBottom - rrect.radii(SkRRect::kLowerRight_Corner).fY, paint);
+    canvas->drawLine(r.fLeft + rrect.radii(SkRRect::kUpperLeft_Corner).fX, r.fTop,
+                     r.fLeft + rrect.radii(SkRRect::kLowerLeft_Corner).fX, r.fBottom, paint);
+    canvas->drawLine(r.fRight - rrect.radii(SkRRect::kUpperRight_Corner).fX, r.fTop,
+                     r.fRight - rrect.radii(SkRRect::kLowerRight_Corner).fX, r.fBottom, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_024.cpp b/docs/examples/RRect_024.cpp
new file mode 100644
index 0000000..0db919c
--- /dev/null
+++ b/docs/examples/RRect_024.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=340d6c51efaa1f7f3d0dcaf8b0e90696
+REG_FIDDLE(RRect_024, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setStrokeWidth(15);
+    paint.setStrokeCap(SkPaint::kSquare_Cap);
+    paint.setAntiAlias(true);
+    float intervals[] = { 5, 21.75f };
+    paint.setStyle(SkPaint::kStroke_Style);
+    paint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0));
+    SkPath path;
+    SkRRect rrect;
+    SkVector corners[] = {{15, 17}, {17, 19}, {19, 15}, {15, 15}};
+    rrect.setRectRadii({20, 20, 100, 100}, corners);
+    path.addRRect(rrect, SkPath::kCW_Direction);
+    canvas->drawPath(path, paint);
+    path.rewind();
+    path.addRRect(rrect, SkPath::kCCW_Direction, 1);
+    canvas->translate(120, 0);
+    canvas->drawPath(path, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_025.cpp b/docs/examples/RRect_025.cpp
new file mode 100644
index 0000000..4e57449
--- /dev/null
+++ b/docs/examples/RRect_025.cpp
@@ -0,0 +1,24 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9205393f30b156e1507e88aa27f1dd91
+REG_FIDDLE(RRect_025, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    SkRRect rrect;
+    SkVector corners[] = {{25, 17}, {17, 19}, {19, 15}, {15, 15}};
+    rrect.setRectRadii({30, 10, 100, 60}, corners);
+    canvas->drawRRect(rrect, paint);
+    paint.setColor(SK_ColorWHITE);
+    const SkRect r = rrect.getBounds();
+    canvas->drawLine(r.fLeft, r.fTop + rrect.radii(SkRRect::kUpperLeft_Corner).fY,
+                     r.fRight, r.fTop + rrect.radii(SkRRect::kUpperRight_Corner).fY, paint);
+    canvas->drawLine(r.fLeft, r.fBottom - rrect.radii(SkRRect::kLowerLeft_Corner).fY,
+                     r.fRight, r.fBottom - rrect.radii(SkRRect::kLowerRight_Corner).fY, paint);
+    canvas->drawLine(r.fLeft + rrect.radii(SkRRect::kUpperLeft_Corner).fX, r.fTop,
+                     r.fLeft + rrect.radii(SkRRect::kLowerLeft_Corner).fX, r.fBottom, paint);
+    canvas->drawLine(r.fRight - rrect.radii(SkRRect::kUpperRight_Corner).fX, r.fTop,
+                     r.fRight - rrect.radii(SkRRect::kLowerRight_Corner).fX, r.fBottom, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_026.cpp b/docs/examples/RRect_026.cpp
new file mode 100644
index 0000000..2ca20a3
--- /dev/null
+++ b/docs/examples/RRect_026.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6831adf4c536047f4709c686feb10c48
+REG_FIDDLE(RRect_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (SkScalar left : { SK_ScalarNaN, SK_ScalarInfinity, 100.f, 50.f, 25.f} ) {
+        SkRRect rrect1 = SkRRect::MakeRectXY({left, 20, 60, 220}, 50, 200);
+        SkDebugf("left bounds: (%g) %g\n", left, rrect1.rect().fLeft);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_027.cpp b/docs/examples/RRect_027.cpp
new file mode 100644
index 0000000..48b755b
--- /dev/null
+++ b/docs/examples/RRect_027.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8d5c88478528584913867ada423e0d59
+REG_FIDDLE(RRect_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    for (SkScalar radiusX : { SK_ScalarNaN, SK_ScalarInfinity, 100.f, 50.f, 25.f} ) {
+        SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, radiusX, 200);
+        SkDebugf("left corner: (%g) %g\n", radiusX, rrect1.radii(SkRRect::kUpperLeft_Corner).fX);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_028.cpp b/docs/examples/RRect_028.cpp
new file mode 100644
index 0000000..394391c
--- /dev/null
+++ b/docs/examples/RRect_028.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4577e2dcb086b241bb43d8b89ee0b0dd
+REG_FIDDLE(RRect_028, 256, 120, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    SkRRect rrect = SkRRect::MakeRectXY({20, 20, 220, 100}, 15, 15);
+    canvas->drawRRect(rrect, paint);
+    paint.setColor(SK_ColorWHITE);
+    rrect = SkRRect::MakeOval(rrect.getBounds());
+    canvas->drawRRect(rrect, paint);
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_029.cpp b/docs/examples/RRect_029.cpp
new file mode 100644
index 0000000..9486ea66
--- /dev/null
+++ b/docs/examples/RRect_029.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=df181af37f1d2b06f0f45af73df7b47d
+REG_FIDDLE(RRect_029, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, 50, 200);
+    SkRRect rrect2 = SkRRect::MakeRectXY(rrect1.rect(), 25, 100);
+    SkRRect rrect3 = SkRRect::MakeOval(rrect1.rect());
+    canvas->drawRRect(rrect1, SkPaint());
+    std::string str = "rrect1 " + std::string(rrect1 == rrect2 ? "=" : "!") + "= rrect2";
+    canvas->drawString(str.c_str(), 10, 240, SkPaint());
+    canvas->translate(70, 0);
+    canvas->drawRRect(rrect2, SkPaint());
+    canvas->translate(70, 0);
+    canvas->drawRRect(rrect3, SkPaint());
+    str = "rrect2 " + std::string(rrect2 == rrect3 ? "=" : "!") + "= rrect3";
+    canvas->drawString(str.c_str(), -20, 240, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_030.cpp b/docs/examples/RRect_030.cpp
new file mode 100644
index 0000000..4418787
--- /dev/null
+++ b/docs/examples/RRect_030.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=505e47b3e6474ebdecdc04c3c2af2c34
+REG_FIDDLE(RRect_030, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect1 = SkRRect::MakeRectXY({10, 20, 60, 220}, 50, 100);
+    SkRRect rrect2 = SkRRect::MakeRectXY(rrect1.rect(), 50, 50);
+    SkRRect rrect3 = SkRRect::MakeOval(rrect1.rect());
+    canvas->drawRRect(rrect1, SkPaint());
+    std::string str = "rrect1 " + std::string(rrect1 == rrect2 ? "=" : "!") + "= rrect2";
+    canvas->drawString(str.c_str(), 10, 240, SkPaint());
+    canvas->translate(70, 0);
+    canvas->drawRRect(rrect2, SkPaint());
+    canvas->translate(70, 0);
+    canvas->drawRRect(rrect3, SkPaint());
+    str = "rrect2 " + std::string(rrect2 == rrect3 ? "=" : "!") + "= rrect3";
+    canvas->drawString(str.c_str(), -20, 240, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_031.cpp b/docs/examples/RRect_031.cpp
new file mode 100644
index 0000000..1602975
--- /dev/null
+++ b/docs/examples/RRect_031.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f02f0110d5605dac6d14dcb8d1d8cb6e
+REG_FIDDLE(RRect_031, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);
+    for (int index = 0; index < 25; ++index) {
+       canvas->drawRRect(rrect, paint);
+       rrect.inset(-3, 3, &rrect);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_032.cpp b/docs/examples/RRect_032.cpp
new file mode 100644
index 0000000..f16d577
--- /dev/null
+++ b/docs/examples/RRect_032.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=da61054322550a2d5ac15114da23bd23
+REG_FIDDLE(RRect_032, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkRRect rrect = SkRRect::MakeRectXY({10, 20, 180, 220}, 50, 100);
+    for (int index = 0; index < 25; ++index) {
+       canvas->drawRRect(rrect, paint);
+       rrect.inset(3, 3);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_033.cpp b/docs/examples/RRect_033.cpp
new file mode 100644
index 0000000..9d8c218
--- /dev/null
+++ b/docs/examples/RRect_033.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4d69b6d9c7726c47c42827d79fc7899c
+REG_FIDDLE(RRect_033, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);
+    for (int index = 0; index < 25; ++index) {
+       canvas->drawRRect(rrect, paint);
+       rrect.outset(-3, 3, &rrect);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_034.cpp b/docs/examples/RRect_034.cpp
new file mode 100644
index 0000000..1dc1c8e
--- /dev/null
+++ b/docs/examples/RRect_034.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4391cced86653dcd0f84439a5c0bb3f2
+REG_FIDDLE(RRect_034, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);
+    for (int index = 0; index < 25; ++index) {
+       canvas->drawRRect(rrect, paint);
+       rrect.outset(3, 3);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_035.cpp b/docs/examples/RRect_035.cpp
new file mode 100644
index 0000000..4423528
--- /dev/null
+++ b/docs/examples/RRect_035.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a45cdd46ef2fe0df62d84d41713e82e2
+REG_FIDDLE(RRect_035, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);
+    for (int index = 0; index < 25; ++index) {
+       canvas->drawRRect(rrect, paint);
+       rrect.offset(3, 3);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_036.cpp b/docs/examples/RRect_036.cpp
new file mode 100644
index 0000000..f6afc29
--- /dev/null
+++ b/docs/examples/RRect_036.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c433aa41eaf5e419e3349fb970a08151
+REG_FIDDLE(RRect_036, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setStyle(SkPaint::kStroke_Style);
+    SkRRect rrect = SkRRect::MakeRectXY({100, 20, 140, 220}, 50, 100);
+    for (int index = 0; index < 25; ++index) {
+       canvas->drawRRect(rrect, paint);
+       rrect = rrect.makeOffset(-3, 3);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_037.cpp b/docs/examples/RRect_037.cpp
new file mode 100644
index 0000000..726bd8a
--- /dev/null
+++ b/docs/examples/RRect_037.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0bb057140e4119234bdd2e8dd2f0fa19
+REG_FIDDLE(RRect_037, 256, 110, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect test = {10, 10, 110, 80};
+    SkRRect rrect = SkRRect::MakeRect(test);
+    SkRRect oval = SkRRect::MakeOval(test);
+    test.inset(10, 10);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString(rrect.contains(test) ? "contains" : "does not contain", 55, 100, paint);
+    canvas->drawString(oval.contains(test) ? "contains" : "does not contain", 185, 100, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawRect(test, paint);
+    canvas->translate(120, 0);
+    canvas->drawRRect(oval, paint);
+    canvas->drawRect(test, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_038.cpp b/docs/examples/RRect_038.cpp
new file mode 100644
index 0000000..521e3ca
--- /dev/null
+++ b/docs/examples/RRect_038.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8cc1f21c98c0416f7724ad218f557a00
+REG_FIDDLE(RRect_038, 256, 110, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({10, 10, 110, 80});
+    SkRRect corrupt = rrect;
+    *((float*) &corrupt) = 120;
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString(rrect.isValid() ? "is valid" : "is corrupted", 55, 100, paint);
+    canvas->drawString(corrupt.isValid() ? "is valid" : "is corrupted", 185, 100, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRRect(rrect, paint);
+    canvas->translate(120, 0);
+    canvas->drawRRect(corrupt, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_039.cpp b/docs/examples/RRect_039.cpp
new file mode 100644
index 0000000..e978d5c
--- /dev/null
+++ b/docs/examples/RRect_039.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d6f5a3d21727ddc15e10ef4d5103ff91
+REG_FIDDLE(RRect_039, 256, 110, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({10, 10, 110, 80});
+    char storage[SkRRect::kSizeInMemory];
+    rrect.writeToMemory(storage);
+    SkRRect copy;
+    copy.readFromMemory(storage, sizeof(storage));
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString("rrect", 55, 100, paint);
+    canvas->drawString("copy", 185, 100, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRRect(rrect, paint);
+    canvas->translate(120, 0);
+    canvas->drawRRect(copy, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_040.cpp b/docs/examples/RRect_040.cpp
new file mode 100644
index 0000000..5809600
--- /dev/null
+++ b/docs/examples/RRect_040.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=50969745cf2b23544362f4cff5592b75
+REG_FIDDLE(RRect_040, 256, 110, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkVector radii[] = {{5, 5},  {10, 10}, {15, 15}, {5, 5}};
+    SkRRect rrect;
+    rrect.setRectRadii({10, 10, 110, 80}, radii);
+    char storage[SkRRect::kSizeInMemory];
+    rrect.writeToMemory(storage);
+    SkRRect copy;
+    copy.readFromMemory(storage, sizeof(storage));
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString("rrect", 55, 100, paint);
+    canvas->drawString("copy", 185, 100, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRRect(rrect, paint);
+    canvas->translate(120, 0);
+    canvas->drawRRect(copy, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_041.cpp b/docs/examples/RRect_041.cpp
new file mode 100644
index 0000000..43fc25c
--- /dev/null
+++ b/docs/examples/RRect_041.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=68a5d24f22e2d798608fce8a20e47fd0
+REG_FIDDLE(RRect_041, 256, 110, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkVector radii[] = {{5, 5},  {10, 10}, {15, 15}, {5, 5}};
+    SkRRect rrect;
+    rrect.setRectRadii({10, 10, 110, 80}, radii);
+    SkRRect transformed;
+    SkMatrix matrix = SkMatrix::MakeRectToRect(rrect.rect(), {140, 30, 220, 80},
+                                               SkMatrix::kCenter_ScaleToFit);
+    bool success = rrect.transform(matrix, &transformed);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    canvas->drawString("rrect", 55, 100, paint);
+    canvas->drawString(success ? "transformed" : "transform failed", 185, 100, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRRect(rrect, paint);
+    canvas->drawRRect(transformed, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/RRect_042.cpp b/docs/examples/RRect_042.cpp
new file mode 100644
index 0000000..3bbc253
--- /dev/null
+++ b/docs/examples/RRect_042.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=265b8d23288dc8026ff788e809360af7
+REG_FIDDLE(RRect_042, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3});
+    for (bool dumpAsHex : { false, true } ) {
+        rrect.dump(dumpAsHex);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_043.cpp b/docs/examples/RRect_043.cpp
new file mode 100644
index 0000000..e3ade1c
--- /dev/null
+++ b/docs/examples/RRect_043.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f850423c7c0c4f803d479ecd92221059
+REG_FIDDLE(RRect_043, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3});
+    rrect.dump();
+    SkRect bounds = SkRect::MakeLTRB(0.857143f, 0.666667f, 0.857143f, 0.666667f);
+    const SkPoint corners[] = {
+        { 0, 0 },
+        { 0, 0 },
+        { 0, 0 },
+        { 0, 0 },
+    };
+    SkRRect copy;
+    copy.setRectRadii(bounds, corners);
+    SkDebugf("rrect is " "%s" "equal to copy\n", rrect == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/RRect_044.cpp b/docs/examples/RRect_044.cpp
new file mode 100644
index 0000000..831e795
--- /dev/null
+++ b/docs/examples/RRect_044.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c73f5e2644d949b859f05bd367883454
+REG_FIDDLE(RRect_044, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRRect rrect = SkRRect::MakeRect({6.f / 7, 2.f / 3, 6.f / 7, 2.f / 3});
+    rrect.dumpHex();
+    SkRect bounds = SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */
+                     SkBits2Float(0x3f2aaaab), /* 0.666667 */
+                     SkBits2Float(0x3f5b6db7), /* 0.857143 */
+                     SkBits2Float(0x3f2aaaab)  /* 0.666667 */);
+    const SkPoint corners[] = {
+        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+        { SkBits2Float(0x00000000), SkBits2Float(0x00000000) }, /* 0.000000 0.000000 */
+    };
+    SkRRect copy;
+    copy.setRectRadii(bounds, corners);
+    SkDebugf("rrect is " "%s" "equal to copy\n", rrect == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_000.cpp b/docs/examples/Rect_000.cpp
new file mode 100644
index 0000000..5e3fd69
--- /dev/null
+++ b/docs/examples/Rect_000.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2e262d0ac4b8ef51695e0525fc3ecdf6
+REG_FIDDLE(Rect_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = SkRect::MakeEmpty();
+    SkDebugf("MakeEmpty isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+    rect.offset(10, 10);
+    SkDebugf("offset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+    rect.inset(10, 10);
+    SkDebugf("inset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+    rect.outset(20, 20);
+    SkDebugf("outset rect isEmpty: %s\n", rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_001.cpp b/docs/examples/Rect_001.cpp
new file mode 100644
index 0000000..75aa7a5
--- /dev/null
+++ b/docs/examples/Rect_001.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8009d30f431e01f8aea4808e9017d9bf
+REG_FIDDLE(Rect_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect1 = SkRect::MakeWH(25, 35);
+    SkRect rect2 = SkRect::MakeIWH(25, 35);
+    SkRect rect3 = SkRect::MakeXYWH(0, 0, 25, 35);
+    SkRect rect4 = SkRect::MakeLTRB(0, 0, 25, 35);
+    SkDebugf("all %s" "equal\n", rect1 == rect2 && rect2 == rect3 && rect3 == rect4 ?
+             "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_002.cpp b/docs/examples/Rect_002.cpp
new file mode 100644
index 0000000..f09af82
--- /dev/null
+++ b/docs/examples/Rect_002.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=faa660ac19eaddc3f3eab57a0bddfdcb
+REG_FIDDLE(Rect_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect i_rect = SkIRect::MakeWH(25, 35);
+    SkRect  f_rect = SkRect::MakeIWH(25, 35);
+    SkDebugf("i_rect width: %d f_rect width:%g\n", i_rect.width(), f_rect.width());
+    i_rect = SkIRect::MakeWH(125000111, 0);
+    f_rect = SkRect::MakeIWH(125000111, 0);
+    SkDebugf("i_rect width: %d f_rect width:%.0f\n", i_rect.width(), f_rect.width());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_003.cpp b/docs/examples/Rect_003.cpp
new file mode 100644
index 0000000..ffe0973
--- /dev/null
+++ b/docs/examples/Rect_003.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ab2c1a55016c8de9172b77fdf69e00a2
+REG_FIDDLE(Rect_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkSize size = {25.5f, 35.5f};
+    SkRect rect = SkRect::MakeSize(size);
+    SkDebugf("rect width: %g  height: %g\n", rect.width(), rect.height());
+    SkISize floor = size.toFloor();
+    rect = SkRect::MakeSize(SkSize::Make(floor));
+    SkDebugf("floor width: %g  height: %g\n", rect.width(), rect.height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_004.cpp b/docs/examples/Rect_004.cpp
new file mode 100644
index 0000000..3fde17b
--- /dev/null
+++ b/docs/examples/Rect_004.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=158b8dd9d02d65a5ae5ab7d1595a5b4c
+REG_FIDDLE(Rect_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = SkRect::MakeLTRB(5, 35, 15, 25);
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect.sort();
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_005.cpp b/docs/examples/Rect_005.cpp
new file mode 100644
index 0000000..8655c4c
--- /dev/null
+++ b/docs/examples/Rect_005.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=38e464dba13be11ac21e210fbf3b5afc
+REG_FIDDLE(Rect_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = SkRect::MakeXYWH(5, 35, -15, 25);
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect.sort();
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_006.cpp b/docs/examples/Rect_006.cpp
new file mode 100644
index 0000000..322ca9b
--- /dev/null
+++ b/docs/examples/Rect_006.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e866f5e4f6ac52e89acadf48e54ac8e0
+REG_FIDDLE(Rect_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect1 = SkRect::MakeSize({2, 35});
+    SkRect rect2 = SkRect::MakeIWH(2, 35);
+    SkDebugf("rect1 %c= rect2\n", rect1 == rect2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_007.cpp b/docs/examples/Rect_007.cpp
new file mode 100644
index 0000000..1abe2f0
--- /dev/null
+++ b/docs/examples/Rect_007.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dd801faa1e60a0fe9e0657674461e063
+REG_FIDDLE(Rect_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect i_rect1 = {2, 35, 22, 53};
+    SkRect f_rect = SkRect::Make(i_rect1);
+    f_rect.offset(0.49f, 0.49f);
+    SkIRect i_rect2;
+    f_rect.round(&i_rect2);
+    SkDebugf("i_rect1 %c= i_rect2\n", i_rect1 == i_rect2? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_008.cpp b/docs/examples/Rect_008.cpp
new file mode 100644
index 0000000..425c434
--- /dev/null
+++ b/docs/examples/Rect_008.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1d7b924d6ca2a6aef09684a8a632439c
+REG_FIDDLE(Rect_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};
+    for (auto rect : tests) {
+        SkDebugf("rect: {%g, %g, %g, %g} is" "%s empty\n", rect.left(), rect.top(), rect.right(),
+                 rect.bottom(), rect.isEmpty() ? "" : " not");
+        rect.sort();
+        SkDebugf("sorted: {%g, %g, %g, %g} is" "%s empty\n", rect.left(), rect.top(), rect.right(),
+                 rect.bottom(), rect.isEmpty() ? "" : " not");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_009.cpp b/docs/examples/Rect_009.cpp
new file mode 100644
index 0000000..35ae9d8
--- /dev/null
+++ b/docs/examples/Rect_009.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c7065a83b220a96f903dbbb65906fe7b
+REG_FIDDLE(Rect_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect tests[] = {{20, 40, 10, 50}, {20, 40, 20, 50}};
+    for (auto rect : tests) {
+        SkDebugf("rect: {%g, %g, %g, %g} is" "%s sorted\n", rect.left(), rect.top(), rect.right(),
+                 rect.bottom(), rect.isSorted() ? "" : " not");
+        rect.sort();
+        SkDebugf("sorted: {%g, %g, %g, %g} is" "%s sorted\n", rect.left(), rect.top(), rect.right(),
+                 rect.bottom(), rect.isSorted() ? "" : " not");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_010.cpp b/docs/examples/Rect_010.cpp
new file mode 100644
index 0000000..33eac24
--- /dev/null
+++ b/docs/examples/Rect_010.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=443fe5f8296d4cdb19cc9862a9cf77a4
+REG_FIDDLE(Rect_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect largest = { SK_ScalarMin, SK_ScalarMin, SK_ScalarMax, SK_ScalarMax };
+        SkDebugf("largest is finite: %s\n", largest.isFinite() ? "true" : "false");
+        SkDebugf("large width %g\n", largest.width());
+        SkRect widest = SkRect::MakeWH(largest.width(), largest.height());
+        SkDebugf("widest is finite: %s\n", widest.isFinite() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_011.cpp b/docs/examples/Rect_011.cpp
new file mode 100644
index 0000000..4e219fd
--- /dev/null
+++ b/docs/examples/Rect_011.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=23c77a35ac54a439a2989f840aa5cb99
+REG_FIDDLE(Rect_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 5, 10, 25 };
+    SkDebugf("unsorted.fLeft: %g unsorted.x(): %g\n", unsorted.fLeft, unsorted.x());
+    SkRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fLeft: %g sorted.x(): %g\n", sorted.fLeft, sorted.x());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_012.cpp b/docs/examples/Rect_012.cpp
new file mode 100644
index 0000000..ed06b3f
--- /dev/null
+++ b/docs/examples/Rect_012.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c653d9017983d2a047b1fee6a481d82b
+REG_FIDDLE(Rect_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fTop: %g unsorted.y(): %g\n", unsorted.fTop, unsorted.y());
+    SkRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fTop: %g sorted.y(): %g\n", sorted.fTop, sorted.y());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_013.cpp b/docs/examples/Rect_013.cpp
new file mode 100644
index 0000000..ab364b6
--- /dev/null
+++ b/docs/examples/Rect_013.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=900dc96c3549795a87036d6458c4fde6
+REG_FIDDLE(Rect_013, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 5, 10, 25 };
+    SkDebugf("unsorted.fLeft: %g unsorted.left(): %g\n", unsorted.fLeft, unsorted.left());
+    SkRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fLeft: %g sorted.left(): %g\n", sorted.fLeft, sorted.left());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_014.cpp b/docs/examples/Rect_014.cpp
new file mode 100644
index 0000000..0330199
--- /dev/null
+++ b/docs/examples/Rect_014.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3cfc24b011aef1ca8ccb57c05711620c
+REG_FIDDLE(Rect_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fTop: %g unsorted.top(): %g\n", unsorted.fTop, unsorted.top());
+    SkRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fTop: %g sorted.top(): %g\n", sorted.fTop, sorted.top());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_015.cpp b/docs/examples/Rect_015.cpp
new file mode 100644
index 0000000..4b47a66c
--- /dev/null
+++ b/docs/examples/Rect_015.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ca3de7e5e292b3ad3633b1c39a31d3ab
+REG_FIDDLE(Rect_015, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fRight: %g unsorted.right(): %g\n", unsorted.fRight, unsorted.right());
+    SkRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fRight: %g sorted.right(): %g\n", sorted.fRight, sorted.right());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_016.cpp b/docs/examples/Rect_016.cpp
new file mode 100644
index 0000000..d3d2ff3
--- /dev/null
+++ b/docs/examples/Rect_016.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a98993a66616ae406d8bdc54adfb1411
+REG_FIDDLE(Rect_016, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted.fBottom: %g unsorted.bottom(): %g\n", unsorted.fBottom, unsorted.bottom());
+    SkRect sorted = unsorted.makeSorted();
+    SkDebugf("sorted.fBottom: %g sorted.bottom(): %g\n", sorted.fBottom, sorted.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_017.cpp b/docs/examples/Rect_017.cpp
new file mode 100644
index 0000000..ab2391b
--- /dev/null
+++ b/docs/examples/Rect_017.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=11f8f0efe6291019fee0ac17844f6c1a
+REG_FIDDLE(Rect_017, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 25, 10, 5 };
+    SkDebugf("unsorted width: %g\n", unsorted.width());
+    SkRect large = { -2147483647.f, 1, 2147483644.f, 2 };
+    SkDebugf("large width: %.0f\n", large.width());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_018.cpp b/docs/examples/Rect_018.cpp
new file mode 100644
index 0000000..0069824
--- /dev/null
+++ b/docs/examples/Rect_018.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=39429e45f05240218ecd511443ab3e44
+REG_FIDDLE(Rect_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect unsorted = { 15, 25, 10, 20 };
+    SkDebugf("unsorted height: %g\n", unsorted.height());
+    SkRect large = { 1, -2147483647.f, 2, 2147483644.f };
+    SkDebugf("large height: %.0f\n", large.height());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_019.cpp b/docs/examples/Rect_019.cpp
new file mode 100644
index 0000000..76dc442
--- /dev/null
+++ b/docs/examples/Rect_019.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d8439ba8d23a424fa032fb97147fd2d2
+REG_FIDDLE(Rect_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect tests[] = {{20, 30, 41, 51}, {-20, -30, -41, -51}};
+    for (auto rect : tests) {
+        SkDebugf("left: %3g right: %3g centerX: %3g\n", rect.left(), rect.right(), rect.centerX());
+        rect.sort();
+        SkDebugf("left: %3g right: %3g centerX: %3g\n", rect.left(), rect.right(), rect.centerX());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_020.cpp b/docs/examples/Rect_020.cpp
new file mode 100644
index 0000000..14e1788
--- /dev/null
+++ b/docs/examples/Rect_020.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ebeeafafeb8fe39d5ffc9115b02c2340
+REG_FIDDLE(Rect_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 2e+38f, 2e+38f, 3e+38f, 3e+38f };
+    SkDebugf("left: %g right: %g centerX: %g ", rect.left(), rect.right(), rect.centerX());
+    SkDebugf("safe mid x: %g\n", rect.left() / 2 + rect.right() / 2);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_021.cpp b/docs/examples/Rect_021.cpp
new file mode 100644
index 0000000..ebb5c55
--- /dev/null
+++ b/docs/examples/Rect_021.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c6c5b40cad7c3a839fdf576b380391a6
+REG_FIDDLE(Rect_021, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const SkRect& test) -> void {
+        SkRect negZero = {-0.0f, -0.0f, 2, 2};
+        SkDebugf("{%g, %g, %g, %g} %c= {%g, %g, %g, %g} %s numerically equal\n",
+                 test.fLeft, test.fTop, test.fRight, test.fBottom,
+                 negZero.fLeft, negZero.fTop, negZero.fRight, negZero.fBottom,
+                 test == negZero ? '=' : '!',
+                 test.fLeft == negZero.fLeft && test.fTop == negZero.fTop &&
+                 test.fRight == negZero.fRight && test.fBottom == negZero.fBottom ?
+                 "and are" : "yet are not");
+    };
+    SkRect tests[] = {{0, 0, 2, 2}, {-0, -0, 2, 2}, {0.0f, 0.0f, 2, 2}};
+    SkDebugf("tests are %s" "equal\n", tests[0] == tests[1] && tests[1] == tests[2] ? "" : "not ");
+    for (auto rect : tests) {
+        debugster(rect);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_022.cpp b/docs/examples/Rect_022.cpp
new file mode 100644
index 0000000..88662e5
--- /dev/null
+++ b/docs/examples/Rect_022.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=286072f8c27ff15be9eb945fa38dc9f7
+REG_FIDDLE(Rect_022, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect test = {0, 0, 2, SK_ScalarNaN};
+    SkDebugf("test with NaN is %s" "equal to itself\n", test == test ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_023.cpp b/docs/examples/Rect_023.cpp
new file mode 100644
index 0000000..8552295
--- /dev/null
+++ b/docs/examples/Rect_023.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=59a6e7d202ac17ab80ec21b233e51f59
+REG_FIDDLE(Rect_023, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = {1, 2, 3, 4};
+    SkPoint corners[4];
+    rect.toQuad(corners);
+    SkDebugf("rect: {%g, %g, %g, %g}\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    SkDebugf("corners:");
+    for (auto corner : corners) {
+        SkDebugf(" {%g, %g}", corner.fX, corner.fY);
+    }
+    SkDebugf("\n");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_024.cpp b/docs/examples/Rect_024.cpp
new file mode 100644
index 0000000..cadc0e7
--- /dev/null
+++ b/docs/examples/Rect_024.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cf0da15f48aa54fd1889e7f913601710
+REG_FIDDLE(Rect_024, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}};
+    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {
+        SkRect rect;
+        rect.setBounds(points, count);
+        if (count > 0) {
+            SkDebugf("added: %3g, %g ", points[count - 1].fX,  points[count - 1].fY);
+        } else {
+            SkDebugf("%14s", " ");
+        }
+        SkDebugf("count: %d rect: %g, %g, %g, %g\n", count,
+                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_025.cpp b/docs/examples/Rect_025.cpp
new file mode 100644
index 0000000..bc5df81
--- /dev/null
+++ b/docs/examples/Rect_025.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=83d879b92683b15f9daaf0c9e71c5b35
+REG_FIDDLE(Rect_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}};
+    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {
+        SkRect rect;
+        bool success = rect.setBoundsCheck(points, count);
+        if (count > 0) {
+            SkDebugf("added: %3g, %g ", points[count - 1].fX,  points[count - 1].fY);
+        } else {
+            SkDebugf("%14s", " ");
+        }
+        SkDebugf("count: %d rect: %g, %g, %g, %g success: %s\n", count,
+                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom, success ? "true" : "false");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_026.cpp b/docs/examples/Rect_026.cpp
new file mode 100644
index 0000000..637a174
--- /dev/null
+++ b/docs/examples/Rect_026.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=be10cb1411dbcf7e38e0198e8a9b8b0e
+REG_FIDDLE(Rect_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint points[] = {{3, 4}, {1, 2}, {SK_ScalarInfinity, 6}, {SK_ScalarNaN, 8}};
+    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {
+        SkRect rect;
+        rect.setBoundsNoCheck(points, count);
+        if (count > 0) {
+            SkDebugf("added: %3g, %g ", points[count - 1].fX,  points[count - 1].fY);
+        } else {
+            SkDebugf("%14s", " ");
+        }
+        SkDebugf("count: %d rect: %g, %g, %g, %g\n", count,
+                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_027.cpp b/docs/examples/Rect_027.cpp
new file mode 100644
index 0000000..84ea41a
--- /dev/null
+++ b/docs/examples/Rect_027.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2cf67542d45ef5d7a7efb673b651ff54
+REG_FIDDLE(Rect_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = {3, 4, 1, 2};
+    for (int i = 0; i < 2; ++i) {
+    SkDebugf("rect: {%g, %g, %g, %g} is %s" "empty\n", rect.fLeft, rect.fTop,
+             rect.fRight, rect.fBottom, rect.isEmpty() ? "" : "not ");
+    rect.setEmpty();
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_028.cpp b/docs/examples/Rect_028.cpp
new file mode 100644
index 0000000..9e67802
--- /dev/null
+++ b/docs/examples/Rect_028.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a10ad8d97062bc3f40942f47e5108917
+REG_FIDDLE(Rect_028, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect i_rect = {3, 4, 1, 2};
+    SkDebugf("i_rect: {%d, %d, %d, %d}\n", i_rect.fLeft, i_rect.fTop, i_rect.fRight, i_rect.fBottom);
+    SkRect f_rect;
+    f_rect.set(i_rect);
+    SkDebugf("f_rect: {%g, %g, %g, %g}\n", f_rect.fLeft, f_rect.fTop, f_rect.fRight, f_rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_029.cpp b/docs/examples/Rect_029.cpp
new file mode 100644
index 0000000..0f467b1
--- /dev/null
+++ b/docs/examples/Rect_029.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9b29ea460d69b4d47323fd9e3e17721e
+REG_FIDDLE(Rect_029, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect1 = {3, 4, 1, 2};
+    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
+    SkRect rect2;
+    rect2.set(3, 4, 1, 2);
+    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_030.cpp b/docs/examples/Rect_030.cpp
new file mode 100644
index 0000000..ee2f6dd
--- /dev/null
+++ b/docs/examples/Rect_030.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=70692838793454c8e045d6eaf7edcbff
+REG_FIDDLE(Rect_030, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect1 = {3, 4, 1, 2};
+    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
+    SkRect rect2;
+    rect2.setLTRB(3, 4, 1, 2);
+    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_031.cpp b/docs/examples/Rect_031.cpp
new file mode 100644
index 0000000..26a324a
--- /dev/null
+++ b/docs/examples/Rect_031.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=94295fa5197e21256171b99b4023dd48
+REG_FIDDLE(Rect_031, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint points[] = {{3, 4}, {1, 2}, {5, 6}, {SK_ScalarNaN, 8}};
+    for (int count = 0; count <= (int) SK_ARRAY_COUNT(points); ++count) {
+        SkRect rect;
+        rect.set(points, count);
+        if (count > 0) {
+            SkDebugf("added: %3g, %g ", points[count - 1].fX,  points[count - 1].fY);
+        } else {
+            SkDebugf("%14s", " ");
+        }
+        SkDebugf("count: %d rect: %g, %g, %g, %g\n", count,
+                rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_032.cpp b/docs/examples/Rect_032.cpp
new file mode 100644
index 0000000..ffca256
--- /dev/null
+++ b/docs/examples/Rect_032.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ee72450381f768f3869153cdbeccdc3e
+REG_FIDDLE(Rect_032, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkPoint point1 = {SK_ScalarNaN, 8};
+    SkPoint point2 = {3, 4};
+    SkRect rect;
+    rect.set(point1, point2);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    rect.set(point2, point1);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_033.cpp b/docs/examples/Rect_033.cpp
new file mode 100644
index 0000000..93205fe
--- /dev/null
+++ b/docs/examples/Rect_033.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=373cce4c61b9da0384b735b838765163
+REG_FIDDLE(Rect_033, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect;
+    rect.setXYWH(5, 35, -15, 25);
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect.sort();
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_034.cpp b/docs/examples/Rect_034.cpp
new file mode 100644
index 0000000..3a84c55
--- /dev/null
+++ b/docs/examples/Rect_034.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9cb5fee17802fa49341f3707bdf5d235
+REG_FIDDLE(Rect_034, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect;
+    rect.setWH(-15, 25);
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect.sort();
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_035.cpp b/docs/examples/Rect_035.cpp
new file mode 100644
index 0000000..6251d56
--- /dev/null
+++ b/docs/examples/Rect_035.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=18532f1aa90b76364fb8d7ea072f1892
+REG_FIDDLE(Rect_035, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect1 = {3, 4, 1, 2};
+    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
+    SkRect rect2;
+    rect2.iset(3, 4, 1, 2);
+    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_036.cpp b/docs/examples/Rect_036.cpp
new file mode 100644
index 0000000..98ecd53
--- /dev/null
+++ b/docs/examples/Rect_036.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ee6000080fc7123214ea404018cf9176
+REG_FIDDLE(Rect_036, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect1 = {0, 0, 1, 2};
+    SkDebugf("rect1: {%g, %g, %g, %g}\n", rect1.fLeft, rect1.fTop, rect1.fRight, rect1.fBottom);
+    SkRect rect2;
+    rect2.isetWH(1, 2);
+    SkDebugf("rect2: {%g, %g, %g, %g}\n", rect2.fLeft, rect2.fTop, rect2.fRight, rect2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_037.cpp b/docs/examples/Rect_037.cpp
new file mode 100644
index 0000000..21602d8
--- /dev/null
+++ b/docs/examples/Rect_037.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=98841ab0a932f99cccd8e6a34d94ba05
+REG_FIDDLE(Rect_037, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 50, 20, 60 };
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect = rect.makeOffset(15, 32);
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_038.cpp b/docs/examples/Rect_038.cpp
new file mode 100644
index 0000000..2c6c54c
--- /dev/null
+++ b/docs/examples/Rect_038.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b8d32ab2f7ea3d4d5fb5a4ea2156f1c5
+REG_FIDDLE(Rect_038, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 50, 20, 60 };
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect = rect.makeInset(15, 32);
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_039.cpp b/docs/examples/Rect_039.cpp
new file mode 100644
index 0000000..e2b73bd
--- /dev/null
+++ b/docs/examples/Rect_039.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=87176fc60914cbca9c6a20998a033c24
+REG_FIDDLE(Rect_039, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 50, 20, 60 };
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+    rect = rect.makeOutset(15, 32);
+    SkDebugf("rect: %g, %g, %g, %g  isEmpty: %s\n", rect.left(), rect.top(), rect.right(),
+              rect.bottom(), rect.isEmpty() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_040.cpp b/docs/examples/Rect_040.cpp
new file mode 100644
index 0000000..e4844ae
--- /dev/null
+++ b/docs/examples/Rect_040.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=04eb33f0fd376f2942ca5f1c7f6cbcfc
+REG_FIDDLE(Rect_040, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 14, 50, 73 };
+    rect.offset(5, 13);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_041.cpp b/docs/examples/Rect_041.cpp
new file mode 100644
index 0000000..4c825a4
--- /dev/null
+++ b/docs/examples/Rect_041.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b24cf65561c98c1858a06c39f10fb797
+REG_FIDDLE(Rect_041, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 14, 50, 73 };
+    rect.offset({5, 13});
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_042.cpp b/docs/examples/Rect_042.cpp
new file mode 100644
index 0000000..a7e47f5
--- /dev/null
+++ b/docs/examples/Rect_042.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bedb04b7b3e1af3e8039f9cffe66989e
+REG_FIDDLE(Rect_042, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 14, 50, 73 };
+    rect.offsetTo(15, 27);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_043.cpp b/docs/examples/Rect_043.cpp
new file mode 100644
index 0000000..4bb4ecc
--- /dev/null
+++ b/docs/examples/Rect_043.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dae21340941dc6e4d048816dfd9f204c
+REG_FIDDLE(Rect_043, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 14, 50, 73 };
+    rect.inset(5, 13);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_044.cpp b/docs/examples/Rect_044.cpp
new file mode 100644
index 0000000..aa131c5
--- /dev/null
+++ b/docs/examples/Rect_044.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=861f873ba660af8c8bf8b0b83d829cf4
+REG_FIDDLE(Rect_044, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 14, 50, 73 };
+    rect.outset(5, 13);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_045.cpp b/docs/examples/Rect_045.cpp
new file mode 100644
index 0000000..257b85b
--- /dev/null
+++ b/docs/examples/Rect_045.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=85be528a78945a6dc4f7dccb80a80746
+REG_FIDDLE(Rect_045, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30, 50, 40, 60 };
+    SkPoint tests[] = { { 30, 50 }, { 39, 49 }, { 29, 59 } };
+    for (auto contained : tests) {
+        SkDebugf("rect: (%g, %g, %g, %g) %s (%g, %g)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 rect.contains(contained.x(), contained.y()) ? "contains" : "does not contain",
+                 contained.x(), contained.y());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_046.cpp b/docs/examples/Rect_046.cpp
new file mode 100644
index 0000000..56d3971
--- /dev/null
+++ b/docs/examples/Rect_046.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=92f9e6aa5bb76791139a24cf7d8df99e
+REG_FIDDLE(Rect_046, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30, 50, 40, 60 };
+    SkRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
+    for (auto contained : tests) {
+        SkDebugf("rect: (%g, %g, %g, %g) %s (%g, %g, %g, %g)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 rect.contains(contained) ? "contains" : "does not contain",
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_047.cpp b/docs/examples/Rect_047.cpp
new file mode 100644
index 0000000..19be5cd
--- /dev/null
+++ b/docs/examples/Rect_047.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=dd58b699551dd44026a2c6386be27d88
+REG_FIDDLE(Rect_047, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30, 50, 40, 60 };
+    SkIRect tests[] = { { 30, 50, 31, 51}, { 39, 49, 40, 50}, { 29, 59, 30, 60} };
+    for (auto contained : tests) {
+        SkDebugf("rect: (%g, %g, %g, %g) %s (%d, %d, %d, %d)\n",
+                 rect.left(), rect.top(), rect.right(), rect.bottom(),
+                 rect.contains(contained) ? "contains" : "does not contain",
+                 contained.left(), contained.top(), contained.right(), contained.bottom());
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_048.cpp b/docs/examples/Rect_048.cpp
new file mode 100644
index 0000000..f70f863
--- /dev/null
+++ b/docs/examples/Rect_048.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5d0b12e0ef6f1c181dddded4274230ca
+REG_FIDDLE(Rect_048, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect leftRect =  { 10, 40, 50, 80 };
+    SkRect rightRect = { 30, 60, 70, 90 };
+    SkDebugf("%s intersection: ", leftRect.intersect(rightRect) ? "" : "no ");
+    SkDebugf("%g, %g, %g, %g\n", leftRect.left(), leftRect.top(),
+                                 leftRect.right(), leftRect.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_049.cpp b/docs/examples/Rect_049.cpp
new file mode 100644
index 0000000..c8b0b53
--- /dev/null
+++ b/docs/examples/Rect_049.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5002f65a72def2787086a33131933e70
+REG_FIDDLE(Rect_049, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect leftRect =  { 10, 40, 50, 80 };
+    SkDebugf("%s intersection: ", leftRect.intersect(30, 60, 70, 90) ? "" : "no ");
+    SkDebugf("%g, %g, %g, %g\n", leftRect.left(), leftRect.top(),
+                                 leftRect.right(), leftRect.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_050.cpp b/docs/examples/Rect_050.cpp
new file mode 100644
index 0000000..8a3d503
--- /dev/null
+++ b/docs/examples/Rect_050.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d610437a65dd3e952719efe605cbd0c7
+REG_FIDDLE(Rect_050, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect result;
+    bool intersected = result.intersect({ 10, 40, 50, 80 }, { 30, 60, 70, 90 });
+    SkDebugf("%s intersection: %g, %g, %g, %g\n", intersected ? "" : "no ",
+             result.left(), result.top(), result.right(), result.bottom());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_051.cpp b/docs/examples/Rect_051.cpp
new file mode 100644
index 0000000..192f02c
--- /dev/null
+++ b/docs/examples/Rect_051.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=7145dc17ebce4f54e892102f6c98e811
+REG_FIDDLE(Rect_051, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 40, 50, 80 };
+    SkDebugf("%s intersection", rect.intersects(30, 60, 70, 90) ? "" : "no ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_052.cpp b/docs/examples/Rect_052.cpp
new file mode 100644
index 0000000..fe43bb7
--- /dev/null
+++ b/docs/examples/Rect_052.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ca37b4231b21eb8296cb19ba9e0c781b
+REG_FIDDLE(Rect_052, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 40, 50, 80 };
+    SkDebugf("%s intersection", rect.intersects({30, 60, 70, 90}) ? "" : "no ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_053.cpp b/docs/examples/Rect_053.cpp
new file mode 100644
index 0000000..a9cbb37
--- /dev/null
+++ b/docs/examples/Rect_053.cpp
@@ -0,0 +1,9 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=795061764b10c9e05efb466c9cb60644
+REG_FIDDLE(Rect_053, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("%s intersection", SkRect::Intersects({10, 40, 50, 80}, {30, 60, 70, 90}) ? "" : "no ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_054.cpp b/docs/examples/Rect_054.cpp
new file mode 100644
index 0000000..0dae35d
--- /dev/null
+++ b/docs/examples/Rect_054.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=afa9c6b4d05bb669db07fe0b7b97e6aa
+REG_FIDDLE(Rect_054, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 20, 15, 25};
+    rect.join(50, 60, 55, 65);
+    SkDebugf("join: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_055.cpp b/docs/examples/Rect_055.cpp
new file mode 100644
index 0000000..b91ff5a
--- /dev/null
+++ b/docs/examples/Rect_055.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=26500032494cf93c5fa3423110fe82af
+REG_FIDDLE(Rect_055, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 20, 15, 25};
+    rect.join({50, 60, 55, 65});
+    SkDebugf("join: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_056.cpp b/docs/examples/Rect_056.cpp
new file mode 100644
index 0000000..58f8069
--- /dev/null
+++ b/docs/examples/Rect_056.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=88439de2aa0911262c60c0eb506396cb
+REG_FIDDLE(Rect_056, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 100, 15, 0};
+    SkRect sorted = rect.makeSorted();
+    SkRect toJoin = { 50, 60, 55, 65 };
+    rect.joinNonEmptyArg(toJoin);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    sorted.joinNonEmptyArg(toJoin);
+    SkDebugf("sorted: %g, %g, %g, %g\n", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_057.cpp b/docs/examples/Rect_057.cpp
new file mode 100644
index 0000000..26a5116
--- /dev/null
+++ b/docs/examples/Rect_057.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a476548d0001296afd8e58c1eba1b70b
+REG_FIDDLE(Rect_057, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 10, 100, 15, 0};
+    SkRect sorted = rect.makeSorted();
+    SkRect toJoin = { 50, 60, 55, 65 };
+    rect.joinPossiblyEmptyRect(toJoin);
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    sorted.joinPossiblyEmptyRect(toJoin);
+    SkDebugf("sorted: %g, %g, %g, %g\n", sorted.fLeft, sorted.fTop, sorted.fRight, sorted.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_058.cpp b/docs/examples/Rect_058.cpp
new file mode 100644
index 0000000..865746a
--- /dev/null
+++ b/docs/examples/Rect_058.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8b9e5a9af0a9b878f76919534d88f41e
+REG_FIDDLE(Rect_058, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
+    SkIRect round;
+    rect.round(&round);
+    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_059.cpp b/docs/examples/Rect_059.cpp
new file mode 100644
index 0000000..8471e05
--- /dev/null
+++ b/docs/examples/Rect_059.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0bd13d7e6426ae7a3befa2ab151ac5fc
+REG_FIDDLE(Rect_059, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
+    SkIRect round;
+    rect.roundOut(&round);
+    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_060.cpp b/docs/examples/Rect_060.cpp
new file mode 100644
index 0000000..a59f28d
--- /dev/null
+++ b/docs/examples/Rect_060.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e09a6a12869a8ac21e9c2af98a5bb686
+REG_FIDDLE(Rect_060, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
+    SkRect round;
+    rect.roundOut(&round);
+    SkDebugf("round: %g, %g, %g, %g\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_061.cpp b/docs/examples/Rect_061.cpp
new file mode 100644
index 0000000..2c3918b
--- /dev/null
+++ b/docs/examples/Rect_061.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=abb337da8fc1891f016c61258681c64c
+REG_FIDDLE(Rect_061, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
+    SkIRect round;
+    rect.roundIn(&round);
+    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_062.cpp b/docs/examples/Rect_062.cpp
new file mode 100644
index 0000000..3515b4c
--- /dev/null
+++ b/docs/examples/Rect_062.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ef7ae1dd522c235b0afe41b55a624f46
+REG_FIDDLE(Rect_062, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
+    SkIRect round = rect.round();
+    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_063.cpp b/docs/examples/Rect_063.cpp
new file mode 100644
index 0000000..1d0533a
--- /dev/null
+++ b/docs/examples/Rect_063.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=05f0f65ae148f192656cd87df90f1d57
+REG_FIDDLE(Rect_063, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 40.5f, 60.5f };
+    SkIRect round = rect.roundOut();
+    SkDebugf("round: %d, %d, %d, %d\n", round.fLeft, round.fTop, round.fRight, round.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_064.cpp b/docs/examples/Rect_064.cpp
new file mode 100644
index 0000000..ee65434
--- /dev/null
+++ b/docs/examples/Rect_064.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e624fe398e3d770b573c09fc74c0c400
+REG_FIDDLE(Rect_064, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f };
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    rect.sort();
+    SkDebugf("sorted: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_065.cpp b/docs/examples/Rect_065.cpp
new file mode 100644
index 0000000..aa255e2
--- /dev/null
+++ b/docs/examples/Rect_065.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f59567042b87f6b26f9bfeeb04468032
+REG_FIDDLE(Rect_065, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = { 30.5f, 50.5f, 20.5f, 10.5f };
+    SkDebugf("rect: %g, %g, %g, %g\n", rect.fLeft, rect.fTop, rect.fRight, rect.fBottom);
+    SkRect sort = rect.makeSorted();
+    SkDebugf("sorted: %g, %g, %g, %g\n", sort.fLeft, sort.fTop, sort.fRight, sort.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_066.cpp b/docs/examples/Rect_066.cpp
new file mode 100644
index 0000000..9eedba6
--- /dev/null
+++ b/docs/examples/Rect_066.cpp
@@ -0,0 +1,10 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e1ea5f949d80276f3637931eae93a07c
+REG_FIDDLE(Rect_066, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = {7, 11, 13, 17};
+ SkDebugf("rect.asScalars() %c= &rect.fLeft\n", rect.asScalars() == &rect.fLeft? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_067.cpp b/docs/examples/Rect_067.cpp
new file mode 100644
index 0000000..5b74af7
--- /dev/null
+++ b/docs/examples/Rect_067.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=cea049ffff702a5923da41fe0ae0763b
+REG_FIDDLE(Rect_067, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = {20, 30, 40, 50};
+     for (bool dumpAsHex : { false, true } ) {
+         rect.dump(dumpAsHex);
+         SkDebugf("\n");
+     }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_068.cpp b/docs/examples/Rect_068.cpp
new file mode 100644
index 0000000..18c89fc
--- /dev/null
+++ b/docs/examples/Rect_068.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9fb76971b1a104a2a59816e0392267a7
+REG_FIDDLE(Rect_068, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6};
+    rect.dump();
+    SkRect copy = SkRect::MakeLTRB(0.857143f, 0.666667f, 2.6f, 7);
+    SkDebugf("rect is " "%s" "equal to copy\n", rect == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Rect_069.cpp b/docs/examples/Rect_069.cpp
new file mode 100644
index 0000000..51c76fb
--- /dev/null
+++ b/docs/examples/Rect_069.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=824b5a3fcfd46a7e1c5f9e3c16e6bb39
+REG_FIDDLE(Rect_069, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRect rect = {6.f / 7, 2.f / 3, 26.f / 10, 42.f / 6};
+ rect.dumpHex();
+ SkRect copy = SkRect::MakeLTRB(SkBits2Float(0x3f5b6db7), /* 0.857143 */
+                  SkBits2Float(0x3f2aaaab), /* 0.666667 */
+                  SkBits2Float(0x40266666), /* 2.600000 */
+                  SkBits2Float(0x40e00000)  /* 7.000000 */);
+ SkDebugf("rect is " "%s" "equal to copy\n", rect == copy ? "" : "not ");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_000.cpp b/docs/examples/Region_000.cpp
new file mode 100644
index 0000000..be8c252
--- /dev/null
+++ b/docs/examples/Region_000.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a2db43ee3cbf6893e9b23927fb44298a
+REG_FIDDLE(Region_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion::Iterator iter;
+    SkRegion region;
+    region.setRect({1, 2, 3, 4});
+    iter.reset(region);
+    auto r = iter.rect();
+    SkDebugf("rect={%d,%d,%d,%d}\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_001.cpp b/docs/examples/Region_001.cpp
new file mode 100644
index 0000000..bfb899f
--- /dev/null
+++ b/docs/examples/Region_001.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e317ceca48a6a7504219af58f35d2c95
+REG_FIDDLE(Region_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    region.setRect({1, 2, 3, 4});
+    SkRegion::Iterator iter(region);
+    auto r = iter.rect();
+    SkDebugf("rect={%d,%d,%d,%d}\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_002.cpp b/docs/examples/Region_002.cpp
new file mode 100644
index 0000000..800bfd0
--- /dev/null
+++ b/docs/examples/Region_002.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=32d51e959d6cc720a74ec4822511e2cd
+REG_FIDDLE(Region_002, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion::Iterator& iter, bool addRewind) -> void {
+        if (addRewind) {
+            bool success = iter.rewind();
+            SkDebugf("%14s rewind success=%s\n", label, success ? "true" : "false");
+        }
+        auto r = iter.rect();
+        SkDebugf("%14s rect={%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion::Iterator iter;
+    debugster("empty iter", iter, true);
+    SkRegion region;
+    iter.reset(region);
+    debugster("empty region", iter, true);
+    region.setRect({1, 2, 3, 4});
+    iter.reset(region);
+    debugster("after set rect", iter, false);
+    debugster("after rewind", iter, true);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_003.cpp b/docs/examples/Region_003.cpp
new file mode 100644
index 0000000..01c02ce
--- /dev/null
+++ b/docs/examples/Region_003.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d153f87bd518a4ab947b7e407ea1db79
+REG_FIDDLE(Region_003, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion::Iterator& iter) -> void {
+        SkDebugf("%14s: done=%s\n", label, iter.done() ? "true" : "false");
+    };
+    SkRegion region;
+    SkRegion::Iterator iter(region);
+    debugster("empty region", iter);
+    region.setRect({1, 2, 3, 4});
+    debugster("after set rect", iter);
+    iter.reset(region);
+    debugster("after reset", iter);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_004.cpp b/docs/examples/Region_004.cpp
new file mode 100644
index 0000000..341b53a
--- /dev/null
+++ b/docs/examples/Region_004.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=814efa7d7f4ae52dfc861a937c1b5c25
+REG_FIDDLE(Region_004, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    SkRegion::Iterator iter(region);
+    SkDebugf("done=%s\n", iter.done() ? "true" : "false");
+    region.setRect({1, 2, 3, 4});
+    iter.rewind();
+    SkDebugf("done=%s\n", iter.done() ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_005.cpp b/docs/examples/Region_005.cpp
new file mode 100644
index 0000000..e6279fb
--- /dev/null
+++ b/docs/examples/Region_005.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=771236c2eadfc2fcd02a3e61a0875d39
+REG_FIDDLE(Region_005, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    SkIRect rects[] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
+    region.setRects(rects, SK_ARRAY_COUNT(rects));
+    SkRegion::Iterator iter(region);
+    do {
+        auto r2 = iter.rect();
+        SkDebugf("rect={%d,%d,%d,%d}\n", r2.fLeft, r2.fTop, r2.fRight, r2.fBottom);
+        iter.next();
+    } while (!iter.done());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_006.cpp b/docs/examples/Region_006.cpp
new file mode 100644
index 0000000..8474fbc
--- /dev/null
+++ b/docs/examples/Region_006.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0e7c58ab5d3bcfb36b1f8464cf6c7d89
+REG_FIDDLE(Region_006, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    SkRegion::Iterator iter(region);
+    auto r1 = iter.rect();
+    SkDebugf("rect={%d,%d,%d,%d}\n", r1.fLeft, r1.fTop, r1.fRight, r1.fBottom);
+    region.setRect({1, 2, 3, 4});
+    iter.rewind();
+    auto r2 = iter.rect();
+    SkDebugf("rect={%d,%d,%d,%d}\n", r2.fLeft, r2.fTop, r2.fRight, r2.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_007.cpp b/docs/examples/Region_007.cpp
new file mode 100644
index 0000000..ffab575
--- /dev/null
+++ b/docs/examples/Region_007.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bbc3c454a21186e2a16e843a5b061c44
+REG_FIDDLE(Region_007, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    SkIRect rects[] = {{1, 2, 3, 4}, {3, 4, 5, 6}};
+    region.setRects(rects, SK_ARRAY_COUNT(rects));
+    SkRegion::Iterator iter(region);
+    auto r = iter.rect();
+    SkDebugf("rect={%d,%d,%d,%d}\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+    auto b = iter.rgn()->getBounds();
+    SkDebugf("bounds={%d,%d,%d,%d}\n", b.fLeft, b.fTop, b.fRight, b.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_008.cpp b/docs/examples/Region_008.cpp
new file mode 100644
index 0000000..90d38c6
--- /dev/null
+++ b/docs/examples/Region_008.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3831fb6006a7e0ad5d140c266c22be78
+REG_FIDDLE(Region_008, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    region.setRect({1, 2, 3, 4});
+    SkRegion::Cliperator clipper(region, {0, 0, 2, 3});
+    auto r = clipper.rect();
+    SkDebugf("rect={%d,%d,%d,%d}\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_009.cpp b/docs/examples/Region_009.cpp
new file mode 100644
index 0000000..b824aa9
--- /dev/null
+++ b/docs/examples/Region_009.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6cca7b96836266800d852664a1366453
+REG_FIDDLE(Region_009, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        SkRegion::Cliperator clipper(region, {0, 0, 5, 5});
+        SkDebugf("%14s done=%s\n", label, clipper.done() ? "true" : "false");
+    };
+    SkRegion region;
+    debugster("empty region", region);
+    region.setRect({1, 2, 3, 4});
+    debugster("after add rect", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_010.cpp b/docs/examples/Region_010.cpp
new file mode 100644
index 0000000..ee3e7a2
--- /dev/null
+++ b/docs/examples/Region_010.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3bbcc7eec19c808a8167bbcc987199f8
+REG_FIDDLE(Region_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    SkIRect rects[] = {{1, 2, 3, 4}, {5, 6, 7, 8}};
+    region.setRects(rects, SK_ARRAY_COUNT(rects));
+    SkRegion::Cliperator clipper(region, {0, 3, 8, 7});
+    do {
+        auto r2 = clipper.rect();
+        SkDebugf("rect={%d,%d,%d,%d}\n", r2.fLeft, r2.fTop, r2.fRight, r2.fBottom);
+        clipper.next();
+    } while (!clipper.done());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_011.cpp b/docs/examples/Region_011.cpp
new file mode 100644
index 0000000..652bfb5
--- /dev/null
+++ b/docs/examples/Region_011.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=05791751f00b4c2426093fa143b43bc7
+REG_FIDDLE(Region_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        SkRegion::Cliperator clipper(region, {0, 0, 5, 3});
+        auto r = clipper.rect();
+        SkDebugf("%14s rect={%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region;
+    debugster("empty region", region);
+    region.setRect({1, 2, 3, 4});
+    debugster("after set rect", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_012.cpp b/docs/examples/Region_012.cpp
new file mode 100644
index 0000000..7b146bd
--- /dev/null
+++ b/docs/examples/Region_012.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3073b3f8ea7252871b6156ff674dc385
+REG_FIDDLE(Region_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    region.setRect({1, 2, 3, 4});
+    SkRegion::Spanerator spanner(region, 3, 2, 4);
+    int left, right;
+    bool result = spanner.next(&left, &right);
+    SkDebugf("result=%s left=%d right=%d\n", result ? "true" : "false", left, right);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_013.cpp b/docs/examples/Region_013.cpp
new file mode 100644
index 0000000..08a7d45
--- /dev/null
+++ b/docs/examples/Region_013.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=03d02180fee5f64ec4a3347e118fb2ec
+REG_FIDDLE(Region_013, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        SkRegion::Spanerator spanner(region, 3, 2, 4);
+        int left, right;
+        bool result = spanner.next(&left, &right);
+        SkDebugf("%14s: result=%s", label, result ? "true" : "false");
+        if (result) SkDebugf(" left=%d right=%d", left, right);
+        SkDebugf("\n");
+    };
+    SkRegion region;
+    debugster("empty region", region);
+    region.setRect({1, 2, 3, 4});
+    debugster("after set rect", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_014.cpp b/docs/examples/Region_014.cpp
new file mode 100644
index 0000000..8c6d277
--- /dev/null
+++ b/docs/examples/Region_014.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4549dcda3e0f9a41b3daee0ed37deca8
+REG_FIDDLE(Region_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    SkIRect r = region.getBounds();
+    SkDebugf("region bounds: {%d, %d, %d, %d}\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_015.cpp b/docs/examples/Region_015.cpp
new file mode 100644
index 0000000..c2dc0d3
--- /dev/null
+++ b/docs/examples/Region_015.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3daa83fca809b9ec6560d2ef9e2da5e6
+REG_FIDDLE(Region_015, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        auto r = region.getBounds();
+        SkDebugf("%14s: {%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region({1, 2, 3, 4});
+    SkRegion region2(region);
+    debugster("region bounds", region);
+    debugster("region2 bounds", region2);
+    region.setEmpty();
+    SkDebugf("    after region set empty:\n");
+    debugster("region bounds", region);
+    debugster("region2 bounds", region2);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_016.cpp b/docs/examples/Region_016.cpp
new file mode 100644
index 0000000..529925a
--- /dev/null
+++ b/docs/examples/Region_016.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5253910233f7961c30b4c18ab911e917
+REG_FIDDLE(Region_016, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region({1, 2, 3, 4});
+    SkRegion region2;
+    region2.setRect({1, 2, 3, 4});
+    SkDebugf("region %c= region2\n", region == region2 ? '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_017.cpp b/docs/examples/Region_017.cpp
new file mode 100644
index 0000000..a9f8317
--- /dev/null
+++ b/docs/examples/Region_017.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=985ff654a6b67288d322c748132a088e
+REG_FIDDLE(Region_017, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion* region = new SkRegion({1, 2, 3, 4});
+    SkRegion region2(*region);
+    delete region;
+    auto r = region2.getBounds();
+    SkDebugf("region2 bounds: {%d,%d,%d,%d}\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_018.cpp b/docs/examples/Region_018.cpp
new file mode 100644
index 0000000..e6c5104
--- /dev/null
+++ b/docs/examples/Region_018.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e8513f6394c24efaa301d41921c5241a
+REG_FIDDLE(Region_018, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        auto r = region.getBounds();
+        SkDebugf("%14s: {%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region1({1, 2, 3, 4});
+    SkRegion region2 = region1;
+    debugster("region1 bounds", region1);
+    debugster("region2 bounds", region2);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_019.cpp b/docs/examples/Region_019.cpp
new file mode 100644
index 0000000..5b40e7e
--- /dev/null
+++ b/docs/examples/Region_019.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d7f4fdc8bc63ca8410ed166ecef0aef3
+REG_FIDDLE(Region_019, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkRegion& a, const SkRegion& b) -> void {
+                SkDebugf("%s one %c= two\n", prefix, a == b ? '=' : '!');
+    };
+    SkRegion one;
+    SkRegion two;
+    debugster("empty", one, two);
+    one.setRect({1, 2, 3, 4});
+    debugster("set rect", one, two);
+    one.setEmpty();
+    debugster("set empty", one, two);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_020.cpp b/docs/examples/Region_020.cpp
new file mode 100644
index 0000000..8e6e961
--- /dev/null
+++ b/docs/examples/Region_020.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3357caa9d8d810f200cbccb668182496
+REG_FIDDLE(Region_020, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* prefix, const SkRegion& a, const SkRegion& b) -> void {
+                SkDebugf("%s one %c= two\n", prefix, a != b ? '!' : '=');
+    };
+    SkRegion one;
+    SkRegion two;
+    debugster("empty", one, two);
+    one.setRect({1, 2, 3, 4});
+    two.setRect({1, 2, 3, 3});
+    debugster("set rect", one, two);
+    two.op({1, 3, 3, 4}, SkRegion::kUnion_Op);
+    debugster("union rect", one, two);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_021.cpp b/docs/examples/Region_021.cpp
new file mode 100644
index 0000000..692bcd3
--- /dev/null
+++ b/docs/examples/Region_021.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b3538117c7ae2cb7de3b42ca45fe1b13
+REG_FIDDLE(Region_021, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        auto r = region.getBounds();
+        SkDebugf("%14s: {%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region1({1, 2, 3, 4});
+    SkRegion region2;
+    region2.set(region1);
+    debugster("region1 bounds", region1);
+    debugster("region2 bounds", region2);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_022.cpp b/docs/examples/Region_022.cpp
new file mode 100644
index 0000000..f4bcdc9
--- /dev/null
+++ b/docs/examples/Region_022.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=ae67b7b4c198b46c58e48f5af061c8f1
+REG_FIDDLE(Region_022, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        auto r = region.getBounds();
+        SkDebugf("%14s: {%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region1({1, 2, 3, 4});
+    SkRegion region2;
+    region1.swap(region2);
+    debugster("region1 bounds", region1);
+    debugster("region2 bounds", region2);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_023.cpp b/docs/examples/Region_023.cpp
new file mode 100644
index 0000000..1be6875
--- /dev/null
+++ b/docs/examples/Region_023.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=10ef0de39e8553dd97cf8668ce185070
+REG_FIDDLE(Region_023, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        SkDebugf("%14s: region is %s" "empty\n", label, region.isEmpty() ? "" : "not ");
+    };
+    SkRegion region;
+    debugster("initial", region);
+    region.setRect({1, 2, 3, 4});
+    debugster("set rect", region);
+    region.setEmpty();
+    debugster("set empty", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_024.cpp b/docs/examples/Region_024.cpp
new file mode 100644
index 0000000..d43c7ae
--- /dev/null
+++ b/docs/examples/Region_024.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b6adbdddf7fe45a1098121c4e5fd57ea
+REG_FIDDLE(Region_024, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, const SkRegion& region) -> void {
+                SkDebugf("%s: region is %s" "rect\n", label, region.isRect() ? "" : "not ");
+    };
+    SkRegion region;
+    debugster("initial", region);
+    region.setRect({1, 2, 3, 4});
+    debugster("set rect", region);
+    region.setEmpty();
+    debugster("set empty", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_025.cpp b/docs/examples/Region_025.cpp
new file mode 100644
index 0000000..bd192c3
--- /dev/null
+++ b/docs/examples/Region_025.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1fbd76d75ca2d280e81856311de4e54e
+REG_FIDDLE(Region_025, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, const SkRegion& region) -> void {
+                SkDebugf("%s: region is %s" "complex\n", label, region.isComplex() ? "" : "not ");
+    };
+    SkRegion region;
+    debugster("initial", region);
+    region.setRect({1, 2, 3, 4});
+    debugster("set rect", region);
+    region.op({2, 3, 4, 5}, SkRegion::kUnion_Op);
+    debugster("op rect", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_026.cpp b/docs/examples/Region_026.cpp
new file mode 100644
index 0000000..0dcb409
--- /dev/null
+++ b/docs/examples/Region_026.cpp
@@ -0,0 +1,12 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=651632582d385d2531e7aa551c31e331
+REG_FIDDLE(Region_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region({1, 2, 3, 4});
+    region.op({2, 3, 4, 5}, SkRegion::kUnion_Op);
+    auto r = region.getBounds();
+    SkDebugf("bounds: {%d,%d,%d,%d}\n", r.fLeft, r.fTop, r.fRight, r.fBottom);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_027.cpp b/docs/examples/Region_027.cpp
new file mode 100644
index 0000000..f0dbe4a
--- /dev/null
+++ b/docs/examples/Region_027.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c4984fefdcecdd1090be160f80939d87
+REG_FIDDLE(Region_027, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, const SkRegion& region) -> void {
+                SkDebugf("%s: region complexity %d\n", label, region.computeRegionComplexity());
+    };
+    SkRegion region;
+    debugster("initial", region);
+    region.setRect({1, 2, 3, 4});
+    debugster("set rect", region);
+    region.op({2, 3, 4, 5}, SkRegion::kUnion_Op);
+    debugster("op rect", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_028.cpp b/docs/examples/Region_028.cpp
new file mode 100644
index 0000000..5cf216f
--- /dev/null
+++ b/docs/examples/Region_028.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6631d36406efa3b3e27960c876421a7f
+REG_FIDDLE(Region_028, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region;
+    region.setRect({10, 20, 90, 60});
+    region.op({30, 40, 60, 80}, SkRegion::kXOR_Op);
+    canvas->drawRegion(region, SkPaint());
+    SkPath path;
+    region.getBoundaryPath(&path);
+    path.offset(100, 0);
+    canvas->drawPath(path, SkPaint());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_029.cpp b/docs/examples/Region_029.cpp
new file mode 100644
index 0000000..c0f7a7b
--- /dev/null
+++ b/docs/examples/Region_029.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1314f7250963775c5ee89cc5981eee24
+REG_FIDDLE(Region_029, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        auto r = region.getBounds();
+        SkDebugf("%14s: {%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region({1, 2, 3, 4});
+    debugster("region bounds", region);
+    region.setEmpty();
+    SkDebugf("    after region set empty:\n");
+    debugster("region bounds", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_030.cpp b/docs/examples/Region_030.cpp
new file mode 100644
index 0000000..66f0bf4
--- /dev/null
+++ b/docs/examples/Region_030.cpp
@@ -0,0 +1,13 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e12575ffcd262f2364e0e6bece98a825
+REG_FIDDLE(Region_030, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region({1, 2, 3, 4});
+    SkDebugf("region is %s" "empty\n", region.isEmpty() ? "" : "not ");
+    bool setEmpty = region.setRect({1, 2, 1, 4});
+    SkDebugf("region is %s" "empty\n", region.isEmpty() ? "" : "not ");
+    SkDebugf("setEmpty: %s\n", setEmpty ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_031.cpp b/docs/examples/Region_031.cpp
new file mode 100644
index 0000000..0fa3391
--- /dev/null
+++ b/docs/examples/Region_031.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5b31a1b077818a8150ad50f3b19e7bfe
+REG_FIDDLE(Region_031, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, bool success, SkRegion& region) -> void {
+        auto r = region.getBounds();
+        SkDebugf("%14s: success:%s {%d,%d,%d,%d}\n", label, success ? "true" : "false",
+                 r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region;
+    bool success = region.setRect(1, 2, 3, 4);
+    debugster("set to: 1,2,3,4", success, region);
+    success = region.setRect(3, 2, 1, 4);
+    debugster("set to: 3,2,1,4", success, region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_032.cpp b/docs/examples/Region_032.cpp
new file mode 100644
index 0000000..97cc6cf
--- /dev/null
+++ b/docs/examples/Region_032.cpp
@@ -0,0 +1,18 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fc793a14ed76c096a68a755c963c1ee0
+REG_FIDDLE(Region_032, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkIRect rects[] = { {10, 10, 40, 40}, {20, 20, 50, 50}, {30, 30, 60, 60} };
+    SkRegion region;
+    region.setRects(rects, SK_ARRAY_COUNT(rects));
+    canvas->drawRegion(region, SkPaint());
+    region.setEmpty();
+    for (auto add : rects) {
+        region.op(add, SkRegion::kUnion_Op);
+    }
+    region.translate(100, 0);
+    canvas->drawRegion(region, SkPaint());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_033.cpp b/docs/examples/Region_033.cpp
new file mode 100644
index 0000000..7043143
--- /dev/null
+++ b/docs/examples/Region_033.cpp
@@ -0,0 +1,21 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5d75d22bd155576838155762ab040751
+REG_FIDDLE(Region_033, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        auto r = region.getBounds();
+        SkDebugf("%14s: {%d,%d,%d,%d}\n", label, r.fLeft, r.fTop, r.fRight, r.fBottom);
+    };
+    SkRegion region({1, 2, 3, 4});
+    SkRegion region2;
+    region2.setRegion(region);
+    debugster("region bounds", region);
+    debugster("region2 bounds", region2);
+    region2.setEmpty();
+    SkDebugf("    after region set empty:\n");
+    debugster("region bounds", region);
+    debugster("region2 bounds", region2);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_034.cpp b/docs/examples/Region_034.cpp
new file mode 100644
index 0000000..a07b89a
--- /dev/null
+++ b/docs/examples/Region_034.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=45b9ea2247b9ca7f10aa22ea29a426f4
+REG_FIDDLE(Region_034, 256, 120, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath textPath;
+    paint.getTextPath("Q", 1, 0, 110, &textPath);
+    SkIRect clipRect = {20, 20, 100, 120};
+    SkRegion clipRegion(clipRect);
+    SkRegion region;
+    region.setPath(textPath, clipRegion);
+    canvas->drawRegion(region, SkPaint());
+    clipRect.offset(100, 0);
+    textPath.offset(100, 0);
+    canvas->clipRect(SkRect::Make(clipRect), false);
+    canvas->drawPath(textPath, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_035.cpp b/docs/examples/Region_035.cpp
new file mode 100644
index 0000000..7a79aeb
--- /dev/null
+++ b/docs/examples/Region_035.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=42bde0ef8c2ee372751428cd6e21c1ca
+REG_FIDDLE(Region_035, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath textPath;
+    paint.getTextPath("W", 1, 20, 110, &textPath);
+    SkRegion region;
+    region.setPath(textPath, SkRegion({0, 0, 256, 256}));
+    canvas->drawRegion(region, SkPaint());
+    SkIRect iRect = SkIRect::MakeXYWH(frame * 160, 55, 10, 10);
+    paint.setColor(region.intersects(iRect) ? SK_ColorBLUE : SK_ColorRED);
+    canvas->drawRect(SkRect::Make(iRect), paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_036.cpp b/docs/examples/Region_036.cpp
new file mode 100644
index 0000000..f41ddfb
--- /dev/null
+++ b/docs/examples/Region_036.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4263d79ac0e7df02e90948fdde9fa965
+REG_FIDDLE(Region_036, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath hPath, dotPath;
+    paint.getTextPath("H", 1, 40, 110, &hPath);
+    paint.getTextPath(",", 1, frame * 180, 95, &dotPath);
+    SkRegion hRegion, dotRegion;
+    hRegion.setPath(hPath, SkRegion({0, 0, 256, 256}));
+    dotRegion.setPath(dotPath, SkRegion({0, 0, 256, 256}));
+    canvas->drawRegion(hRegion, paint);
+    paint.setColor(hRegion.intersects(dotRegion) ? SK_ColorBLUE : SK_ColorRED);
+    canvas->drawRegion(dotRegion, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_037.cpp b/docs/examples/Region_037.cpp
new file mode 100644
index 0000000..0f7b124
--- /dev/null
+++ b/docs/examples/Region_037.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e3899c2715c332bfc7648d5f2b9eefc6
+REG_FIDDLE(Region_037, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    SkRegion xRegion;
+    xRegion.setPath(xPath, SkRegion({0, 0, 256, 256}));
+    canvas->drawRegion(xRegion, paint);
+    for (int y = 0; y < 128; y += 8) {
+        for (int x = 0; x < 128; x += 8) {
+           paint.setColor(xRegion.contains(x, y) ? SK_ColorWHITE : SK_ColorRED);
+           canvas->drawPoint(x, y, paint);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_038.cpp b/docs/examples/Region_038.cpp
new file mode 100644
index 0000000..62c6b26
--- /dev/null
+++ b/docs/examples/Region_038.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=100b4cbd5dd7406804e40035833a433c
+REG_FIDDLE(Region_038, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    SkRegion xRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    xRegion.op(drawBounds, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+    SkIRect test = SkIRect::MakeXYWH(frame* 128, 64, 5, 5);
+    if (xRegion.contains(test)) {
+        paint.setColor(SK_ColorYELLOW);
+        canvas->drawRect(SkRect::Make(test), paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_039.cpp b/docs/examples/Region_039.cpp
new file mode 100644
index 0000000..60f5861
--- /dev/null
+++ b/docs/examples/Region_039.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=46de22da2f3e08a8d7f064634fc1c7b5
+REG_FIDDLE(Region_039, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath, testPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    paint.getTextPath("`", 1, frame * 150 - 40, 150, &testPath);
+    SkRegion xRegion, testRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    testRegion.setPath(testPath, SkRegion(drawBounds));
+    xRegion.op(drawBounds, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+    if (xRegion.contains(testRegion)) {
+        paint.setColor(SK_ColorYELLOW);
+        canvas->drawRegion(testRegion, paint);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_040.cpp b/docs/examples/Region_040.cpp
new file mode 100644
index 0000000..3522732
--- /dev/null
+++ b/docs/examples/Region_040.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d8e5eac373e2e7cfc1b8cd0229647ba6
+REG_FIDDLE(Region_040, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region({1, 2, 3, 4});
+    SkIRect test = {2, 2, 3, 3};
+    SkDebugf("quickContains 1: %s\n", region.quickContains(test) ? "true" : "false");
+    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);
+    SkDebugf("quickContains 2: %s\n", region.quickContains(test) ? "true" : "false");
+    region.op({1, 7, 3, 8}, SkRegion::kUnion_Op);
+    SkDebugf("quickContains 3: %s\n", region.quickContains(test) ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_041.cpp b/docs/examples/Region_041.cpp
new file mode 100644
index 0000000..21705be
--- /dev/null
+++ b/docs/examples/Region_041.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=eb6d290887e1a3a0b051b4d7b012f5e1
+REG_FIDDLE(Region_041, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto debugster = [](const char* label, SkRegion& region) -> void {
+        SkDebugf("%s: %s\n", label, region.quickContains(2, 2, 3, 3) ? "true" : "false");
+    };
+    SkRegion region({1, 2, 3, 4});
+    debugster("quickContains 1", region);
+    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);
+    debugster("quickContains 2", region);
+    region.op({1, 7, 3, 8}, SkRegion::kUnion_Op);
+    debugster("quickContains 3", region);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_042.cpp b/docs/examples/Region_042.cpp
new file mode 100644
index 0000000..c3280ba
--- /dev/null
+++ b/docs/examples/Region_042.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=71ac24b7d91ac5ca7c14b43930d5f85d
+REG_FIDDLE(Region_042, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region({1, 2, 3, 4});
+    SkIRect test = {4, 2, 5, 3};
+    SkDebugf("quickReject 1: %s\n", region.quickReject(test) ? "true" : "false");
+    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);
+    SkDebugf("quickReject 2: %s\n", region.quickReject(test) ? "true" : "false");
+    region.op({4, 7, 5, 8}, SkRegion::kUnion_Op);
+    SkDebugf("quickReject 3: %s\n", region.quickReject(test) ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_043.cpp b/docs/examples/Region_043.cpp
new file mode 100644
index 0000000..23fc1a7
--- /dev/null
+++ b/docs/examples/Region_043.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=def7dba38947c33b203e4f9db6c88be3
+REG_FIDDLE(Region_043, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region({1, 2, 3, 4});
+    SkRegion test;
+    SkIRect rects[] = {{4, 2, 5, 3}, {7, 2, 8, 3}};
+    test.setRects(rects, SK_ARRAY_COUNT(rects));
+    SkDebugf("quickReject 1: %s\n", region.quickReject(test) ? "true" : "false");
+    region.op({1, 4, 3, 6}, SkRegion::kUnion_Op);
+    SkDebugf("quickReject 2: %s\n", region.quickReject(test) ? "true" : "false");
+    region.op({4, 7, 5, 8}, SkRegion::kUnion_Op);
+    SkDebugf("quickReject 3: %s\n", region.quickReject(test) ? "true" : "false");
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_044.cpp b/docs/examples/Region_044.cpp
new file mode 100644
index 0000000..1e4f203
--- /dev/null
+++ b/docs/examples/Region_044.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=4e5b9e53aa1b200fed3ee6596ca01f0e
+REG_FIDDLE(Region_044, 256, 90, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion test;
+    SkIRect rects[] = {{40, 20, 50, 30}, {70, 40, 80, 50}, { 60, 10, 70, 20}};
+    test.setRects(rects, SK_ARRAY_COUNT(rects));
+    SkPaint paint;
+    for (auto color :  { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN, SK_ColorMAGENTA } ) {
+        paint.setColor(color);
+        canvas->drawRegion(test, paint);
+        test.translate(10, 10);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_045.cpp b/docs/examples/Region_045.cpp
new file mode 100644
index 0000000..ec7d7e9
--- /dev/null
+++ b/docs/examples/Region_045.cpp
@@ -0,0 +1,20 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=024200960eb52fee1f471514607e6001
+REG_FIDDLE(Region_045, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion test;
+    SkIRect rects[] = {{40, 20, 50, 30}, {70, 40, 80, 50}, { 60, 10, 70, 20}};
+    test.setRects(rects, SK_ARRAY_COUNT(rects));
+    SkPaint paint;
+    for (auto color :  { SK_ColorRED, SK_ColorBLUE, SK_ColorGREEN, SK_ColorMAGENTA } ) {
+        paint.setColor(color);
+        canvas->drawRegion(test, paint);
+        SkRegion second;
+        test.translate(10, test.getBounds().fBottom, &second);
+        test.op(second, SkRegion::kXOR_Op);
+        test.translate(30, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Region_046.cpp b/docs/examples/Region_046.cpp
new file mode 100644
index 0000000..7b4586d
--- /dev/null
+++ b/docs/examples/Region_046.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=026dd8b180fe8e43f477fce43e9217b3
+REG_FIDDLE(Region_046, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion operand({35, 35, 85, 85});
+    const char* labels[] = {"difference", "intersect", "union", "xor", "reverse diff", "replace"};
+    int index = 0;
+    SkPaint paint;
+    for (auto op : { SkRegion::kDifference_Op, SkRegion::kIntersect_Op, SkRegion::kUnion_Op,
+                     SkRegion::kXOR_Op, SkRegion::kReverseDifference_Op, SkRegion::kReplace_Op } ) {
+        SkRegion target({10, 10, 60, 60});
+        target.op(operand, op);
+        canvas->drawRegion(target, paint);
+        canvas->drawString(labels[index++], 40, 100, paint);
+        canvas->translate(80, 0);
+        if (SkRegion::kUnion_Op == op) {
+            canvas->translate(-240, 120);
+        }
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_047.cpp b/docs/examples/Region_047.cpp
new file mode 100644
index 0000000..369de4f
--- /dev/null
+++ b/docs/examples/Region_047.cpp
@@ -0,0 +1,19 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1790b2e054c536a54601138365700ac3
+REG_FIDDLE(Region_047, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    SkRegion xRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    xRegion.op(drawBounds, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_048.cpp b/docs/examples/Region_048.cpp
new file mode 100644
index 0000000..1520555
--- /dev/null
+++ b/docs/examples/Region_048.cpp
@@ -0,0 +1,20 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2e3497890d523235f96680716c321098
+REG_FIDDLE(Region_048, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    SkRegion xRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    xRegion.op(drawBounds.fLeft + frame * drawBounds.width(), drawBounds.fTop,
+               drawBounds.fRight, drawBounds.fBottom, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_049.cpp b/docs/examples/Region_049.cpp
new file mode 100644
index 0000000..b7c005b
--- /dev/null
+++ b/docs/examples/Region_049.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=65f4eccea3514ed7e37b5067e15efddb
+REG_FIDDLE(Region_049, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath, opPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    opPath.addCircle(64, 64, frame * 64);
+    SkRegion xRegion, opRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    opRegion.setPath(opPath, SkRegion(drawBounds));
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    xRegion.op(opRegion, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_050.cpp b/docs/examples/Region_050.cpp
new file mode 100644
index 0000000..685f405
--- /dev/null
+++ b/docs/examples/Region_050.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3f964be1e1fd2fbb977b655d3a928f0a
+REG_FIDDLE(Region_050, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath, opPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    opPath.addCircle(64, 64, frame * 64);
+    SkRegion xRegion, opRegion, rectRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    opRegion.setPath(opPath, SkRegion(drawBounds));
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    drawBounds.inset(frame * drawBounds.width() / 2, 0);
+    rectRegion.op(drawBounds, opRegion, SkRegion::kIntersect_Op);
+    xRegion.op(rectRegion, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_051.cpp b/docs/examples/Region_051.cpp
new file mode 100644
index 0000000..0aeab23
--- /dev/null
+++ b/docs/examples/Region_051.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e623208dd44f0b24499ac5f1593d1b39
+REG_FIDDLE(Region_051, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath, opPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    opPath.addCircle(64, 64, frame * 64);
+    SkRegion xRegion, opRegion, rectRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    opRegion.setPath(opPath, SkRegion(drawBounds));
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    drawBounds.inset(frame * drawBounds.width() / 2, 0);
+    rectRegion.op(opRegion, drawBounds, SkRegion::kUnion_Op);
+    xRegion.op(rectRegion, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_052.cpp b/docs/examples/Region_052.cpp
new file mode 100644
index 0000000..ca165c5
--- /dev/null
+++ b/docs/examples/Region_052.cpp
@@ -0,0 +1,26 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=13de1a6fcb2302a2a30278cb88d3e17d
+REG_FIDDLE(Region_052, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath, opPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    xPath.setFillType(SkPath::kInverseWinding_FillType);
+    opPath.addCircle(64, 64, frame * 64);
+    opPath.setFillType(SkPath::kInverseWinding_FillType);
+    SkRegion xRegion, opRegion, rectRegion;
+    SkIRect drawBounds = {0, 0, 128, 128};
+    opRegion.setPath(opPath, SkRegion(drawBounds));
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    drawBounds.inset(frame * drawBounds.width() / 2, 0);
+    rectRegion.setRect(drawBounds);
+    rectRegion.op(xRegion, SkRegion::kIntersect_Op);
+    xRegion.op(rectRegion, opRegion, SkRegion::kReverseDifference_Op);
+    canvas->drawRegion(xRegion, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_053.cpp b/docs/examples/Region_053.cpp
new file mode 100644
index 0000000..90e6f24
--- /dev/null
+++ b/docs/examples/Region_053.cpp
@@ -0,0 +1,23 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1419d2a8c22c355ab46240865d056ee5
+REG_FIDDLE(Region_053, 256, 128, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(128);
+    SkPath xPath;
+    paint.getTextPath("X", 1, 20, 110, &xPath);
+    SkIRect drawBounds = {0, 0, 128, 128};
+    SkRegion xRegion;
+    xRegion.setPath(xPath, SkRegion(drawBounds));
+    size_t size = xRegion.writeToMemory(nullptr);
+    sk_sp<SkData> data = SkData::MakeUninitialized(size);
+    xRegion.writeToMemory(data->writable_data());
+    SkRegion copy;
+    copy.readFromMemory(data->data(), data->size());
+    canvas->drawRegion(copy, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Region_054.cpp b/docs/examples/Region_054.cpp
new file mode 100644
index 0000000..0445bb0
--- /dev/null
+++ b/docs/examples/Region_054.cpp
@@ -0,0 +1,15 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=1ede346c430ef23df0eaaf0773dd6a15
+REG_FIDDLE(Region_054, 256, 100, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkRegion region({20, 20, 80, 80});
+    size_t size = region.writeToMemory(nullptr);
+    sk_sp<SkData> data = SkData::MakeUninitialized(size);
+    region.writeToMemory(data->writable_data());
+    SkRegion copy;
+    copy.readFromMemory(data->data(), data->size());
+    canvas->drawRegion(copy, SkPaint());
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_000.cpp b/docs/examples/Surface_000.cpp
new file mode 100644
index 0000000..9f61b68
--- /dev/null
+++ b/docs/examples/Surface_000.cpp
@@ -0,0 +1,25 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=3f5aeb870104187643197354a7f1d27a
+REG_FIDDLE(Surface_000, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);
+    const size_t size = info.computeMinByteSize();
+    SkAutoTMalloc<SkPMColor> storage(size);
+    SkPMColor* pixels = storage.get();
+    sk_sp<SkSurface> surface(SkSurface::MakeRasterDirect(info, pixels, info.minRowBytes()));
+    SkCanvas* canvas = surface->getCanvas();
+    canvas->clear(SK_ColorWHITE);
+    SkPMColor pmWhite = pixels[0];
+    SkPaint paint;
+    canvas->drawPoint(1, 1, paint);
+    canvas->flush();  // ensure that point was drawn
+    for (int y = 0; y < info.height(); ++y) {
+        for (int x = 0; x < info.width(); ++x) {
+            SkDebugf("%c", *pixels++ == pmWhite ? '-' : 'x');
+        }
+        SkDebugf("\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_001.cpp b/docs/examples/Surface_001.cpp
new file mode 100644
index 0000000..6b57e3c
--- /dev/null
+++ b/docs/examples/Surface_001.cpp
@@ -0,0 +1,33 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8e6530b26ab4096a9a91cfaadda1c568
+REG_FIDDLE(Surface_001, 256, 256, true, 0) {
+static void release_direct_surface_storage(void* pixels, void* context) {
+    if (pixels == context) {
+        SkDebugf("expected release context\n");
+    }
+    sk_free(pixels);
+}
+
+void draw(SkCanvas* ) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);
+    const size_t rowBytes = info.minRowBytes();
+    void* pixels = sk_malloc_throw(info.computeByteSize(rowBytes));
+    sk_sp<SkSurface> surface(SkSurface::MakeRasterDirectReleaseProc(info, pixels, rowBytes,
+            release_direct_surface_storage, pixels));
+    SkCanvas* canvas = surface->getCanvas();
+    canvas->clear(SK_ColorWHITE);
+    SkPMColor* colorPtr = (SkPMColor*) pixels;
+    SkPMColor pmWhite = colorPtr[0];
+    SkPaint paint;
+    canvas->drawPoint(1, 1, paint);
+    canvas->flush();  // ensure that point was drawn
+    for (int y = 0; y < info.height(); ++y) {
+        for (int x = 0; x < info.width(); ++x) {
+            SkDebugf("%c", *colorPtr++ == pmWhite ? '-' : 'x');
+        }
+        SkDebugf("\n");
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_002.cpp b/docs/examples/Surface_002.cpp
new file mode 100644
index 0000000..651e012
--- /dev/null
+++ b/docs/examples/Surface_002.cpp
@@ -0,0 +1,28 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a803910ada4f8733f0b62456afead55f
+REG_FIDDLE(Surface_002, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);
+    const size_t rowBytes = 64;
+    sk_sp<SkSurface> surface(SkSurface::MakeRaster(info, rowBytes, nullptr));
+    SkCanvas* canvas = surface->getCanvas();
+    canvas->clear(SK_ColorWHITE);
+    SkPixmap pixmap;
+    if (surface->peekPixels(&pixmap)) {
+        const uint32_t* colorPtr = pixmap.addr32();
+        SkPMColor pmWhite = colorPtr[0];
+        SkPaint paint;
+        canvas->drawPoint(1, 1, paint);
+        canvas->flush();  // ensure that point was drawn
+        for (int y = 0; y < info.height(); ++y) {
+            for (int x = 0; x < info.width(); ++x) {
+                SkDebugf("%c", colorPtr[x] == pmWhite ? '-' : 'x');
+            }
+            colorPtr += rowBytes / sizeof(colorPtr[0]);
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_003.cpp b/docs/examples/Surface_003.cpp
new file mode 100644
index 0000000..0485f07
--- /dev/null
+++ b/docs/examples/Surface_003.cpp
@@ -0,0 +1,27 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c6197d204ef9e4ccfb583242651fb2a7
+REG_FIDDLE(Surface_003, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    SkImageInfo info = SkImageInfo::MakeN32Premul(3, 3);
+    sk_sp<SkSurface> surface(SkSurface::MakeRaster(info));
+    SkCanvas* canvas = surface->getCanvas();
+    canvas->clear(SK_ColorWHITE);
+    SkPixmap pixmap;
+    if (surface->peekPixels(&pixmap)) {
+        const uint32_t* colorPtr = pixmap.addr32();
+        SkPMColor pmWhite = colorPtr[0];
+        SkPaint paint;
+        canvas->drawPoint(1, 1, paint);
+        canvas->flush();  // ensure that point was drawn
+        for (int y = 0; y < info.height(); ++y) {
+            for (int x = 0; x < info.width(); ++x) {
+                SkDebugf("%c", colorPtr[x] == pmWhite ? '-' : 'x');
+            }
+            colorPtr += info.width();
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_004.cpp b/docs/examples/Surface_004.cpp
new file mode 100644
index 0000000..6560b5a
--- /dev/null
+++ b/docs/examples/Surface_004.cpp
@@ -0,0 +1,26 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b932a2bd68455fb0af2e7a1ed19e36b3
+REG_FIDDLE(Surface_004, 256, 256, true, 0) {
+void draw(SkCanvas* ) {
+    sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(3, 3));
+    SkCanvas* canvas = surface->getCanvas();
+    canvas->clear(SK_ColorWHITE);
+    SkPixmap pixmap;
+    if (surface->peekPixels(&pixmap)) {
+        const uint32_t* colorPtr = pixmap.addr32();
+        SkPMColor pmWhite = colorPtr[0];
+        SkPaint paint;
+        canvas->drawPoint(1, 1, paint);
+        canvas->flush();  // ensure that point was drawn
+        for (int y = 0; y < surface->height(); ++y) {
+            for (int x = 0; x < surface->width(); ++x) {
+                SkDebugf("%c", colorPtr[x] == pmWhite ? '-' : 'x');
+            }
+            colorPtr += surface->width();
+            SkDebugf("\n");
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_005.cpp b/docs/examples/Surface_005.cpp
new file mode 100644
index 0000000..1f8d561
--- /dev/null
+++ b/docs/examples/Surface_005.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d3aec071998f871809f515e58abb1b0e
+REG_FIDDLE(Surface_005, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(32);
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+         canvas->drawString("GPU only!", 20, 40, paint);
+         return;
+    }
+    sk_sp<SkSurface> gpuSurface = SkSurface::MakeFromBackendTexture(context,
+            backEndTexture, kTopLeft_GrSurfaceOrigin, 0,
+            kRGBA_8888_SkColorType, nullptr, nullptr);
+    auto surfaceCanvas = gpuSurface->getCanvas();
+    surfaceCanvas->drawString("GPU rocks!", 20, 40, paint);
+    sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_006.cpp b/docs/examples/Surface_006.cpp
new file mode 100644
index 0000000..23a6238
--- /dev/null
+++ b/docs/examples/Surface_006.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5e87093b9cbe95124ae14cbe77091eb7
+REG_FIDDLE(Surface_006, 256, 256, false, 3) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(32);
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+         canvas->drawString("GPU only!", 20, 40, paint);
+         return;
+    }
+    sk_sp<SkSurface> gpuSurface = SkSurface::MakeFromBackendTextureAsRenderTarget(
+            context, backEndTexture, kTopLeft_GrSurfaceOrigin, 0,
+            kRGBA_8888_SkColorType, nullptr, nullptr);
+    auto surfaceCanvas = gpuSurface->getCanvas();
+    surfaceCanvas->drawString("GPU rocks!", 20, 40, paint);
+    sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_007.cpp b/docs/examples/Surface_007.cpp
new file mode 100644
index 0000000..3d7bfa7
--- /dev/null
+++ b/docs/examples/Surface_007.cpp
@@ -0,0 +1,28 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=67b6609471a3f1ed0f4b1657004cdecb
+REG_FIDDLE(Surface_007, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(32);
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+         canvas->drawString("GPU only!", 20, 40, paint);
+         return;
+    }
+    SkImageInfo info = SkImageInfo::MakeN32(256, 64, kOpaque_SkAlphaType);
+    for (auto surfaceOrigin : { kTopLeft_GrSurfaceOrigin, kBottomLeft_GrSurfaceOrigin } ) {
+        auto gpuSurface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info, 0,
+               surfaceOrigin, nullptr));
+        auto surfaceCanvas = gpuSurface->getCanvas();
+        surfaceCanvas->clear(SK_ColorWHITE);
+        surfaceCanvas->drawString("GPU rocks!", 20, 40, paint);
+        sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());
+        canvas->drawImage(image, 0, 0);
+       canvas->translate(0, 128);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_008.cpp b/docs/examples/Surface_008.cpp
new file mode 100644
index 0000000..f9c149e
--- /dev/null
+++ b/docs/examples/Surface_008.cpp
@@ -0,0 +1,36 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=640321e8ecfb3f9329f3bc6e1f02485f
+REG_FIDDLE(Surface_008, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    auto test_draw = [](SkCanvas* surfaceCanvas) -> void {
+        SkPaint paint;
+        paint.setAntiAlias(true);
+        paint.setLCDRenderText(true);
+        paint.setColor(0xFFBBBBBB);
+        surfaceCanvas->drawRect(SkRect::MakeWH(128, 64), paint);
+        paint.setColor(SK_ColorWHITE);
+        paint.setTextSize(32);
+        surfaceCanvas->drawString("Pest", 0, 25, paint);
+    };
+    GrContext* context = canvas->getGrContext();
+    SkImageInfo info = SkImageInfo::MakeN32(128, 64, kOpaque_SkAlphaType);
+    int y = 0;
+    for (auto geometry : { kRGB_H_SkPixelGeometry, kBGR_H_SkPixelGeometry,
+                           kRGB_V_SkPixelGeometry, kBGR_V_SkPixelGeometry } ) {
+        SkSurfaceProps props(0, geometry);
+        sk_sp<SkSurface> surface = context ? SkSurface::MakeRenderTarget(
+                context, SkBudgeted::kNo, info, 0, &props) : SkSurface::MakeRaster(info, &props);
+        test_draw(surface->getCanvas());
+        surface->draw(canvas, 0, y, nullptr);
+        sk_sp<SkImage> image(surface->makeImageSnapshot());
+        SkAutoCanvasRestore acr(canvas, true);
+        canvas->scale(8, 8);
+        canvas->drawImage(image, 12, y / 8);
+        y += 64;
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_009.cpp b/docs/examples/Surface_009.cpp
new file mode 100644
index 0000000..efd7db5
--- /dev/null
+++ b/docs/examples/Surface_009.cpp
@@ -0,0 +1,24 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=5c7629c15e9ac93f098335e72560fa2e
+REG_FIDDLE(Surface_009, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(32);
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+         canvas->drawString("GPU only!", 20, 40, paint);
+         return;
+    }
+    SkImageInfo info = SkImageInfo::MakeN32(256, 64, kOpaque_SkAlphaType);
+    auto gpuSurface(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info));
+    auto surfaceCanvas = gpuSurface->getCanvas();
+    surfaceCanvas->clear(SK_ColorWHITE);
+    surfaceCanvas->drawString("GPU rocks!", 20, 40, paint);
+    sk_sp<SkImage> image(gpuSurface->makeImageSnapshot());
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_010.cpp b/docs/examples/Surface_010.cpp
new file mode 100644
index 0000000..c9724b6
--- /dev/null
+++ b/docs/examples/Surface_010.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=99a54b814ccab7d2b1143c88581649ff
+REG_FIDDLE(Surface_010, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkDebugf("SkSurface::MakeNull(0, 0) %c= nullptr\n", SkSurface::MakeNull(0, 0) == nullptr ?
+             '=' : '!');
+    const int w = 37;
+    const int h = 1000;
+    auto surf = SkSurface::MakeNull(w, h);
+    auto nullCanvas = surf->getCanvas();
+    nullCanvas->drawPaint(SkPaint());   // does not crash, nothing draws
+    SkDebugf("surf->makeImageSnapshot() %c= nullptr\n", surf->makeImageSnapshot() == nullptr ?
+            '=' : '!');
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_011.cpp b/docs/examples/Surface_011.cpp
new file mode 100644
index 0000000..469a47c
--- /dev/null
+++ b/docs/examples/Surface_011.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=df066b56dd97c7c589fd2bb6a2539de8
+REG_FIDDLE(Surface_011, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int width = 37;
+    const int height = 1000;
+    auto surf = SkSurface::MakeNull(width, height);
+    auto nullCanvas = surf->getCanvas();
+    SkDebugf("surface width=%d  canvas width=%d\n", surf->width(),
+             nullCanvas->getBaseLayerSize().fWidth);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_012.cpp b/docs/examples/Surface_012.cpp
new file mode 100644
index 0000000..e83286a
--- /dev/null
+++ b/docs/examples/Surface_012.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=20571cc23e3146deaa09046b64cc0aef
+REG_FIDDLE(Surface_012, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const int width = 37;
+    const int height = 1000;
+    auto surf = SkSurface::MakeNull(width, height);
+    auto nullCanvas = surf->getCanvas();
+    SkDebugf("surface height=%d  canvas height=%d\n", surf->height(),
+             nullCanvas->getBaseLayerSize().fHeight);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_013.cpp b/docs/examples/Surface_013.cpp
new file mode 100644
index 0000000..0b3bf5b
--- /dev/null
+++ b/docs/examples/Surface_013.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=be9574c4a14f891e1abb4ec2b1e51d6c
+REG_FIDDLE(Surface_013, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto surface = SkSurface::MakeRasterN32Premul(1, 1);
+    for (int i = 0; i < 3; ++i) {
+        SkDebugf("surface generationID: %d\n", surface->generationID());
+        if (0 == i) {
+            surface->getCanvas()->drawColor(SK_ColorBLACK);
+        } else {
+            surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_014.cpp b/docs/examples/Surface_014.cpp
new file mode 100644
index 0000000..3a40452
--- /dev/null
+++ b/docs/examples/Surface_014.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=be9574c4a14f891e1abb4ec2b1e51d6c
+REG_FIDDLE(Surface_014, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    auto surface = SkSurface::MakeRasterN32Premul(1, 1);
+    for (int i = 0; i < 3; ++i) {
+        SkDebugf("surface generationID: %d\n", surface->generationID());
+        if (0 == i) {
+            surface->getCanvas()->drawColor(SK_ColorBLACK);
+        } else {
+            surface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);
+        }
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_015.cpp b/docs/examples/Surface_015.cpp
new file mode 100644
index 0000000..f12da19
--- /dev/null
+++ b/docs/examples/Surface_015.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=33d0c5ad5a4810e533ae1010e29f8b75
+REG_FIDDLE(Surface_015, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(64, 64));
+    SkCanvas* surfaceCanvas = surface->getCanvas();
+    surfaceCanvas->clear(SK_ColorBLUE);
+    SkPaint paint;
+    paint.setTextSize(40);
+    surfaceCanvas->drawString("\xF0\x9F\x98\x81", 12, 45, paint);
+    surface->draw(canvas, 0, 0, nullptr);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_016.cpp b/docs/examples/Surface_016.cpp
new file mode 100644
index 0000000..c03c4df
--- /dev/null
+++ b/docs/examples/Surface_016.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a9889b519a26896b900da0444e423c61
+REG_FIDDLE(Surface_016, 256, 96, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));
+    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));
+    big->getCanvas()->clear(SK_ColorRED);
+    lil->getCanvas()->clear(SK_ColorBLACK);
+    SkPixmap pixmap;
+    if (big->peekPixels(&pixmap)) {
+        SkBitmap bigBits;
+        bigBits.installPixels(pixmap);
+        canvas->drawBitmap(bigBits, 0, 0);
+    }
+    if (lil->peekPixels(&pixmap)) {
+        SkBitmap lilBits;
+        lilBits.installPixels(pixmap);
+        canvas->drawBitmap(lilBits, 64, 64);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_017.cpp b/docs/examples/Surface_017.cpp
new file mode 100644
index 0000000..477df75
--- /dev/null
+++ b/docs/examples/Surface_017.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=46f1fa0d95e590a64bed0140407ce5f7
+REG_FIDDLE(Surface_017, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));
+    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));
+    big->getCanvas()->clear(SK_ColorRED);
+    lil->getCanvas()->clear(SK_ColorBLACK);
+    sk_sp<SkImage> early(big->makeImageSnapshot());
+    lil->draw(big->getCanvas(), 16, 16, nullptr);
+    sk_sp<SkImage> later(big->makeImageSnapshot());
+    canvas->drawImage(early, 0, 0);
+    canvas->drawImage(later, 128, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_018.cpp b/docs/examples/Surface_018.cpp
new file mode 100644
index 0000000..b5f560f
--- /dev/null
+++ b/docs/examples/Surface_018.cpp
@@ -0,0 +1,17 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=b18b8ab693b09eb70a1d22ab63790cc7
+REG_FIDDLE(Surface_018, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));
+    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));
+    big->getCanvas()->clear(SK_ColorRED);
+    lil->getCanvas()->clear(SK_ColorBLACK);
+    sk_sp<SkImage> early(big->makeImageSnapshot());
+    lil->draw(big->getCanvas(), 16, 16, nullptr);
+    sk_sp<SkImage> later(big->makeImageSnapshot({0, 0, 16, 16}));
+    canvas->drawImage(early, 0, 0);
+    canvas->drawImage(later, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_019.cpp b/docs/examples/Surface_019.cpp
new file mode 100644
index 0000000..54b965d
--- /dev/null
+++ b/docs/examples/Surface_019.cpp
@@ -0,0 +1,19 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=0de693f4d8dd898a60be8cfba23952be
+REG_FIDDLE(Surface_019, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> big(SkSurface::MakeRasterN32Premul(64, 64));
+    sk_sp<SkSurface> lil(big->makeSurface(SkImageInfo::MakeN32(32, 32, kPremul_SkAlphaType)));
+    big->getCanvas()->clear(SK_ColorRED);
+    lil->getCanvas()->clear(SK_ColorBLACK);
+    lil->draw(big->getCanvas(), 16, 16, nullptr);
+    SkPixmap pixmap;
+    if (big->peekPixels(&pixmap)) {
+        SkBitmap bigBits;
+        bigBits.installPixels(pixmap);
+        canvas->drawBitmap(bigBits, 0, 0);
+    }
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_020.cpp b/docs/examples/Surface_020.cpp
new file mode 100644
index 0000000..521c966
--- /dev/null
+++ b/docs/examples/Surface_020.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=8c6184f22cfe068f021704cf92a147a1
+REG_FIDDLE(Surface_020, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));
+    auto surfCanvas = surf->getCanvas();
+    surfCanvas->clear(SK_ColorRED);
+    SkPaint paint;
+    paint.setTextSize(40);
+    surfCanvas->drawString("&", 16, 48, paint);
+    SkPixmap pixmap;
+    if (surf->peekPixels(&pixmap)) {
+        SkBitmap surfBits;
+        surfBits.installPixels(pixmap);
+        canvas->drawBitmap(surfBits, 0, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_021.cpp b/docs/examples/Surface_021.cpp
new file mode 100644
index 0000000..ed58a38
--- /dev/null
+++ b/docs/examples/Surface_021.cpp
@@ -0,0 +1,25 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=9f454fb93bca6482598d198b4121f0a6
+REG_FIDDLE(Surface_021, 256, 32, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));
+    auto surfCanvas = surf->getCanvas();
+    surfCanvas->clear(SK_ColorRED);
+    SkPaint paint;
+    paint.setTextSize(40);
+    surfCanvas->drawString("&", 0, 32, paint);
+    std::vector<SkPMColor> storage;
+    storage.resize(surf->width() * surf->height());
+    SkPixmap pixmap(SkImageInfo::MakeN32Premul(32, 32), &storage.front(),
+                    surf->width() * sizeof(storage[0]));
+    if (surf->readPixels(pixmap, 0, 0)) {
+        SkBitmap surfBits;
+        surfBits.installPixels(pixmap);
+        canvas->drawBitmap(surfBits, 0, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_022.cpp b/docs/examples/Surface_022.cpp
new file mode 100644
index 0000000..bac9aa0
--- /dev/null
+++ b/docs/examples/Surface_022.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=484d60dab5d846bf28c7a4d48892324a
+REG_FIDDLE(Surface_022, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));
+    auto surfCanvas = surf->getCanvas();
+    surfCanvas->clear(SK_ColorRED);
+    SkPaint paint;
+    surfCanvas->drawOval({4, 8, 58, 54}, paint);
+    SkImageInfo info = SkImageInfo::Make(64, 64, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+    sk_sp<SkData> data(SkData::MakeUninitialized(info.minRowBytes() * info.height()));
+    sk_bzero(data->writable_data(), info.minRowBytes() * info.height());
+    for (int x : { 32, -32 } ) {
+        for (int y : { 32, -32 } ) {
+            surf->readPixels(info, data->writable_data(), info.minRowBytes(), x, y);
+        }
+    }
+    sk_sp<SkImage> image = SkImage::MakeRasterData(info, data, info.minRowBytes());
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_023.cpp b/docs/examples/Surface_023.cpp
new file mode 100644
index 0000000..0d472b7
--- /dev/null
+++ b/docs/examples/Surface_023.cpp
@@ -0,0 +1,23 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=2d991a231e49d1de13eeb2ba9b440e01
+REG_FIDDLE(Surface_023, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));
+    auto surfCanvas = surf->getCanvas();
+    surfCanvas->clear(SK_ColorGREEN);
+    SkPaint paint;
+    surfCanvas->drawOval({2, 10, 58, 54}, paint);
+    SkImageInfo info = SkImageInfo::Make(64, 64, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+    SkBitmap bitmap;
+    bitmap.setInfo(info);
+    bitmap.allocPixels();
+    for (int x : { 32, -32 } ) {
+        for (int y : { 32, -32 } ) {
+            surf->readPixels(bitmap, x, y);
+        }
+    }
+    canvas->drawBitmap(bitmap, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_024.cpp b/docs/examples/Surface_024.cpp
new file mode 100644
index 0000000..c91901d
--- /dev/null
+++ b/docs/examples/Surface_024.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=760793bcf0ef193fa61ea03e6e8fc825
+REG_FIDDLE(Surface_024, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));
+    auto surfCanvas = surf->getCanvas();
+    surfCanvas->clear(SK_ColorRED);
+    SkPaint paint;
+    paint.setTextSize(40);
+    surfCanvas->drawString("&", 16, 40, paint);
+    SkPixmap pixmap;
+    if (surf->peekPixels(&pixmap)) {
+        surf->writePixels(pixmap, 25, 25);
+        sk_sp<SkImage> image(surf->makeImageSnapshot());
+        canvas->drawImage(image, 0, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_025.cpp b/docs/examples/Surface_025.cpp
new file mode 100644
index 0000000..6489f49
--- /dev/null
+++ b/docs/examples/Surface_025.cpp
@@ -0,0 +1,14 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d77790dd3bc9f678fa4f582347fb8fba
+REG_FIDDLE(Surface_025, 256, 96, false, 4) {
+void draw(SkCanvas* canvas) {
+    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));
+    auto surfCanvas = surf->getCanvas();
+    surfCanvas->clear(SK_ColorGREEN);
+    surf->writePixels(source, 25, 25);
+    sk_sp<SkImage> image(surf->makeImageSnapshot());
+    canvas->drawImage(image, 0, 0);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_026.cpp b/docs/examples/Surface_026.cpp
new file mode 100644
index 0000000..3271505
--- /dev/null
+++ b/docs/examples/Surface_026.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=13cf9e7b2894ae6e98c1fd719040bf01
+REG_FIDDLE(Surface_026, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    const char* names[] = { "Unknown", "RGB_H", "BGR_H", "RGB_V", "BGR_V" };
+    sk_sp<SkSurface> surf(SkSurface::MakeRasterN32Premul(64, 64));
+    SkDebugf("surf.props(): k%s_SkPixelGeometry\n", names[surf->props().pixelGeometry()]);
+}
+}  // END FIDDLE
diff --git a/docs/examples/Surface_027.cpp b/docs/examples/Surface_027.cpp
new file mode 100644
index 0000000..3d770b9
--- /dev/null
+++ b/docs/examples/Surface_027.cpp
@@ -0,0 +1,33 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6de6f3ef699a72ff26da1b26b23a3316
+REG_FIDDLE(Surface_027, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(32);
+    GrContext* context = canvas->getGrContext();
+    if (!context) {
+         canvas->drawString("GPU only!", 20, 40, paint);
+         return;
+    }
+    sk_sp<SkSurface> gpuSurface = SkSurface::MakeRenderTarget(
+            context, SkBudgeted::kYes, SkImageInfo::MakeN32Premul(64, 64));
+    SkSurfaceCharacterization characterization;
+    if (!gpuSurface->characterize(&characterization)) {
+         canvas->drawString("characterization unsupported", 20, 40, paint);
+         return;
+    }
+    // start of threadable work
+    SkDeferredDisplayListRecorder recorder(characterization);
+    SkCanvas* subCanvas = recorder.getCanvas();
+    subCanvas->clear(SK_ColorGREEN);
+    std::unique_ptr<SkDeferredDisplayList> displayList = recorder.detach();
+    // end of threadable work
+    gpuSurface->draw(displayList.get());
+    sk_sp<SkImage> img = gpuSurface->makeImageSnapshot();
+    canvas->drawImage(std::move(img), 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/Surface_028.cpp b/docs/examples/Surface_028.cpp
new file mode 100644
index 0000000..1a3a863
--- /dev/null
+++ b/docs/examples/Surface_028.cpp
@@ -0,0 +1,27 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=46d9bacf593deaaeabd74ff42f2571a0
+REG_FIDDLE(Surface_028, 256, 64, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkPaint paint;
+    paint.setTextSize(16);
+    sk_sp<SkSurface> gpuSurface = SkSurface::MakeRasterN32Premul(64, 64);
+    SkSurfaceCharacterization characterization;
+    if (!gpuSurface->characterize(&characterization)) {
+         canvas->drawString("characterization unsupported", 20, 40, paint);
+         return;
+    }
+    // start of threadable work
+    SkDeferredDisplayListRecorder recorder(characterization);
+    SkCanvas* subCanvas = recorder.getCanvas();
+    subCanvas->clear(SK_ColorGREEN);
+    std::unique_ptr<SkDeferredDisplayList> displayList = recorder.detach();
+    // end of threadable work
+    gpuSurface->draw(displayList.get());
+    sk_sp<SkImage> img = gpuSurface->makeImageSnapshot();
+    canvas->drawImage(std::move(img), 0, 0);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlobBuilder_000.cpp b/docs/examples/TextBlobBuilder_000.cpp
new file mode 100644
index 0000000..62d81c7
--- /dev/null
+++ b/docs/examples/TextBlobBuilder_000.cpp
@@ -0,0 +1,11 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=d9dbabfe24aad92ee3c8144513e90d81
+REG_FIDDLE(TextBlobBuilder_000, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder builder;
+    sk_sp<SkTextBlob> blob = builder.make();
+    SkDebugf("blob " "%s" " nullptr", blob == nullptr ? "equals" : "does not equal");
+}
+}  // END FIDDLE
diff --git a/docs/examples/TextBlobBuilder_001.cpp b/docs/examples/TextBlobBuilder_001.cpp
new file mode 100644
index 0000000..617e09e
--- /dev/null
+++ b/docs/examples/TextBlobBuilder_001.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=34c37c0212cc0aef670d96945d08fe24
+REG_FIDDLE(TextBlobBuilder_001, 256, 256, true, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder builder;
+    sk_sp<SkTextBlob> blob = builder.make();
+    SkDebugf("blob " "%s" " nullptr\n", blob == nullptr ? "equals" : "does not equal");
+    SkPaint paint;
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    SkFont font;
+    paint.textToGlyphs("x", 1, builder.allocRun(font, 1, 20, 20).glyphs);
+    blob = builder.make();
+    SkDebugf("blob " "%s" " nullptr\n", blob == nullptr ? "equals" : "does not equal");
+    blob = builder.make();
+    SkDebugf("blob " "%s" " nullptr\n", blob == nullptr ? "equals" : "does not equal");
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlobBuilder_002.cpp b/docs/examples/TextBlobBuilder_002.cpp
new file mode 100644
index 0000000..1a08326
--- /dev/null
+++ b/docs/examples/TextBlobBuilder_002.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=f0e584aec20eaee7a5bfed62aa885eee
+REG_FIDDLE(TextBlobBuilder_002, 256, 60, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder builder;
+    SkFont font;
+    SkPaint paint;
+    const SkTextBlobBuilder::RunBuffer& run = builder.allocRun(font, 5, 20, 20);
+    paint.textToGlyphs("hello", 5, run.glyphs);
+    canvas->drawRect({20, 20, 30, 30}, paint);
+    canvas->drawTextBlob(builder.make(), 20, 20, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlobBuilder_003.cpp b/docs/examples/TextBlobBuilder_003.cpp
new file mode 100644
index 0000000..f4ff890
--- /dev/null
+++ b/docs/examples/TextBlobBuilder_003.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=c77ac50f506106fdfef94d20bc1a6934
+REG_FIDDLE(TextBlobBuilder_003, 256, 60, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder builder;
+    SkPaint paint;
+    SkFont font;
+    const SkTextBlobBuilder::RunBuffer& run = builder.allocRunPosH(font, 5, 20);
+    paint.textToGlyphs("hello", 5, run.glyphs);
+    SkScalar positions[] = {0, 10, 20, 40, 80};
+    memcpy(run.pos, positions, sizeof(positions));
+    canvas->drawTextBlob(builder.make(), 20, 20, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlobBuilder_004.cpp b/docs/examples/TextBlobBuilder_004.cpp
new file mode 100644
index 0000000..4bca56f
--- /dev/null
+++ b/docs/examples/TextBlobBuilder_004.cpp
@@ -0,0 +1,18 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=da4fcb4a972b500996be9aff6c6c40e1
+REG_FIDDLE(TextBlobBuilder_004, 256, 90, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder builder;
+    SkPaint paint;
+    SkFont font;
+    const SkTextBlobBuilder::RunBuffer& run = builder.allocRunPos(font, 5);
+    paint.textToGlyphs("hello", 5, run.glyphs);
+    SkPoint positions[] = {{0, 0}, {10, 10}, {20, 20}, {40, 40}, {80, 80}};
+    memcpy(run.pos, positions, sizeof(positions));
+    canvas->drawTextBlob(builder.make(), 20, 20, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlob_000.cpp b/docs/examples/TextBlob_000.cpp
new file mode 100644
index 0000000..c2706ce
--- /dev/null
+++ b/docs/examples/TextBlob_000.cpp
@@ -0,0 +1,34 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=fb8b2502bbe52d2029aecdf569dd9fdb
+REG_FIDDLE(TextBlob_000, 256, 70, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkTextBlobBuilder textBlobBuilder;
+    const char bunny[] = "/(^x^)\\";
+    const int len = sizeof(bunny) - 1;
+    uint16_t glyphs[len];
+    SkPaint paint;
+    paint.textToGlyphs(bunny, len, glyphs);
+    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    SkFont font;
+    int runs[] = { 3, 1, 3 };
+    SkPoint textPos = { 20, 50 };
+    int glyphIndex = 0;
+    for (auto runLen : runs) {
+        font.setSize(1 == runLen ? 20 : 50);
+        paint.setTextSize(1 == runLen ? 20 : 50);
+        const SkTextBlobBuilder::RunBuffer& run =
+                textBlobBuilder.allocRun(font, runLen, textPos.fX, textPos.fY);
+        memcpy(run.glyphs, &glyphs[glyphIndex], sizeof(glyphs[0]) * runLen);
+        textPos.fX += paint.measureText(&glyphs[glyphIndex], sizeof(glyphs[0]) * runLen, nullptr);
+        glyphIndex += runLen;
+    }
+    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();
+    canvas->drawTextBlob(blob.get(), 0, 0, paint);
+    paint.setStyle(SkPaint::kStroke_Style);
+    canvas->drawRect(blob->bounds(), paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlob_001.cpp b/docs/examples/TextBlob_001.cpp
new file mode 100644
index 0000000..6992079
--- /dev/null
+++ b/docs/examples/TextBlob_001.cpp
@@ -0,0 +1,40 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=6e12cceca981ddabc0fc18c380543f34
+REG_FIDDLE(TextBlob_001, 256, 256, false, 0) {
+void draw(SkCanvas* canvas) {
+    for (int index = 0; index < 2; ++index) {
+        SkTextBlobBuilder textBlobBuilder;
+        const char bunny[] = "/(^x^)\\";
+        const int len = sizeof(bunny) - 1;
+        uint16_t glyphs[len];
+        SkPaint paint;
+        paint.textToGlyphs(bunny, len, glyphs);
+        paint.setTextEncoding(kGlyphID_SkTextEncoding);
+        paint.setTextScaleX(0.5);
+        SkFont font;
+        font.setScaleX(0.5);
+        int runs[] = { 3, 1, 3 };
+        SkPoint textPos = { 20, 50 };
+        int glyphIndex = 0;
+        for (auto runLen : runs) {
+            font.setSize(1 == runLen ? 20 : 50);
+            paint.setTextSize(1 == runLen ? 20 : 50);
+            const SkTextBlobBuilder::RunBuffer& run =
+                    textBlobBuilder.allocRun(font, runLen, textPos.fX, textPos.fY);
+            memcpy(run.glyphs, &glyphs[glyphIndex], sizeof(glyphs[0]) * runLen);
+            textPos.fX += paint.measureText(&glyphs[glyphIndex], sizeof(glyphs[0]) * runLen, nullptr);
+            glyphIndex += runLen;
+        }
+        sk_sp<const SkTextBlob> blob = textBlobBuilder.make();
+        paint.reset();
+        canvas->drawTextBlob(blob.get(), 0, 0, paint);
+        std::string id = "unique ID:" + std::to_string(blob->uniqueID());
+        canvas->drawString(id.c_str(), 30, blob->bounds().fBottom + 15, paint);
+        canvas->translate(blob->bounds().fRight + 10, 0);
+    }
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlob_002.cpp b/docs/examples/TextBlob_002.cpp
new file mode 100644
index 0000000..39415c1
--- /dev/null
+++ b/docs/examples/TextBlob_002.cpp
@@ -0,0 +1,35 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=e9d4eb8ece521b1329e7433d4b243fdf
+REG_FIDDLE(TextBlob_002, 256, 143, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkFont font;
+    font.setSize(120);
+    SkPoint textPos = { 20, 110 };
+    int len = 3;
+    SkTextBlobBuilder textBlobBuilder;
+    const SkTextBlobBuilder::RunBuffer& run =
+            textBlobBuilder.allocRun(font, len, textPos.fX, textPos.fY);
+    run.glyphs[0] = 10;
+    run.glyphs[1] = 20;
+    run.glyphs[2] = 30;
+    sk_sp<const SkTextBlob> blob = textBlobBuilder.make();
+    SkPaint paint;
+    SkScalar bounds[] = { 116, 134 };
+    int count = blob->getIntercepts(bounds, nullptr);
+    std::vector<SkScalar> intervals;
+    intervals.resize(count);
+    (void) paint.getTextBlobIntercepts(blob.get(), bounds, &intervals.front());
+    canvas->drawTextBlob(blob.get(), 0, 0, paint);
+    paint.setColor(0xFFFF7777);
+    SkScalar x = textPos.fX;
+    for (int i = 0; i < count; i+= 2) {
+        canvas->drawRect({x, bounds[0], intervals[i], bounds[1]}, paint);
+        x = intervals[i + 1];
+    }
+    canvas->drawRect({intervals[count - 1], bounds[0], 180, bounds[1]}, paint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlob_003.cpp b/docs/examples/TextBlob_003.cpp
new file mode 100644
index 0000000..d917cec
--- /dev/null
+++ b/docs/examples/TextBlob_003.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=bec2252bc36dc8fd023015629d60c405
+REG_FIDDLE(TextBlob_003, 256, 24, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkFont font;
+    font.setSize(24);
+    SkPaint canvasPaint;
+    canvasPaint.setColor(SK_ColorBLUE); // respected
+    canvasPaint.setTextSize(2); // ignored
+    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText("Hello World", 11, font);
+    canvas->drawTextBlob(blob, 20, 20, canvasPaint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlob_004.cpp b/docs/examples/TextBlob_004.cpp
new file mode 100644
index 0000000..2a7df84
--- /dev/null
+++ b/docs/examples/TextBlob_004.cpp
@@ -0,0 +1,17 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=a5af182e793eed3f2bb3b0efc2cf4852
+REG_FIDDLE(TextBlob_004, 256, 24, false, 0) {
+void draw(SkCanvas* canvas) {
+    SkFont font;
+    font.setSize(24);
+    SkPaint canvasPaint;
+    canvasPaint.setColor(SK_ColorBLUE); // respected
+    canvasPaint.setTextSize(2); // ignored
+    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromString("Hello World", font);
+    canvas->drawTextBlob(blob, 20, 20, canvasPaint);
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlob_005.cpp b/docs/examples/TextBlob_005.cpp
new file mode 100644
index 0000000..4a87e81
--- /dev/null
+++ b/docs/examples/TextBlob_005.cpp
@@ -0,0 +1,21 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=90ce8c327d407b1faac73baa2ebd0378
+REG_FIDDLE(TextBlob_005, 256, 64, false, 0) {
+#include "SkSerialProcs.h"
+
+void draw(SkCanvas* canvas) {
+    SkFont blobFont;
+    blobFont.setSize(24);
+    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText("Hello World", 11, blobFont);
+    char storage[2048];
+    size_t used = blob->serialize(SkSerialProcs(), storage, sizeof(storage));
+    sk_sp<SkTextBlob> copy = SkTextBlob::Deserialize(storage, used, SkDeserialProcs());
+    canvas->drawTextBlob(copy, 20, 20, SkPaint());
+    std::string usage = "size=" + std::to_string(sizeof(storage)) + " used=" + std::to_string(used);
+    canvas->drawString(usage.c_str(), 20, 40, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.
diff --git a/docs/examples/TextBlob_006.cpp b/docs/examples/TextBlob_006.cpp
new file mode 100644
index 0000000..e596291
--- /dev/null
+++ b/docs/examples/TextBlob_006.cpp
@@ -0,0 +1,16 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=464201a828f7e94fc01cd57facfcd2f4
+REG_FIDDLE(TextBlob_006, 256, 24, false, 0) {
+#include "SkSerialProcs.h"
+
+void draw(SkCanvas* canvas) {
+    SkFont blobFont;
+    blobFont.setSize(24);
+    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText("Hello World", 11, blobFont);
+    sk_sp<SkData> data = blob->serialize(SkSerialProcs());
+    sk_sp<SkTextBlob> copy = SkTextBlob::Deserialize(data->data(), data->size(), SkDeserialProcs());
+    canvas->drawTextBlob(copy, 20, 20, SkPaint());
+}
+}  // END FIDDLE
diff --git a/docs/examples/TextBlob_007.cpp b/docs/examples/TextBlob_007.cpp
new file mode 100644
index 0000000..24e7180
--- /dev/null
+++ b/docs/examples/TextBlob_007.cpp
@@ -0,0 +1,22 @@
+#if 0  // Disabled until updated to use current API.
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#include "fiddle/examples.h"
+// HASH=68b6d0208eb0b4de67fc152381af7a58
+REG_FIDDLE(TextBlob_007, 256, 24, false, 0) {
+#include "SkSerialProcs.h"
+
+void draw(SkCanvas* canvas) {
+    SkFont blobFont;
+    blobFont.setSize(24);
+    sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromText("Hello World!", 12, blobFont);
+    sk_sp<SkData> data = blob->serialize(SkSerialProcs());
+    uint16_t glyphs[6];
+    SkPaint blobPaint;
+    blobPaint.textToGlyphs("Hacker", 6, glyphs);
+    memcpy((char*)data->writable_data() + 0x54, glyphs, sizeof(glyphs));
+    sk_sp<SkTextBlob> copy = SkTextBlob::Deserialize(data->data(), data->size(), SkDeserialProcs());
+    canvas->drawTextBlob(copy, 20, 20, SkPaint());
+}
+}  // END FIDDLE
+#endif  // Disabled until updated to use current API.