diff --git a/BUILD.gn b/BUILD.gn
index 9c725b4..baa34f4 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -2260,6 +2260,22 @@
     }
   }
 
+  import("gn/examples.gni")
+  if (!skia_use_vulkan && (is_mac || is_linux || is_win)) {
+    test_app("fiddle_examples") {
+      sources = [
+        "tools/fiddle/examples.cpp",
+        "tools/fiddle/examples.h"
+      ]
+      sources += examples_sources
+      include_dirs = [ "tools" ]
+      deps = [
+        ":skia",
+        ":skia.h",
+        "modules/skottie",
+      ]
+    }
+  }
   test_app("viewer") {
     is_shared_library = is_android
     if (is_ios) {
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.
diff --git a/gn/examples.gni b/gn/examples.gni
new file mode 100644
index 0000000..c1cf137
--- /dev/null
+++ b/gn/examples.gni
@@ -0,0 +1,1133 @@
+# Copyright 2019 Google LLC.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+examples_sources = get_path_info([
+  "../docs/examples/AutoCanvasRestore_000.cpp",
+  "../docs/examples/AutoCanvasRestore_001.cpp",
+  "../docs/examples/Bitmap_000.cpp",
+  "../docs/examples/Bitmap_001.cpp",
+  "../docs/examples/Bitmap_002.cpp",
+  "../docs/examples/Bitmap_003.cpp",
+  "../docs/examples/Bitmap_004.cpp",
+  "../docs/examples/Bitmap_005.cpp",
+  "../docs/examples/Bitmap_006.cpp",
+  "../docs/examples/Bitmap_007.cpp",
+  "../docs/examples/Bitmap_008.cpp",
+  "../docs/examples/Bitmap_009.cpp",
+  "../docs/examples/Bitmap_010.cpp",
+  "../docs/examples/Bitmap_011.cpp",
+  "../docs/examples/Bitmap_012.cpp",
+  "../docs/examples/Bitmap_013.cpp",
+  "../docs/examples/Bitmap_014.cpp",
+  "../docs/examples/Bitmap_015.cpp",
+  "../docs/examples/Bitmap_016.cpp",
+  "../docs/examples/Bitmap_017.cpp",
+  "../docs/examples/Bitmap_018.cpp",
+  "../docs/examples/Bitmap_019.cpp",
+  "../docs/examples/Bitmap_020.cpp",
+  "../docs/examples/Bitmap_021.cpp",
+  "../docs/examples/Bitmap_022.cpp",
+  "../docs/examples/Bitmap_023.cpp",
+  "../docs/examples/Bitmap_024.cpp",
+  "../docs/examples/Bitmap_025.cpp",
+  "../docs/examples/Bitmap_026.cpp",
+  "../docs/examples/Bitmap_027.cpp",
+  "../docs/examples/Bitmap_028.cpp",
+  "../docs/examples/Bitmap_029.cpp",
+  "../docs/examples/Bitmap_030.cpp",
+  "../docs/examples/Bitmap_031.cpp",
+  "../docs/examples/Bitmap_032.cpp",
+  "../docs/examples/Bitmap_033.cpp",
+  "../docs/examples/Bitmap_034.cpp",
+  "../docs/examples/Bitmap_035.cpp",
+  "../docs/examples/Bitmap_036.cpp",
+  "../docs/examples/Bitmap_037.cpp",
+  "../docs/examples/Bitmap_038.cpp",
+  "../docs/examples/Bitmap_039.cpp",
+  "../docs/examples/Bitmap_040.cpp",
+  "../docs/examples/Bitmap_041.cpp",
+  "../docs/examples/Bitmap_042.cpp",
+  "../docs/examples/Bitmap_043.cpp",
+  "../docs/examples/Bitmap_044.cpp",
+  "../docs/examples/Bitmap_045.cpp",
+  "../docs/examples/Bitmap_046.cpp",
+  "../docs/examples/Bitmap_047.cpp",
+  "../docs/examples/Bitmap_048.cpp",
+  "../docs/examples/Bitmap_049.cpp",
+  "../docs/examples/Bitmap_050.cpp",
+  "../docs/examples/Bitmap_051.cpp",
+  "../docs/examples/Bitmap_052.cpp",
+  "../docs/examples/Bitmap_053.cpp",
+  "../docs/examples/Bitmap_054.cpp",
+  "../docs/examples/Bitmap_055.cpp",
+  "../docs/examples/Bitmap_056.cpp",
+  "../docs/examples/Bitmap_057.cpp",
+  "../docs/examples/Bitmap_058.cpp",
+  "../docs/examples/Bitmap_059.cpp",
+  "../docs/examples/Bitmap_060.cpp",
+  "../docs/examples/Bitmap_061.cpp",
+  "../docs/examples/Bitmap_062.cpp",
+  "../docs/examples/Bitmap_063.cpp",
+  "../docs/examples/Bitmap_064.cpp",
+  "../docs/examples/Bitmap_065.cpp",
+  "../docs/examples/Bitmap_066.cpp",
+  "../docs/examples/Bitmap_067.cpp",
+  "../docs/examples/Bitmap_068.cpp",
+  "../docs/examples/Bitmap_069.cpp",
+  "../docs/examples/Bitmap_070.cpp",
+  "../docs/examples/Bitmap_071.cpp",
+  "../docs/examples/Bitmap_072.cpp",
+  "../docs/examples/Bitmap_073.cpp",
+  "../docs/examples/Bitmap_074.cpp",
+  "../docs/examples/Bitmap_075.cpp",
+  "../docs/examples/Bitmap_076.cpp",
+  "../docs/examples/Bitmap_077.cpp",
+  "../docs/examples/BlendMode_000.cpp",
+  "../docs/examples/BlendMode_001.cpp",
+  "../docs/examples/BlendMode_002.cpp",
+  "../docs/examples/BlendMode_003.cpp",
+  "../docs/examples/BlendMode_004.cpp",
+  "../docs/examples/BlendMode_005.cpp",
+  "../docs/examples/BlendMode_006.cpp",
+  "../docs/examples/BlendMode_007.cpp",
+  "../docs/examples/BlendMode_008.cpp",
+  "../docs/examples/BlendMode_009.cpp",
+  "../docs/examples/BlendMode_010.cpp",
+  "../docs/examples/BlendMode_011.cpp",
+  "../docs/examples/BlendMode_012.cpp",
+  "../docs/examples/BlendMode_013.cpp",
+  "../docs/examples/BlendMode_014.cpp",
+  "../docs/examples/BlendMode_015.cpp",
+  "../docs/examples/BlendMode_016.cpp",
+  "../docs/examples/BlendMode_017.cpp",
+  "../docs/examples/BlendMode_018.cpp",
+  "../docs/examples/BlendMode_019.cpp",
+  "../docs/examples/BlendMode_020.cpp",
+  "../docs/examples/BlendMode_021.cpp",
+  "../docs/examples/BlendMode_022.cpp",
+  "../docs/examples/BlendMode_023.cpp",
+  "../docs/examples/BlendMode_024.cpp",
+  "../docs/examples/BlendMode_025.cpp",
+  "../docs/examples/BlendMode_026.cpp",
+  "../docs/examples/BlendMode_027.cpp",
+  "../docs/examples/BlendMode_028.cpp",
+  "../docs/examples/BlendMode_029.cpp",
+  "../docs/examples/Canvas_000.cpp",
+  "../docs/examples/Canvas_001.cpp",
+  "../docs/examples/Canvas_002.cpp",
+  "../docs/examples/Canvas_003.cpp",
+  "../docs/examples/Canvas_004.cpp",
+  "../docs/examples/Canvas_005.cpp",
+  "../docs/examples/Canvas_006.cpp",
+  "../docs/examples/Canvas_008.cpp",
+  "../docs/examples/Canvas_009.cpp",
+  "../docs/examples/Canvas_010.cpp",
+  "../docs/examples/Canvas_011.cpp",
+  "../docs/examples/Canvas_012.cpp",
+  "../docs/examples/Canvas_013.cpp",
+  "../docs/examples/Canvas_014.cpp",
+  "../docs/examples/Canvas_015.cpp",
+  "../docs/examples/Canvas_016.cpp",
+  "../docs/examples/Canvas_017.cpp",
+  "../docs/examples/Canvas_018.cpp",
+  "../docs/examples/Canvas_019.cpp",
+  "../docs/examples/Canvas_020.cpp",
+  "../docs/examples/Canvas_021.cpp",
+  "../docs/examples/Canvas_022.cpp",
+  "../docs/examples/Canvas_023.cpp",
+  "../docs/examples/Canvas_024.cpp",
+  "../docs/examples/Canvas_025.cpp",
+  "../docs/examples/Canvas_026.cpp",
+  "../docs/examples/Canvas_027.cpp",
+  "../docs/examples/Canvas_028.cpp",
+  "../docs/examples/Canvas_029.cpp",
+  "../docs/examples/Canvas_030.cpp",
+  "../docs/examples/Canvas_031.cpp",
+  "../docs/examples/Canvas_032.cpp",
+  "../docs/examples/Canvas_033.cpp",
+  "../docs/examples/Canvas_034.cpp",
+  "../docs/examples/Canvas_035.cpp",
+  "../docs/examples/Canvas_036.cpp",
+  "../docs/examples/Canvas_037.cpp",
+  "../docs/examples/Canvas_038.cpp",
+  "../docs/examples/Canvas_039.cpp",
+  "../docs/examples/Canvas_040.cpp",
+  "../docs/examples/Canvas_041.cpp",
+  "../docs/examples/Canvas_042.cpp",
+  "../docs/examples/Canvas_043.cpp",
+  "../docs/examples/Canvas_044.cpp",
+  "../docs/examples/Canvas_045.cpp",
+  "../docs/examples/Canvas_046.cpp",
+  "../docs/examples/Canvas_047.cpp",
+  "../docs/examples/Canvas_048.cpp",
+  "../docs/examples/Canvas_049.cpp",
+  "../docs/examples/Canvas_050.cpp",
+  "../docs/examples/Canvas_051.cpp",
+  "../docs/examples/Canvas_052.cpp",
+  "../docs/examples/Canvas_053.cpp",
+  "../docs/examples/Canvas_054.cpp",
+  "../docs/examples/Canvas_055.cpp",
+  "../docs/examples/Canvas_056.cpp",
+  "../docs/examples/Canvas_057.cpp",
+  "../docs/examples/Canvas_058.cpp",
+  "../docs/examples/Canvas_059.cpp",
+  "../docs/examples/Canvas_060.cpp",
+  "../docs/examples/Canvas_061.cpp",
+  "../docs/examples/Canvas_062.cpp",
+  "../docs/examples/Canvas_063.cpp",
+  "../docs/examples/Canvas_064.cpp",
+  "../docs/examples/Canvas_065.cpp",
+  "../docs/examples/Canvas_066.cpp",
+  "../docs/examples/Canvas_067.cpp",
+  "../docs/examples/Canvas_068.cpp",
+  "../docs/examples/Canvas_069.cpp",
+  "../docs/examples/Canvas_070.cpp",
+  "../docs/examples/Canvas_071.cpp",
+  "../docs/examples/Canvas_072.cpp",
+  "../docs/examples/Canvas_073.cpp",
+  "../docs/examples/Canvas_074.cpp",
+  "../docs/examples/Canvas_075.cpp",
+  "../docs/examples/Canvas_076.cpp",
+  "../docs/examples/Canvas_077.cpp",
+  "../docs/examples/Canvas_078.cpp",
+  "../docs/examples/Canvas_079.cpp",
+  "../docs/examples/Canvas_080.cpp",
+  "../docs/examples/Canvas_081.cpp",
+  "../docs/examples/Canvas_082.cpp",
+  "../docs/examples/Canvas_083.cpp",
+  "../docs/examples/Canvas_084.cpp",
+  "../docs/examples/Canvas_085.cpp",
+  "../docs/examples/Canvas_086.cpp",
+  "../docs/examples/Canvas_087.cpp",
+  "../docs/examples/Canvas_088.cpp",
+  "../docs/examples/Canvas_089.cpp",
+  "../docs/examples/Canvas_090.cpp",
+  "../docs/examples/Canvas_091.cpp",
+  "../docs/examples/Canvas_092.cpp",
+  "../docs/examples/Canvas_093.cpp",
+  "../docs/examples/Canvas_094.cpp",
+  "../docs/examples/Canvas_095.cpp",
+  "../docs/examples/Canvas_096.cpp",
+  "../docs/examples/Canvas_097.cpp",
+  "../docs/examples/Canvas_098.cpp",
+  "../docs/examples/Canvas_099.cpp",
+  "../docs/examples/Canvas_100.cpp",
+  "../docs/examples/Canvas_101.cpp",
+  "../docs/examples/Canvas_102.cpp",
+  "../docs/examples/Canvas_103.cpp",
+  "../docs/examples/Canvas_104.cpp",
+  "../docs/examples/Canvas_105.cpp",
+  "../docs/examples/Canvas_106.cpp",
+  "../docs/examples/Canvas_107.cpp",
+  "../docs/examples/Canvas_108.cpp",
+  "../docs/examples/Canvas_109.cpp",
+  "../docs/examples/Canvas_110.cpp",
+  "../docs/examples/Canvas_111.cpp",
+  "../docs/examples/Canvas_112.cpp",
+  "../docs/examples/Canvas_113.cpp",
+  "../docs/examples/Canvas_114.cpp",
+  "../docs/examples/Canvas_115.cpp",
+  "../docs/examples/Canvas_116.cpp",
+  "../docs/examples/Canvas_117.cpp",
+  "../docs/examples/Canvas_118.cpp",
+  "../docs/examples/Canvas_119.cpp",
+  "../docs/examples/Canvas_120.cpp",
+  "../docs/examples/Canvas_121.cpp",
+  "../docs/examples/Canvas_122.cpp",
+  "../docs/examples/Canvas_123.cpp",
+  "../docs/examples/Canvas_124.cpp",
+  "../docs/examples/Canvas_125.cpp",
+  "../docs/examples/Canvas_126.cpp",
+  "../docs/examples/Canvas_127.cpp",
+  "../docs/examples/Canvas_128.cpp",
+  "../docs/examples/Canvas_129.cpp",
+  "../docs/examples/Canvas_130.cpp",
+  "../docs/examples/Canvas_131.cpp",
+  "../docs/examples/Color4f_000.cpp",
+  "../docs/examples/Color4f_001.cpp",
+  "../docs/examples/Color4f_002.cpp",
+  "../docs/examples/Color4f_003.cpp",
+  "../docs/examples/Color4f_004.cpp",
+  "../docs/examples/Color4f_005.cpp",
+  "../docs/examples/Color_000.cpp",
+  "../docs/examples/Color_001.cpp",
+  "../docs/examples/Color_002.cpp",
+  "../docs/examples/Color_003.cpp",
+  "../docs/examples/Color_004.cpp",
+  "../docs/examples/Color_005.cpp",
+  "../docs/examples/Color_006.cpp",
+  "../docs/examples/Color_007.cpp",
+  "../docs/examples/Color_008.cpp",
+  "../docs/examples/Color_009.cpp",
+  "../docs/examples/Color_010.cpp",
+  "../docs/examples/Color_011.cpp",
+  "../docs/examples/Color_012.cpp",
+  "../docs/examples/Color_013.cpp",
+  "../docs/examples/Color_014.cpp",
+  "../docs/examples/Color_015.cpp",
+  "../docs/examples/Color_016.cpp",
+  "../docs/examples/Color_017.cpp",
+  "../docs/examples/Color_018.cpp",
+  "../docs/examples/Font_000.cpp",
+  "../docs/examples/Font_001.cpp",
+  "../docs/examples/Font_002.cpp",
+  "../docs/examples/Font_003.cpp",
+  "../docs/examples/Font_004.cpp",
+  "../docs/examples/Font_005.cpp",
+  "../docs/examples/Font_006.cpp",
+  "../docs/examples/Font_007.cpp",
+  "../docs/examples/Font_008.cpp",
+  "../docs/examples/Font_009.cpp",
+  "../docs/examples/Font_010.cpp",
+  "../docs/examples/Font_011.cpp",
+  "../docs/examples/Font_012.cpp",
+  "../docs/examples/Font_013.cpp",
+  "../docs/examples/Font_014.cpp",
+  "../docs/examples/Font_015.cpp",
+  "../docs/examples/Font_016.cpp",
+  "../docs/examples/Font_017.cpp",
+  "../docs/examples/Font_018.cpp",
+  "../docs/examples/Font_019.cpp",
+  "../docs/examples/Font_020.cpp",
+  "../docs/examples/Font_021.cpp",
+  "../docs/examples/Font_022.cpp",
+  "../docs/examples/Font_023.cpp",
+  "../docs/examples/Font_024.cpp",
+  "../docs/examples/Font_025.cpp",
+  "../docs/examples/Font_026.cpp",
+  "../docs/examples/Font_027.cpp",
+  "../docs/examples/Font_028.cpp",
+  "../docs/examples/Font_029.cpp",
+  "../docs/examples/Font_030.cpp",
+  "../docs/examples/Font_031.cpp",
+  "../docs/examples/Font_032.cpp",
+  "../docs/examples/Font_033.cpp",
+  "../docs/examples/Font_034.cpp",
+  "../docs/examples/Font_035.cpp",
+  "../docs/examples/Font_036.cpp",
+  "../docs/examples/Font_037.cpp",
+  "../docs/examples/Font_038.cpp",
+  "../docs/examples/IPoint_000.cpp",
+  "../docs/examples/IPoint_001.cpp",
+  "../docs/examples/IPoint_002.cpp",
+  "../docs/examples/IPoint_003.cpp",
+  "../docs/examples/IPoint_004.cpp",
+  "../docs/examples/IPoint_005.cpp",
+  "../docs/examples/IPoint_006.cpp",
+  "../docs/examples/IPoint_007.cpp",
+  "../docs/examples/IPoint_008.cpp",
+  "../docs/examples/IPoint_009.cpp",
+  "../docs/examples/IPoint_010.cpp",
+  "../docs/examples/IPoint_011.cpp",
+  "../docs/examples/IPoint_012.cpp",
+  "../docs/examples/IRect_000.cpp",
+  "../docs/examples/IRect_001.cpp",
+  "../docs/examples/IRect_002.cpp",
+  "../docs/examples/IRect_003.cpp",
+  "../docs/examples/IRect_004.cpp",
+  "../docs/examples/IRect_005.cpp",
+  "../docs/examples/IRect_006.cpp",
+  "../docs/examples/IRect_007.cpp",
+  "../docs/examples/IRect_008.cpp",
+  "../docs/examples/IRect_009.cpp",
+  "../docs/examples/IRect_010.cpp",
+  "../docs/examples/IRect_011.cpp",
+  "../docs/examples/IRect_012.cpp",
+  "../docs/examples/IRect_013.cpp",
+  "../docs/examples/IRect_014.cpp",
+  "../docs/examples/IRect_015.cpp",
+  "../docs/examples/IRect_016.cpp",
+  "../docs/examples/IRect_017.cpp",
+  "../docs/examples/IRect_018.cpp",
+  "../docs/examples/IRect_019.cpp",
+  "../docs/examples/IRect_020.cpp",
+  "../docs/examples/IRect_021.cpp",
+  "../docs/examples/IRect_022.cpp",
+  "../docs/examples/IRect_023.cpp",
+  "../docs/examples/IRect_024.cpp",
+  "../docs/examples/IRect_025.cpp",
+  "../docs/examples/IRect_026.cpp",
+  "../docs/examples/IRect_027.cpp",
+  "../docs/examples/IRect_028.cpp",
+  "../docs/examples/IRect_029.cpp",
+  "../docs/examples/IRect_030.cpp",
+  "../docs/examples/IRect_031.cpp",
+  "../docs/examples/IRect_032.cpp",
+  "../docs/examples/IRect_033.cpp",
+  "../docs/examples/IRect_034.cpp",
+  "../docs/examples/IRect_035.cpp",
+  "../docs/examples/IRect_036.cpp",
+  "../docs/examples/IRect_037.cpp",
+  "../docs/examples/IRect_038.cpp",
+  "../docs/examples/IRect_039.cpp",
+  "../docs/examples/IRect_040.cpp",
+  "../docs/examples/IRect_041.cpp",
+  "../docs/examples/IRect_042.cpp",
+  "../docs/examples/IRect_043.cpp",
+  "../docs/examples/IRect_044.cpp",
+  "../docs/examples/IRect_045.cpp",
+  "../docs/examples/IRect_046.cpp",
+  "../docs/examples/IRect_047.cpp",
+  "../docs/examples/IRect_048.cpp",
+  "../docs/examples/IRect_049.cpp",
+  "../docs/examples/ImageInfo_000.cpp",
+  "../docs/examples/ImageInfo_001.cpp",
+  "../docs/examples/ImageInfo_002.cpp",
+  "../docs/examples/ImageInfo_003.cpp",
+  "../docs/examples/ImageInfo_004.cpp",
+  "../docs/examples/ImageInfo_005.cpp",
+  "../docs/examples/ImageInfo_006.cpp",
+  "../docs/examples/ImageInfo_007.cpp",
+  "../docs/examples/ImageInfo_008.cpp",
+  "../docs/examples/ImageInfo_009.cpp",
+  "../docs/examples/ImageInfo_010.cpp",
+  "../docs/examples/ImageInfo_011.cpp",
+  "../docs/examples/ImageInfo_012.cpp",
+  "../docs/examples/ImageInfo_013.cpp",
+  "../docs/examples/ImageInfo_014.cpp",
+  "../docs/examples/ImageInfo_015.cpp",
+  "../docs/examples/ImageInfo_016.cpp",
+  "../docs/examples/ImageInfo_017.cpp",
+  "../docs/examples/ImageInfo_018.cpp",
+  "../docs/examples/ImageInfo_019.cpp",
+  "../docs/examples/ImageInfo_020.cpp",
+  "../docs/examples/ImageInfo_021.cpp",
+  "../docs/examples/ImageInfo_022.cpp",
+  "../docs/examples/ImageInfo_023.cpp",
+  "../docs/examples/ImageInfo_024.cpp",
+  "../docs/examples/ImageInfo_025.cpp",
+  "../docs/examples/ImageInfo_026.cpp",
+  "../docs/examples/ImageInfo_027.cpp",
+  "../docs/examples/ImageInfo_028.cpp",
+  "../docs/examples/ImageInfo_029.cpp",
+  "../docs/examples/ImageInfo_030.cpp",
+  "../docs/examples/ImageInfo_031.cpp",
+  "../docs/examples/ImageInfo_032.cpp",
+  "../docs/examples/ImageInfo_033.cpp",
+  "../docs/examples/ImageInfo_034.cpp",
+  "../docs/examples/ImageInfo_035.cpp",
+  "../docs/examples/ImageInfo_036.cpp",
+  "../docs/examples/ImageInfo_037.cpp",
+  "../docs/examples/ImageInfo_038.cpp",
+  "../docs/examples/ImageInfo_039.cpp",
+  "../docs/examples/ImageInfo_040.cpp",
+  "../docs/examples/ImageInfo_041.cpp",
+  "../docs/examples/ImageInfo_042.cpp",
+  "../docs/examples/ImageInfo_043.cpp",
+  "../docs/examples/ImageInfo_044.cpp",
+  "../docs/examples/ImageInfo_045.cpp",
+  "../docs/examples/ImageInfo_046.cpp",
+  "../docs/examples/ImageInfo_047.cpp",
+  "../docs/examples/ImageInfo_048.cpp",
+  "../docs/examples/ImageInfo_049.cpp",
+  "../docs/examples/ImageInfo_050.cpp",
+  "../docs/examples/ImageInfo_051.cpp",
+  "../docs/examples/Image_000.cpp",
+  "../docs/examples/Image_001.cpp",
+  "../docs/examples/Image_002.cpp",
+  "../docs/examples/Image_003.cpp",
+  "../docs/examples/Image_004.cpp",
+  "../docs/examples/Image_005.cpp",
+  "../docs/examples/Image_006.cpp",
+  "../docs/examples/Image_007.cpp",
+  "../docs/examples/Image_008.cpp",
+  "../docs/examples/Image_009.cpp",
+  "../docs/examples/Image_010.cpp",
+  "../docs/examples/Image_011.cpp",
+  "../docs/examples/Image_012.cpp",
+  "../docs/examples/Image_013.cpp",
+  "../docs/examples/Image_014.cpp",
+  "../docs/examples/Image_015.cpp",
+  "../docs/examples/Image_016.cpp",
+  "../docs/examples/Image_017.cpp",
+  "../docs/examples/Image_018.cpp",
+  "../docs/examples/Image_019.cpp",
+  "../docs/examples/Image_020.cpp",
+  "../docs/examples/Image_021.cpp",
+  "../docs/examples/Image_022.cpp",
+  "../docs/examples/Image_023.cpp",
+  "../docs/examples/Image_024.cpp",
+  "../docs/examples/Image_025.cpp",
+  "../docs/examples/Image_026.cpp",
+  "../docs/examples/Image_027.cpp",
+  "../docs/examples/Image_028.cpp",
+  "../docs/examples/Image_029.cpp",
+  "../docs/examples/Image_030.cpp",
+  "../docs/examples/Image_031.cpp",
+  "../docs/examples/Image_032.cpp",
+  "../docs/examples/Image_033.cpp",
+  "../docs/examples/Image_034.cpp",
+  "../docs/examples/Image_035.cpp",
+  "../docs/examples/Image_036.cpp",
+  "../docs/examples/Image_037.cpp",
+  "../docs/examples/Image_038.cpp",
+  "../docs/examples/Image_039.cpp",
+  "../docs/examples/Image_040.cpp",
+  "../docs/examples/Image_041.cpp",
+  "../docs/examples/Image_042.cpp",
+  "../docs/examples/Image_043.cpp",
+  "../docs/examples/Matrix_000.cpp",
+  "../docs/examples/Matrix_001.cpp",
+  "../docs/examples/Matrix_002.cpp",
+  "../docs/examples/Matrix_003.cpp",
+  "../docs/examples/Matrix_004.cpp",
+  "../docs/examples/Matrix_005.cpp",
+  "../docs/examples/Matrix_006.cpp",
+  "../docs/examples/Matrix_007.cpp",
+  "../docs/examples/Matrix_008.cpp",
+  "../docs/examples/Matrix_009.cpp",
+  "../docs/examples/Matrix_010.cpp",
+  "../docs/examples/Matrix_011.cpp",
+  "../docs/examples/Matrix_012.cpp",
+  "../docs/examples/Matrix_013.cpp",
+  "../docs/examples/Matrix_014.cpp",
+  "../docs/examples/Matrix_015.cpp",
+  "../docs/examples/Matrix_016.cpp",
+  "../docs/examples/Matrix_017.cpp",
+  "../docs/examples/Matrix_018.cpp",
+  "../docs/examples/Matrix_019.cpp",
+  "../docs/examples/Matrix_020.cpp",
+  "../docs/examples/Matrix_021.cpp",
+  "../docs/examples/Matrix_022.cpp",
+  "../docs/examples/Matrix_023.cpp",
+  "../docs/examples/Matrix_024.cpp",
+  "../docs/examples/Matrix_025.cpp",
+  "../docs/examples/Matrix_026.cpp",
+  "../docs/examples/Matrix_027.cpp",
+  "../docs/examples/Matrix_028.cpp",
+  "../docs/examples/Matrix_029.cpp",
+  "../docs/examples/Matrix_030.cpp",
+  "../docs/examples/Matrix_031.cpp",
+  "../docs/examples/Matrix_032.cpp",
+  "../docs/examples/Matrix_033.cpp",
+  "../docs/examples/Matrix_034.cpp",
+  "../docs/examples/Matrix_035.cpp",
+  "../docs/examples/Matrix_036.cpp",
+  "../docs/examples/Matrix_037.cpp",
+  "../docs/examples/Matrix_038.cpp",
+  "../docs/examples/Matrix_039.cpp",
+  "../docs/examples/Matrix_040.cpp",
+  "../docs/examples/Matrix_041.cpp",
+  "../docs/examples/Matrix_042.cpp",
+  "../docs/examples/Matrix_043.cpp",
+  "../docs/examples/Matrix_044.cpp",
+  "../docs/examples/Matrix_045.cpp",
+  "../docs/examples/Matrix_046.cpp",
+  "../docs/examples/Matrix_047.cpp",
+  "../docs/examples/Matrix_048.cpp",
+  "../docs/examples/Matrix_049.cpp",
+  "../docs/examples/Matrix_050.cpp",
+  "../docs/examples/Matrix_051.cpp",
+  "../docs/examples/Matrix_052.cpp",
+  "../docs/examples/Matrix_053.cpp",
+  "../docs/examples/Matrix_054.cpp",
+  "../docs/examples/Matrix_055.cpp",
+  "../docs/examples/Matrix_056.cpp",
+  "../docs/examples/Matrix_057.cpp",
+  "../docs/examples/Matrix_058.cpp",
+  "../docs/examples/Matrix_059.cpp",
+  "../docs/examples/Matrix_060.cpp",
+  "../docs/examples/Matrix_061.cpp",
+  "../docs/examples/Matrix_062.cpp",
+  "../docs/examples/Matrix_063.cpp",
+  "../docs/examples/Matrix_064.cpp",
+  "../docs/examples/Matrix_065.cpp",
+  "../docs/examples/Matrix_066.cpp",
+  "../docs/examples/Matrix_067.cpp",
+  "../docs/examples/Matrix_068.cpp",
+  "../docs/examples/Matrix_069.cpp",
+  "../docs/examples/Matrix_070.cpp",
+  "../docs/examples/Matrix_071.cpp",
+  "../docs/examples/Matrix_072.cpp",
+  "../docs/examples/Matrix_073.cpp",
+  "../docs/examples/Matrix_074.cpp",
+  "../docs/examples/Matrix_075.cpp",
+  "../docs/examples/Matrix_076.cpp",
+  "../docs/examples/Matrix_077.cpp",
+  "../docs/examples/Matrix_078.cpp",
+  "../docs/examples/Matrix_079.cpp",
+  "../docs/examples/Matrix_080.cpp",
+  "../docs/examples/Matrix_081.cpp",
+  "../docs/examples/Matrix_082.cpp",
+  "../docs/examples/Matrix_083.cpp",
+  "../docs/examples/Matrix_084.cpp",
+  "../docs/examples/Matrix_085.cpp",
+  "../docs/examples/Matrix_086.cpp",
+  "../docs/examples/Matrix_087.cpp",
+  "../docs/examples/Matrix_088.cpp",
+  "../docs/examples/Matrix_089.cpp",
+  "../docs/examples/Matrix_090.cpp",
+  "../docs/examples/Matrix_091.cpp",
+  "../docs/examples/Matrix_092.cpp",
+  "../docs/examples/Matrix_093.cpp",
+  "../docs/examples/Matrix_094.cpp",
+  "../docs/examples/Matrix_095.cpp",
+  "../docs/examples/Matrix_096.cpp",
+  "../docs/examples/Matrix_097.cpp",
+  "../docs/examples/Matrix_098.cpp",
+  "../docs/examples/Matrix_099.cpp",
+  "../docs/examples/Matrix_100.cpp",
+  "../docs/examples/Matrix_101.cpp",
+  "../docs/examples/Matrix_102.cpp",
+  "../docs/examples/Matrix_103.cpp",
+  "../docs/examples/Matrix_104.cpp",
+  "../docs/examples/Matrix_105.cpp",
+  "../docs/examples/Matrix_106.cpp",
+  "../docs/examples/Matrix_107.cpp",
+  "../docs/examples/Paint_000.cpp",
+  "../docs/examples/Paint_001.cpp",
+  "../docs/examples/Paint_002.cpp",
+  "../docs/examples/Paint_003.cpp",
+  "../docs/examples/Paint_004.cpp",
+  "../docs/examples/Paint_005.cpp",
+  "../docs/examples/Paint_006.cpp",
+  "../docs/examples/Paint_007.cpp",
+  "../docs/examples/Paint_008.cpp",
+  "../docs/examples/Paint_009.cpp",
+  "../docs/examples/Paint_010.cpp",
+  "../docs/examples/Paint_011.cpp",
+  "../docs/examples/Paint_012.cpp",
+  "../docs/examples/Paint_013.cpp",
+  "../docs/examples/Paint_014.cpp",
+  "../docs/examples/Paint_015.cpp",
+  "../docs/examples/Paint_016.cpp",
+  "../docs/examples/Paint_017.cpp",
+  "../docs/examples/Paint_018.cpp",
+  "../docs/examples/Paint_019.cpp",
+  "../docs/examples/Paint_020.cpp",
+  "../docs/examples/Paint_021.cpp",
+  "../docs/examples/Paint_022.cpp",
+  "../docs/examples/Paint_023.cpp",
+  "../docs/examples/Paint_024.cpp",
+  "../docs/examples/Paint_025.cpp",
+  "../docs/examples/Paint_026.cpp",
+  "../docs/examples/Paint_027.cpp",
+  "../docs/examples/Paint_028.cpp",
+  "../docs/examples/Paint_029.cpp",
+  "../docs/examples/Paint_030.cpp",
+  "../docs/examples/Paint_031.cpp",
+  "../docs/examples/Paint_032.cpp",
+  "../docs/examples/Paint_033.cpp",
+  "../docs/examples/Paint_034.cpp",
+  "../docs/examples/Paint_035.cpp",
+  "../docs/examples/Paint_036.cpp",
+  "../docs/examples/Paint_037.cpp",
+  "../docs/examples/Paint_038.cpp",
+  "../docs/examples/Paint_039.cpp",
+  "../docs/examples/Paint_040.cpp",
+  "../docs/examples/Paint_041.cpp",
+  "../docs/examples/Paint_042.cpp",
+  "../docs/examples/Paint_043.cpp",
+  "../docs/examples/Paint_044.cpp",
+  "../docs/examples/Paint_045.cpp",
+  "../docs/examples/Paint_046.cpp",
+  "../docs/examples/Paint_047.cpp",
+  "../docs/examples/Paint_048.cpp",
+  "../docs/examples/Paint_049.cpp",
+  "../docs/examples/Paint_050.cpp",
+  "../docs/examples/Paint_051.cpp",
+  "../docs/examples/Paint_052.cpp",
+  "../docs/examples/Paint_053.cpp",
+  "../docs/examples/Paint_054.cpp",
+  "../docs/examples/Paint_055.cpp",
+  "../docs/examples/Paint_056.cpp",
+  "../docs/examples/Paint_057.cpp",
+  "../docs/examples/Paint_058.cpp",
+  "../docs/examples/Paint_059.cpp",
+  "../docs/examples/Paint_060.cpp",
+  "../docs/examples/Paint_061.cpp",
+  "../docs/examples/Paint_062.cpp",
+  "../docs/examples/Paint_063.cpp",
+  "../docs/examples/Paint_064.cpp",
+  "../docs/examples/Paint_065.cpp",
+  "../docs/examples/Paint_066.cpp",
+  "../docs/examples/Paint_067.cpp",
+  "../docs/examples/Paint_068.cpp",
+  "../docs/examples/Paint_069.cpp",
+  "../docs/examples/Paint_070.cpp",
+  "../docs/examples/Paint_071.cpp",
+  "../docs/examples/Paint_072.cpp",
+  "../docs/examples/Paint_073.cpp",
+  "../docs/examples/Paint_074.cpp",
+  "../docs/examples/Paint_075.cpp",
+  "../docs/examples/Paint_076.cpp",
+  "../docs/examples/Paint_077.cpp",
+  "../docs/examples/Paint_078.cpp",
+  "../docs/examples/Paint_079.cpp",
+  "../docs/examples/Paint_080.cpp",
+  "../docs/examples/Paint_081.cpp",
+  "../docs/examples/Paint_082.cpp",
+  "../docs/examples/Paint_083.cpp",
+  "../docs/examples/Paint_084.cpp",
+  "../docs/examples/Paint_085.cpp",
+  "../docs/examples/Paint_086.cpp",
+  "../docs/examples/Paint_087.cpp",
+  "../docs/examples/Paint_088.cpp",
+  "../docs/examples/Paint_089.cpp",
+  "../docs/examples/Paint_090.cpp",
+  "../docs/examples/Paint_091.cpp",
+  "../docs/examples/Paint_092.cpp",
+  "../docs/examples/Paint_093.cpp",
+  "../docs/examples/Paint_094.cpp",
+  "../docs/examples/Paint_095.cpp",
+  "../docs/examples/Paint_096.cpp",
+  "../docs/examples/Paint_097.cpp",
+  "../docs/examples/Paint_098.cpp",
+  "../docs/examples/Paint_099.cpp",
+  "../docs/examples/Paint_100.cpp",
+  "../docs/examples/Paint_101.cpp",
+  "../docs/examples/Paint_102.cpp",
+  "../docs/examples/Paint_103.cpp",
+  "../docs/examples/Paint_104.cpp",
+  "../docs/examples/Paint_105.cpp",
+  "../docs/examples/Paint_106.cpp",
+  "../docs/examples/Paint_107.cpp",
+  "../docs/examples/Paint_108.cpp",
+  "../docs/examples/Paint_109.cpp",
+  "../docs/examples/Paint_110.cpp",
+  "../docs/examples/Paint_111.cpp",
+  "../docs/examples/Paint_112.cpp",
+  "../docs/examples/Paint_113.cpp",
+  "../docs/examples/Paint_114.cpp",
+  "../docs/examples/Paint_115.cpp",
+  "../docs/examples/Paint_116.cpp",
+  "../docs/examples/Paint_117.cpp",
+  "../docs/examples/Path_000.cpp",
+  "../docs/examples/Path_001.cpp",
+  "../docs/examples/Path_002.cpp",
+  "../docs/examples/Path_003.cpp",
+  "../docs/examples/Path_004.cpp",
+  "../docs/examples/Path_005.cpp",
+  "../docs/examples/Path_006.cpp",
+  "../docs/examples/Path_007.cpp",
+  "../docs/examples/Path_008.cpp",
+  "../docs/examples/Path_009.cpp",
+  "../docs/examples/Path_010.cpp",
+  "../docs/examples/Path_011.cpp",
+  "../docs/examples/Path_012.cpp",
+  "../docs/examples/Path_013.cpp",
+  "../docs/examples/Path_014.cpp",
+  "../docs/examples/Path_015.cpp",
+  "../docs/examples/Path_016.cpp",
+  "../docs/examples/Path_017.cpp",
+  "../docs/examples/Path_018.cpp",
+  "../docs/examples/Path_019.cpp",
+  "../docs/examples/Path_020.cpp",
+  "../docs/examples/Path_021.cpp",
+  "../docs/examples/Path_022.cpp",
+  "../docs/examples/Path_023.cpp",
+  "../docs/examples/Path_024.cpp",
+  "../docs/examples/Path_025.cpp",
+  "../docs/examples/Path_026.cpp",
+  "../docs/examples/Path_027.cpp",
+  "../docs/examples/Path_028.cpp",
+  "../docs/examples/Path_029.cpp",
+  "../docs/examples/Path_030.cpp",
+  "../docs/examples/Path_031.cpp",
+  "../docs/examples/Path_032.cpp",
+  "../docs/examples/Path_033.cpp",
+  "../docs/examples/Path_034.cpp",
+  "../docs/examples/Path_035.cpp",
+  "../docs/examples/Path_036.cpp",
+  "../docs/examples/Path_037.cpp",
+  "../docs/examples/Path_038.cpp",
+  "../docs/examples/Path_039.cpp",
+  "../docs/examples/Path_040.cpp",
+  "../docs/examples/Path_041.cpp",
+  "../docs/examples/Path_042.cpp",
+  "../docs/examples/Path_043.cpp",
+  "../docs/examples/Path_044.cpp",
+  "../docs/examples/Path_045.cpp",
+  "../docs/examples/Path_046.cpp",
+  "../docs/examples/Path_047.cpp",
+  "../docs/examples/Path_048.cpp",
+  "../docs/examples/Path_049.cpp",
+  "../docs/examples/Path_050.cpp",
+  "../docs/examples/Path_051.cpp",
+  "../docs/examples/Path_052.cpp",
+  "../docs/examples/Path_053.cpp",
+  "../docs/examples/Path_054.cpp",
+  "../docs/examples/Path_055.cpp",
+  "../docs/examples/Path_056.cpp",
+  "../docs/examples/Path_057.cpp",
+  "../docs/examples/Path_058.cpp",
+  "../docs/examples/Path_059.cpp",
+  "../docs/examples/Path_060.cpp",
+  "../docs/examples/Path_061.cpp",
+  "../docs/examples/Path_062.cpp",
+  "../docs/examples/Path_063.cpp",
+  "../docs/examples/Path_064.cpp",
+  "../docs/examples/Path_065.cpp",
+  "../docs/examples/Path_066.cpp",
+  "../docs/examples/Path_067.cpp",
+  "../docs/examples/Path_068.cpp",
+  "../docs/examples/Path_069.cpp",
+  "../docs/examples/Path_070.cpp",
+  "../docs/examples/Path_071.cpp",
+  "../docs/examples/Path_072.cpp",
+  "../docs/examples/Path_073.cpp",
+  "../docs/examples/Path_074.cpp",
+  "../docs/examples/Path_075.cpp",
+  "../docs/examples/Path_076.cpp",
+  "../docs/examples/Path_077.cpp",
+  "../docs/examples/Path_078.cpp",
+  "../docs/examples/Path_079.cpp",
+  "../docs/examples/Path_080.cpp",
+  "../docs/examples/Path_081.cpp",
+  "../docs/examples/Path_082.cpp",
+  "../docs/examples/Path_083.cpp",
+  "../docs/examples/Path_084.cpp",
+  "../docs/examples/Path_085.cpp",
+  "../docs/examples/Path_086.cpp",
+  "../docs/examples/Path_087.cpp",
+  "../docs/examples/Path_088.cpp",
+  "../docs/examples/Path_089.cpp",
+  "../docs/examples/Path_090.cpp",
+  "../docs/examples/Path_091.cpp",
+  "../docs/examples/Path_092.cpp",
+  "../docs/examples/Path_093.cpp",
+  "../docs/examples/Path_094.cpp",
+  "../docs/examples/Path_095.cpp",
+  "../docs/examples/Path_096.cpp",
+  "../docs/examples/Path_097.cpp",
+  "../docs/examples/Path_098.cpp",
+  "../docs/examples/Path_099.cpp",
+  "../docs/examples/Path_100.cpp",
+  "../docs/examples/Path_101.cpp",
+  "../docs/examples/Path_102.cpp",
+  "../docs/examples/Path_103.cpp",
+  "../docs/examples/Path_104.cpp",
+  "../docs/examples/Path_105.cpp",
+  "../docs/examples/Path_106.cpp",
+  "../docs/examples/Path_107.cpp",
+  "../docs/examples/Path_108.cpp",
+  "../docs/examples/Path_109.cpp",
+  "../docs/examples/Path_110.cpp",
+  "../docs/examples/Path_111.cpp",
+  "../docs/examples/Path_112.cpp",
+  "../docs/examples/Path_113.cpp",
+  "../docs/examples/Path_114.cpp",
+  "../docs/examples/Path_115.cpp",
+  "../docs/examples/Path_116.cpp",
+  "../docs/examples/Path_117.cpp",
+  "../docs/examples/Path_118.cpp",
+  "../docs/examples/Path_119.cpp",
+  "../docs/examples/Path_120.cpp",
+  "../docs/examples/Path_121.cpp",
+  "../docs/examples/Path_122.cpp",
+  "../docs/examples/Path_123.cpp",
+  "../docs/examples/Path_124.cpp",
+  "../docs/examples/Path_125.cpp",
+  "../docs/examples/Path_126.cpp",
+  "../docs/examples/Path_127.cpp",
+  "../docs/examples/Picture_000.cpp",
+  "../docs/examples/Picture_001.cpp",
+  "../docs/examples/Picture_002.cpp",
+  "../docs/examples/Picture_003.cpp",
+  "../docs/examples/Picture_004.cpp",
+  "../docs/examples/Picture_005.cpp",
+  "../docs/examples/Picture_006.cpp",
+  "../docs/examples/Picture_007.cpp",
+  "../docs/examples/Picture_008.cpp",
+  "../docs/examples/Picture_009.cpp",
+  "../docs/examples/Picture_010.cpp",
+  "../docs/examples/Picture_011.cpp",
+  "../docs/examples/Pixmap_000.cpp",
+  "../docs/examples/Pixmap_001.cpp",
+  "../docs/examples/Pixmap_002.cpp",
+  "../docs/examples/Pixmap_003.cpp",
+  "../docs/examples/Pixmap_004.cpp",
+  "../docs/examples/Pixmap_005.cpp",
+  "../docs/examples/Pixmap_006.cpp",
+  "../docs/examples/Pixmap_007.cpp",
+  "../docs/examples/Pixmap_008.cpp",
+  "../docs/examples/Pixmap_009.cpp",
+  "../docs/examples/Pixmap_010.cpp",
+  "../docs/examples/Pixmap_011.cpp",
+  "../docs/examples/Pixmap_012.cpp",
+  "../docs/examples/Pixmap_013.cpp",
+  "../docs/examples/Pixmap_014.cpp",
+  "../docs/examples/Pixmap_015.cpp",
+  "../docs/examples/Pixmap_016.cpp",
+  "../docs/examples/Pixmap_017.cpp",
+  "../docs/examples/Pixmap_018.cpp",
+  "../docs/examples/Pixmap_019.cpp",
+  "../docs/examples/Pixmap_020.cpp",
+  "../docs/examples/Pixmap_021.cpp",
+  "../docs/examples/Pixmap_022.cpp",
+  "../docs/examples/Pixmap_023.cpp",
+  "../docs/examples/Pixmap_024.cpp",
+  "../docs/examples/Pixmap_025.cpp",
+  "../docs/examples/Pixmap_026.cpp",
+  "../docs/examples/Pixmap_027.cpp",
+  "../docs/examples/Pixmap_028.cpp",
+  "../docs/examples/Pixmap_029.cpp",
+  "../docs/examples/Pixmap_030.cpp",
+  "../docs/examples/Pixmap_031.cpp",
+  "../docs/examples/Pixmap_032.cpp",
+  "../docs/examples/Pixmap_033.cpp",
+  "../docs/examples/Pixmap_034.cpp",
+  "../docs/examples/Pixmap_035.cpp",
+  "../docs/examples/Pixmap_036.cpp",
+  "../docs/examples/Pixmap_037.cpp",
+  "../docs/examples/Pixmap_038.cpp",
+  "../docs/examples/Pixmap_039.cpp",
+  "../docs/examples/Pixmap_040.cpp",
+  "../docs/examples/Pixmap_041.cpp",
+  "../docs/examples/Pixmap_042.cpp",
+  "../docs/examples/Pixmap_043.cpp",
+  "../docs/examples/Pixmap_044.cpp",
+  "../docs/examples/Pixmap_045.cpp",
+  "../docs/examples/Pixmap_046.cpp",
+  "../docs/examples/Point_000.cpp",
+  "../docs/examples/Point_001.cpp",
+  "../docs/examples/Point_002.cpp",
+  "../docs/examples/Point_003.cpp",
+  "../docs/examples/Point_004.cpp",
+  "../docs/examples/Point_005.cpp",
+  "../docs/examples/Point_006.cpp",
+  "../docs/examples/Point_007.cpp",
+  "../docs/examples/Point_008.cpp",
+  "../docs/examples/Point_009.cpp",
+  "../docs/examples/Point_010.cpp",
+  "../docs/examples/Point_011.cpp",
+  "../docs/examples/Point_012.cpp",
+  "../docs/examples/Point_013.cpp",
+  "../docs/examples/Point_014.cpp",
+  "../docs/examples/Point_015.cpp",
+  "../docs/examples/Point_016.cpp",
+  "../docs/examples/Point_017.cpp",
+  "../docs/examples/Point_018.cpp",
+  "../docs/examples/Point_019.cpp",
+  "../docs/examples/Point_020.cpp",
+  "../docs/examples/Point_021.cpp",
+  "../docs/examples/Point_022.cpp",
+  "../docs/examples/Point_023.cpp",
+  "../docs/examples/Point_024.cpp",
+  "../docs/examples/Point_025.cpp",
+  "../docs/examples/Point_026.cpp",
+  "../docs/examples/Point_027.cpp",
+  "../docs/examples/Point_028.cpp",
+  "../docs/examples/Point_029.cpp",
+  "../docs/examples/Point_030.cpp",
+  "../docs/examples/Point_031.cpp",
+  "../docs/examples/Point_032.cpp",
+  "../docs/examples/Point_033.cpp",
+  "../docs/examples/Point_034.cpp",
+  "../docs/examples/Point_035.cpp",
+  "../docs/examples/Point_036.cpp",
+  "../docs/examples/Point_037.cpp",
+  "../docs/examples/RRect_000.cpp",
+  "../docs/examples/RRect_001.cpp",
+  "../docs/examples/RRect_002.cpp",
+  "../docs/examples/RRect_003.cpp",
+  "../docs/examples/RRect_004.cpp",
+  "../docs/examples/RRect_005.cpp",
+  "../docs/examples/RRect_006.cpp",
+  "../docs/examples/RRect_007.cpp",
+  "../docs/examples/RRect_008.cpp",
+  "../docs/examples/RRect_009.cpp",
+  "../docs/examples/RRect_010.cpp",
+  "../docs/examples/RRect_011.cpp",
+  "../docs/examples/RRect_012.cpp",
+  "../docs/examples/RRect_013.cpp",
+  "../docs/examples/RRect_014.cpp",
+  "../docs/examples/RRect_015.cpp",
+  "../docs/examples/RRect_016.cpp",
+  "../docs/examples/RRect_017.cpp",
+  "../docs/examples/RRect_018.cpp",
+  "../docs/examples/RRect_019.cpp",
+  "../docs/examples/RRect_020.cpp",
+  "../docs/examples/RRect_021.cpp",
+  "../docs/examples/RRect_022.cpp",
+  "../docs/examples/RRect_023.cpp",
+  "../docs/examples/RRect_024.cpp",
+  "../docs/examples/RRect_025.cpp",
+  "../docs/examples/RRect_026.cpp",
+  "../docs/examples/RRect_027.cpp",
+  "../docs/examples/RRect_028.cpp",
+  "../docs/examples/RRect_029.cpp",
+  "../docs/examples/RRect_030.cpp",
+  "../docs/examples/RRect_031.cpp",
+  "../docs/examples/RRect_032.cpp",
+  "../docs/examples/RRect_033.cpp",
+  "../docs/examples/RRect_034.cpp",
+  "../docs/examples/RRect_035.cpp",
+  "../docs/examples/RRect_036.cpp",
+  "../docs/examples/RRect_037.cpp",
+  "../docs/examples/RRect_038.cpp",
+  "../docs/examples/RRect_039.cpp",
+  "../docs/examples/RRect_040.cpp",
+  "../docs/examples/RRect_041.cpp",
+  "../docs/examples/RRect_042.cpp",
+  "../docs/examples/RRect_043.cpp",
+  "../docs/examples/RRect_044.cpp",
+  "../docs/examples/Rect_000.cpp",
+  "../docs/examples/Rect_001.cpp",
+  "../docs/examples/Rect_002.cpp",
+  "../docs/examples/Rect_003.cpp",
+  "../docs/examples/Rect_004.cpp",
+  "../docs/examples/Rect_005.cpp",
+  "../docs/examples/Rect_006.cpp",
+  "../docs/examples/Rect_007.cpp",
+  "../docs/examples/Rect_008.cpp",
+  "../docs/examples/Rect_009.cpp",
+  "../docs/examples/Rect_010.cpp",
+  "../docs/examples/Rect_011.cpp",
+  "../docs/examples/Rect_012.cpp",
+  "../docs/examples/Rect_013.cpp",
+  "../docs/examples/Rect_014.cpp",
+  "../docs/examples/Rect_015.cpp",
+  "../docs/examples/Rect_016.cpp",
+  "../docs/examples/Rect_017.cpp",
+  "../docs/examples/Rect_018.cpp",
+  "../docs/examples/Rect_019.cpp",
+  "../docs/examples/Rect_020.cpp",
+  "../docs/examples/Rect_021.cpp",
+  "../docs/examples/Rect_022.cpp",
+  "../docs/examples/Rect_023.cpp",
+  "../docs/examples/Rect_024.cpp",
+  "../docs/examples/Rect_025.cpp",
+  "../docs/examples/Rect_026.cpp",
+  "../docs/examples/Rect_027.cpp",
+  "../docs/examples/Rect_028.cpp",
+  "../docs/examples/Rect_029.cpp",
+  "../docs/examples/Rect_030.cpp",
+  "../docs/examples/Rect_031.cpp",
+  "../docs/examples/Rect_032.cpp",
+  "../docs/examples/Rect_033.cpp",
+  "../docs/examples/Rect_034.cpp",
+  "../docs/examples/Rect_035.cpp",
+  "../docs/examples/Rect_036.cpp",
+  "../docs/examples/Rect_037.cpp",
+  "../docs/examples/Rect_038.cpp",
+  "../docs/examples/Rect_039.cpp",
+  "../docs/examples/Rect_040.cpp",
+  "../docs/examples/Rect_041.cpp",
+  "../docs/examples/Rect_042.cpp",
+  "../docs/examples/Rect_043.cpp",
+  "../docs/examples/Rect_044.cpp",
+  "../docs/examples/Rect_045.cpp",
+  "../docs/examples/Rect_046.cpp",
+  "../docs/examples/Rect_047.cpp",
+  "../docs/examples/Rect_048.cpp",
+  "../docs/examples/Rect_049.cpp",
+  "../docs/examples/Rect_050.cpp",
+  "../docs/examples/Rect_051.cpp",
+  "../docs/examples/Rect_052.cpp",
+  "../docs/examples/Rect_053.cpp",
+  "../docs/examples/Rect_054.cpp",
+  "../docs/examples/Rect_055.cpp",
+  "../docs/examples/Rect_056.cpp",
+  "../docs/examples/Rect_057.cpp",
+  "../docs/examples/Rect_058.cpp",
+  "../docs/examples/Rect_059.cpp",
+  "../docs/examples/Rect_060.cpp",
+  "../docs/examples/Rect_061.cpp",
+  "../docs/examples/Rect_062.cpp",
+  "../docs/examples/Rect_063.cpp",
+  "../docs/examples/Rect_064.cpp",
+  "../docs/examples/Rect_065.cpp",
+  "../docs/examples/Rect_066.cpp",
+  "../docs/examples/Rect_067.cpp",
+  "../docs/examples/Rect_068.cpp",
+  "../docs/examples/Rect_069.cpp",
+  "../docs/examples/Region_000.cpp",
+  "../docs/examples/Region_001.cpp",
+  "../docs/examples/Region_002.cpp",
+  "../docs/examples/Region_003.cpp",
+  "../docs/examples/Region_004.cpp",
+  "../docs/examples/Region_005.cpp",
+  "../docs/examples/Region_006.cpp",
+  "../docs/examples/Region_007.cpp",
+  "../docs/examples/Region_008.cpp",
+  "../docs/examples/Region_009.cpp",
+  "../docs/examples/Region_010.cpp",
+  "../docs/examples/Region_011.cpp",
+  "../docs/examples/Region_012.cpp",
+  "../docs/examples/Region_013.cpp",
+  "../docs/examples/Region_014.cpp",
+  "../docs/examples/Region_015.cpp",
+  "../docs/examples/Region_016.cpp",
+  "../docs/examples/Region_017.cpp",
+  "../docs/examples/Region_018.cpp",
+  "../docs/examples/Region_019.cpp",
+  "../docs/examples/Region_020.cpp",
+  "../docs/examples/Region_021.cpp",
+  "../docs/examples/Region_022.cpp",
+  "../docs/examples/Region_023.cpp",
+  "../docs/examples/Region_024.cpp",
+  "../docs/examples/Region_025.cpp",
+  "../docs/examples/Region_026.cpp",
+  "../docs/examples/Region_027.cpp",
+  "../docs/examples/Region_028.cpp",
+  "../docs/examples/Region_029.cpp",
+  "../docs/examples/Region_030.cpp",
+  "../docs/examples/Region_031.cpp",
+  "../docs/examples/Region_032.cpp",
+  "../docs/examples/Region_033.cpp",
+  "../docs/examples/Region_034.cpp",
+  "../docs/examples/Region_035.cpp",
+  "../docs/examples/Region_036.cpp",
+  "../docs/examples/Region_037.cpp",
+  "../docs/examples/Region_038.cpp",
+  "../docs/examples/Region_039.cpp",
+  "../docs/examples/Region_040.cpp",
+  "../docs/examples/Region_041.cpp",
+  "../docs/examples/Region_042.cpp",
+  "../docs/examples/Region_043.cpp",
+  "../docs/examples/Region_044.cpp",
+  "../docs/examples/Region_045.cpp",
+  "../docs/examples/Region_046.cpp",
+  "../docs/examples/Region_047.cpp",
+  "../docs/examples/Region_048.cpp",
+  "../docs/examples/Region_049.cpp",
+  "../docs/examples/Region_050.cpp",
+  "../docs/examples/Region_051.cpp",
+  "../docs/examples/Region_052.cpp",
+  "../docs/examples/Region_053.cpp",
+  "../docs/examples/Region_054.cpp",
+  "../docs/examples/Surface_000.cpp",
+  "../docs/examples/Surface_001.cpp",
+  "../docs/examples/Surface_002.cpp",
+  "../docs/examples/Surface_003.cpp",
+  "../docs/examples/Surface_004.cpp",
+  "../docs/examples/Surface_005.cpp",
+  "../docs/examples/Surface_006.cpp",
+  "../docs/examples/Surface_007.cpp",
+  "../docs/examples/Surface_008.cpp",
+  "../docs/examples/Surface_009.cpp",
+  "../docs/examples/Surface_010.cpp",
+  "../docs/examples/Surface_011.cpp",
+  "../docs/examples/Surface_012.cpp",
+  "../docs/examples/Surface_013.cpp",
+  "../docs/examples/Surface_014.cpp",
+  "../docs/examples/Surface_015.cpp",
+  "../docs/examples/Surface_016.cpp",
+  "../docs/examples/Surface_017.cpp",
+  "../docs/examples/Surface_018.cpp",
+  "../docs/examples/Surface_019.cpp",
+  "../docs/examples/Surface_020.cpp",
+  "../docs/examples/Surface_021.cpp",
+  "../docs/examples/Surface_022.cpp",
+  "../docs/examples/Surface_023.cpp",
+  "../docs/examples/Surface_024.cpp",
+  "../docs/examples/Surface_025.cpp",
+  "../docs/examples/Surface_026.cpp",
+  "../docs/examples/Surface_027.cpp",
+  "../docs/examples/Surface_028.cpp",
+  "../docs/examples/TextBlobBuilder_000.cpp",
+  "../docs/examples/TextBlobBuilder_001.cpp",
+  "../docs/examples/TextBlobBuilder_002.cpp",
+  "../docs/examples/TextBlobBuilder_003.cpp",
+  "../docs/examples/TextBlobBuilder_004.cpp",
+  "../docs/examples/TextBlob_000.cpp",
+  "../docs/examples/TextBlob_001.cpp",
+  "../docs/examples/TextBlob_002.cpp",
+  "../docs/examples/TextBlob_003.cpp",
+  "../docs/examples/TextBlob_004.cpp",
+  "../docs/examples/TextBlob_005.cpp",
+  "../docs/examples/TextBlob_006.cpp",
+  "../docs/examples/TextBlob_007.cpp",
+], "abspath")
diff --git a/gn/make_examples_gni.py b/gn/make_examples_gni.py
new file mode 100755
index 0000000..2fa2e97
--- /dev/null
+++ b/gn/make_examples_gni.py
@@ -0,0 +1,19 @@
+#! /usr/bin/env python
+# Copyright 2019 Google LLC.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import glob
+import os
+head = '''# Copyright 2019 Google LLC.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+'''
+def gni(path, name, files):
+    with open(path, 'w') as o:
+        o.write('%s\n%s = get_path_info([\n' % (head, name))
+        for x in sorted(files):
+            o.write('  "%s",\n' % x)
+        o.write('], "abspath")\n')
+if __name__ == '__main__':
+    os.chdir(os.path.dirname(__file__))
+    gni('examples.gni', 'examples_sources', glob.glob('../docs/examples/*.cpp'))
diff --git a/resources/images/example_1.png b/resources/images/example_1.png
new file mode 100644
index 0000000..6608834
--- /dev/null
+++ b/resources/images/example_1.png
Binary files differ
diff --git a/resources/images/example_2.png b/resources/images/example_2.png
new file mode 100644
index 0000000..85428dc
--- /dev/null
+++ b/resources/images/example_2.png
Binary files differ
diff --git a/resources/images/example_3.png b/resources/images/example_3.png
new file mode 100644
index 0000000..188cae5
--- /dev/null
+++ b/resources/images/example_3.png
Binary files differ
diff --git a/resources/images/example_4.png b/resources/images/example_4.png
new file mode 100644
index 0000000..9a16234
--- /dev/null
+++ b/resources/images/example_4.png
Binary files differ
diff --git a/resources/images/example_5.png b/resources/images/example_5.png
new file mode 100644
index 0000000..a8e58cc
--- /dev/null
+++ b/resources/images/example_5.png
Binary files differ
diff --git a/resources/images/example_6.png b/resources/images/example_6.png
new file mode 100644
index 0000000..2eea6a7
--- /dev/null
+++ b/resources/images/example_6.png
Binary files differ
diff --git a/tools/fiddle/examples.cpp b/tools/fiddle/examples.cpp
new file mode 100644
index 0000000..d5cd067
--- /dev/null
+++ b/tools/fiddle/examples.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 "examples.h"
+
+template sk_tools::Registry<fiddle::Example>* sk_tools::Registry<fiddle::Example>::gHead;
+
+// These globals are needed by fiddles:
+GrBackendTexture backEndTexture;
+GrBackendRenderTarget backEndRenderTarget;
+GrBackendTexture backEndTextureRenderTarget;
+SkBitmap source;
+sk_sp<SkImage> image;
+double duration = 1.0;
+double frame = 1.0;
+
+int main() {
+    constexpr int kImgCount = 7;
+    sk_sp<SkImage> images[kImgCount];
+    SkBitmap bitmaps[kImgCount];
+    for (int i = 1; i < kImgCount; ++i) {
+        SkString path = SkStringPrintf("resources/images/example_%d.png", i);
+        images[i] = SkImage::MakeFromEncoded(SkData::MakeFromFileName(path.c_str()));
+        SkAssertResult(images[i] && images[i]->asLegacyBitmap(&bitmaps[i]));
+    }
+    for (const fiddle::Example& example : sk_tools::Registry<fiddle::Example>::Range()) {
+        SkASSERT((unsigned)example.fImageIndex < (unsigned)kImgCount);
+        image = images[example.fImageIndex];
+        source = bitmaps[example.fImageIndex];
+        SkBitmap bmp;
+        bmp.allocN32Pixels(example.fWidth, example.fHeight);
+        bmp.eraseColor(SK_ColorWHITE);
+        SkCanvas canvas(bmp);
+        SkDebugf("==> %s\n", example.fName);
+        example.fFunc(&canvas);
+    }
+}
diff --git a/tools/fiddle/examples.h b/tools/fiddle/examples.h
new file mode 100644
index 0000000..70927b8
--- /dev/null
+++ b/tools/fiddle/examples.h
@@ -0,0 +1,41 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+#ifndef examples_DEFINED
+#define examples_DEFINED
+
+#include "Registry.h"
+#include "skia.h"
+
+#include <cmath>
+#include <string>
+
+namespace fiddle {
+struct Example {
+    void (*fFunc)(SkCanvas*);
+    const char* fName;
+    int fImageIndex;
+    int fWidth;
+    int fHeight;
+    bool fText;
+    bool fSRGB;
+    bool fF16;
+    bool fAnimation;
+    bool fOffscreen;
+};
+}
+
+extern GrBackendTexture backEndTexture;
+extern GrBackendRenderTarget backEndRenderTarget;
+extern GrBackendTexture backEndTextureRenderTarget;
+extern SkBitmap source;
+extern sk_sp<SkImage> image;
+extern double duration; // The total duration of the animation in seconds.
+extern double frame;    // A value in [0, 1] of where we are in the animation.
+
+#define REG_FIDDLE(NAME, W, H, TEXT, I)                                            \
+    namespace example_##NAME { void draw(SkCanvas*);  }                            \
+    sk_tools::Registry<fiddle::Example> reg_##NAME(                                \
+        fiddle::Example{&example_##NAME::draw, #NAME, I, W, H, TEXT, false, false, false, false}); \
+    namespace example_##NAME
+
+#endif  // examples_DEFINED
