Cut SkQP 2019-10-28

No-Try: true
Change-Id: Ib42f49b8fc52ee91e3576e0823728949afcf6fbe
diff --git a/.gitignore b/.gitignore
index 57db7a4..e909ea7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,9 +3,7 @@
 *.iml
 .DS_Store
 .android_config
-.deps_sha1
 .gclient*
-.gm-actuals
 .gradle
 .idea
 .cproject
@@ -14,7 +12,6 @@
 .settings/
 TAGS
 bower_components
-common
 imgui.ini
 infra/bots/README.recipes.md
 infra/bots/gen_tasks_aux.go
@@ -32,26 +29,19 @@
 platform_tools/android/apps/*.hprof
 platform_tools/android/apps/*/.externalNativeBuild
 
-sampleapp_prefs.txt
 /skps
 /svgs
-third_party/externals
 tools/skp/page_sets/data/*.json
 tools/skp/page_sets/data/*.wpr
-xcodebuild
 
-/build
+common
 buildtools
-tools/clang
-third_party/llvm-build
+third_party/externals
+
 bin/gn
 bin/gn.exe
 bin/clang-format
 bin/clang-format.exe
-bin/clang_win
-
-vulkan-out
-gl-out
 
 node_modules
 tools/lottiecap/filmstrip.png
diff --git a/AUTHORS b/AUTHORS
index 0e405b7..80776a6 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -11,6 +11,7 @@
 #
 # Please keep the list sorted alphabetically.
 
+Aaron O'Mullan <aaron.omullan@gmail.com>
 ACCESS CO., LTD. <*@access-company.com>
 Amazon, Inc <*@amazon.com>
 Anthony Catel <paraboul@gmail.com>
@@ -36,9 +37,11 @@
 NVIDIA <*@nvidia.com>
 Opera Software ASA <*@opera.com>
 Pavel Krajcevski <pavel@cs.unc.edu>
+Raul Tambre <raul@tambre.ee>
 Samsung <*@samsung.com>
 Samsung Open Source Group <*@osg.samsung.com>
 Sergey Melnikov <Melnikov.Sergey.V@gmail.com>
+Shachar Langbeheim <nihohit@gmail.com>
 Skia <*@skia.org>
 Skia Buildbots <skia.buildbots@gmail.com>
 Sony Mobile Communications Inc. <*@sonymobile.com>
diff --git a/BUILD.gn b/BUILD.gn
index 2f8c74e..6c715d4 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -6,128 +6,29 @@
 import("gn/flutter_defines.gni")
 import("gn/fuchsia_defines.gni")
 import("gn/shared_sources.gni")
+
 import("gn/skia.gni")
 
-if (is_fuchsia) {
-  import("//build/vulkan/config.gni")
-}
-
-declare_args() {
-  skia_enable_flutter_defines = false
-}
-
-declare_args() {
-  skia_use_angle = false
-  skia_use_egl = false
-  skia_use_expat = true
-  skia_use_fontconfig = is_linux
-  skia_use_fonthost_mac = is_mac
-  skia_use_freetype = is_android || is_fuchsia || is_linux
-  skia_use_fixed_gamma_text = is_android
-  skia_use_libjpeg_turbo = true
-  skia_use_libpng = true
-  skia_use_libwebp = !is_fuchsia
-  skia_use_lua = is_skia_dev_build && !is_ios
-  skia_use_opencl = false
-  skia_use_piex = !is_win
-  skia_use_wuffs = false
-  skia_use_zlib = true
-  skia_use_metal = false
-  skia_use_libheif = is_skia_dev_build
-  skia_use_x11 = is_linux
-  skia_use_xps = true
-
-  skia_android_serial = ""
-  skia_enable_ccpr = true
-  skia_enable_nvpr = !skia_enable_flutter_defines
-  skia_enable_discrete_gpu = true
-  skia_enable_nima = false
-  skia_enable_pdf = true
-  skia_enable_spirv_validation = is_skia_dev_build && is_debug
-  skia_enable_skpicture = true
-  skia_enable_vulkan_debug_layers = is_skia_dev_build && is_debug
-  skia_qt_path = getenv("QT_PATH")
-  skia_compile_processors = false
-  skia_generate_workarounds = false
-  skia_lex = false
-
-  skia_skqp_global_error_tolerance = 0
-
-  skia_llvm_path = ""
-  skia_llvm_lib = "LLVM"
-
-  skia_tools_require_resources = false
-}
-declare_args() {
-  skia_use_dng_sdk = !is_fuchsia && skia_use_libjpeg_turbo && skia_use_zlib
-  skia_use_sfntly = skia_use_icu
-  skia_enable_atlas_text = is_skia_dev_build && skia_enable_gpu
-  skia_enable_fontmgr_empty = false
-  skia_enable_fontmgr_custom =
-      is_linux && skia_use_freetype && !skia_use_fontconfig
-  skia_enable_fontmgr_custom_empty = is_fuchsia && skia_use_freetype
-  skia_enable_fontmgr_android = skia_use_expat && skia_use_freetype
-  skia_enable_fontmgr_fuchsia = is_fuchsia
-  skia_enable_fontmgr_win = is_win
-  skia_enable_fontmgr_win_gdi = is_win
-
-  if (is_mac) {
-    skia_gl_standard = "gl"
-  } else if (is_ios) {
-    skia_gl_standard = "gles"
-  } else {
-    skia_gl_standard = ""
-  }
-
-  if (is_android) {
-    skia_use_vulkan = defined(ndk_api) && ndk_api >= 24
-  } else if (is_fuchsia) {
-    skia_use_vulkan = fuchsia_use_vulkan
-  } else {
-    skia_use_vulkan = defined(skia_moltenvk_path) && skia_moltenvk_path != ""
-  }
-
-  if (is_ios) {
-    skia_ios_identity = ".*Google.*"
-    skia_ios_profile = "Google Development"
-  }
+if (skia_use_dawn) {
+  import("third_party/externals/dawn/scripts/dawn_features.gni")
 }
 
 if (defined(skia_settings)) {
   import(skia_settings)
 }
 
-skia_public_includes = [
-  "include/android",
-  "include/c",
-  "include/codec",
-  "include/config",
-  "include/core",
-  "include/docs",
-  "include/effects",
-  "include/encode",
-  "include/gpu",
-  "include/atlastext",
-  "include/pathops",
-  "include/ports",
-  "include/svg",
-  "include/utils",
-  "include/utils/mac",
-]
-
-if (skia_enable_atlas_text) {
-  skia_public_includes += [ "include/atlastext" ]
-}
+import("gn/ios.gni")
 
 # Skia public API, generally provided by :skia.
 config("skia_public") {
-  include_dirs = skia_public_includes
+  include_dirs = [ "." ]
+
   defines = []
   if (is_component_build) {
     defines += [ "SKIA_DLL" ]
   }
   if (is_fuchsia || is_linux) {
-    defines += [ "SK_SAMPLES_FOR_X" ]
+    defines += [ "SK_R32_SHIFT=16" ]
   }
   if (skia_enable_flutter_defines) {
     defines += flutter_defines
@@ -154,31 +55,6 @@
 config("skia_private") {
   visibility = [ ":*" ]
 
-  include_dirs = [
-    "include/private",
-    "src/c",
-    "src/codec",
-    "src/core",
-    "src/effects",
-    "src/fonts",
-    "src/image",
-    "src/images",
-    "src/lazy",
-    "src/opts",
-    "src/pathops",
-    "src/pdf",
-    "src/ports",
-    "src/sfnt",
-    "src/shaders",
-    "src/shaders/gradients",
-    "src/sksl",
-    "src/utils",
-    "src/utils/win",
-    "src/xml",
-    "third_party/etc1",
-    "third_party/gif",
-  ]
-
   defines = [ "SK_GAMMA_APPLY_TO_A8" ]
   if (skia_use_fixed_gamma_text) {
     defines += [
@@ -186,33 +62,17 @@
       "SK_GAMMA_CONTRAST=0.0",
     ]
   }
-  if (is_official_build || is_android) {
-    # TODO(bsalomon): it'd be nice to make Android normal.
-    defines += [ "SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=0" ]
+  if (is_skia_dev_build) {
+    defines += [
+      "SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1",
+      "GR_TEST_UTILS=1",
+    ]
   }
   libs = []
   lib_dirs = []
-  if (skia_enable_gpu) {
-    include_dirs += [ "src/gpu" ]
-    if (is_skia_dev_build && skia_use_vulkan) {
-      include_dirs += [ "tools/gpu/vk" ]
-    }
-  }
   if (skia_use_angle) {
     defines += [ "SK_ANGLE" ]
   }
-  if (skia_enable_discrete_gpu) {
-    defines += [ "SK_ENABLE_DISCRETE_GPU" ]
-  }
-  if (!is_official_build) {
-    defines += [ "GR_TEST_UTILS=1" ]
-  }
-  if (skia_llvm_path != "") {
-    defines += [ "SK_LLVM_AVAILABLE" ]
-    include_dirs += [ "$skia_llvm_path/include" ]
-    libs += [ skia_llvm_lib ]
-    lib_dirs += [ "$skia_llvm_path/lib/" ]
-  }
 }
 
 # Any code that's linked into Skia-the-library should use this config via += skia_library_configs.
@@ -334,14 +194,6 @@
   } else {
     cflags = [ "-march=haswell" ]
   }
-
-  # Oddly, clang-cl doesn't recognize this as a valid flag.
-  # If it ever does, it'd nice to move this up with -mavx2 and co.
-  if (is_clang && !is_win) {
-    # This flag lets Clang generate FMAs when it sees a mul-then-add.  It's optional,
-    # but nice to have, generating slightly better code for paths without explicit FMAs.
-    cflags += [ "-ffp-contract=fast" ]
-  }
 }
 
 # Any feature of Skia that requires third-party code should be optional and use this template.
@@ -462,9 +314,13 @@
 optional("fontmgr_fuchsia") {
   enabled = skia_enable_fontmgr_fuchsia
 
-  deps = [
-    "//sdk/fidl/fuchsia.fonts",
-  ]
+  deps = []
+
+  if (is_fuchsia && using_fuchsia_sdk) {
+    deps += [ "$fuchsia_sdk_root/fidl:fuchsia.fonts" ]
+  } else {
+    deps += [ "//sdk/fidl/fuchsia.fonts" ]
+  }
   sources = [
     "src/ports/SkFontMgr_fuchsia.cpp",
     "src/ports/SkFontMgr_fuchsia.h",
@@ -477,12 +333,24 @@
   deps = [
     ":typeface_freetype",
   ]
+
+  # custom_embedded has the source for both embedding a font in the binary
+  # (only used for the all-included build) and reading in a font from
+  # raw bytes passed over the wire (a typical way to load fonts).
   sources = [
-    "src/ports/SkFontMgr_custom.cpp",
-    "src/ports/SkFontMgr_custom.h",
     "src/ports/SkFontMgr_custom_embedded.cpp",
-    "src/ports/SkFontMgr_custom_embedded_factory.cpp",
   ]
+
+  # If we haven't opted for no fonts (empty) or fonts, but not the
+  # built-in one (custom), then, we need to provide the mechanism for
+  # using the built-in font.
+  if (!skia_enable_fontmgr_empty && !skia_enable_fontmgr_custom) {
+    sources += [
+      "src/ports/SkFontMgr_custom.cpp",
+      "src/ports/SkFontMgr_custom.h",
+      "src/ports/SkFontMgr_custom_embedded_factory.cpp",
+    ]
+  }
 }
 
 optional("fontmgr_win") {
@@ -514,7 +382,7 @@
       "src/sksl/lex/RegexNode.cpp",
       "src/sksl/lex/RegexParser.cpp",
     ]
-    include_dirs = [ "src/sksl/lex" ]
+    include_dirs = [ "." ]
   }
 
   action("run_sksllex") {
@@ -557,13 +425,11 @@
       "src/sksl/SkSLMain.cpp",
     ]
     sources += skia_sksl_sources
-    include_dirs = [
-      "src/gpu",
-      "src/sksl",
-    ]
+    sources += skia_sksl_gpu_sources
+    include_dirs = [ "." ]
     deps = [
       ":run_sksllex",
-      "//third_party/spirv-tools",
+      "//third_party/spirv-tools:spvtools",
     ]
   }
 
@@ -575,7 +441,8 @@
     # GN insists its outputs should go somewhere underneath target_out_dir, so we trick it with a
     # path that starts with target_out_dir and then uses ".." to back up into the src dir.
     skia_gpu_processor_outputs += [
-      "$target_out_dir/" + rebase_path("$dir/$name.h", target_out_dir),
+      "$target_out_dir/" +
+          rebase_path("$dir/generated/$name.h", target_out_dir),
       # the script also modifies the corresponding .cpp file, but if we tell GN that it gets
       # confused due to the same file being named by two different paths
     ]
@@ -633,11 +500,12 @@
   if (skia_generate_workarounds) {
     deps += [ ":workaround_list" ]
   }
-  public_defines = []
+  public_defines = [ "SK_GL" ]
   public_configs = []
   public_deps = []
 
-  sources = skia_gpu_sources + skia_sksl_sources + skia_gpu_processor_outputs
+  sources =
+      skia_gpu_sources + skia_sksl_gpu_sources + skia_gpu_processor_outputs
   if (!skia_enable_ccpr) {
     sources -= skia_ccpr_sources
     sources += [ "src/gpu/ccpr/GrCoverageCountingPathRenderer_none.cpp" ]
@@ -685,14 +553,32 @@
       public_defines += [ "SK_ENABLE_VK_LAYERS" ]
     }
     if (is_fuchsia) {
-      public_deps +=
-          [ "//third_party/vulkan_loader_and_validation_layers:vulkan" ]
+      if (using_fuchsia_sdk) {
+        public_deps += [ "$fuchsia_sdk_root/pkg:vulkan" ]
+      } else {
+        public_deps += [ "//src/graphics/lib/vulkan" ]
+      }
     }
   }
 
-  if (skia_enable_spirv_validation) {
-    deps += [ "//third_party/spirv-tools" ]
-    public_defines += [ "SK_ENABLE_SPIRV_VALIDATION" ]
+  if (skia_use_dawn) {
+    public_defines += [ "SK_DAWN" ]
+    sources += skia_dawn_sources
+    public_deps += [ "//third_party/dawn:dawn_headers" ]
+    deps += [
+      "//third_party/dawn:dawncpp",
+      "//third_party/dawn:libdawn_native",
+      "//third_party/dawn:libdawn_proc",
+    ]
+    if (dawn_enable_d3d12) {
+      libs += [
+        "d3d12.lib",
+        "dxgi.lib",
+        "d3dcompiler.lib",
+      ]
+    } else if (dawn_enable_metal) {
+      libs += [ "Metal.framework" ]
+    }
   }
 
   cflags_objcc = []
@@ -816,8 +702,9 @@
   }
 
   public = [
-    "third_party/skcms/skcms.h",
+    "include/third_party/skcms/skcms.h",
   ]
+  include_dirs = [ "include/third_party/skcms" ]
   sources = rebase_path(skcms_sources, ".", "third_party/skcms")
 }
 
@@ -874,6 +761,16 @@
   ]
 }
 
+optional("sksl_interpreter") {
+  enabled = skia_enable_sksl_interpreter
+  public_defines = [ "SK_ENABLE_SKSL_INTERPRETER" ]
+}
+
+optional("skvm_jit") {
+  enabled = skia_enable_skvm_jit
+  public_defines = [ "SKVM_JIT" ]
+}
+
 if (skia_enable_gpu && skia_generate_workarounds) {
   action("workaround_list") {
     script = "tools/build_workaround_header.py"
@@ -932,6 +829,8 @@
     ":none",
     ":png",
     ":raw",
+    ":sksl_interpreter",
+    ":skvm_jit",
     ":sse2",
     ":sse41",
     ":sse42",
@@ -941,10 +840,6 @@
     ":xml",
   ]
 
-  if (skia_enable_nima) {
-    deps += [ "//third_party/Nima-Cpp" ]
-  }
-
   # This file (and all GN files in Skia) are designed to work with an
   # empty sources assignment filter; we handle all that explicitly.
   # We clear the filter here for clients who may have set up a global filter.
@@ -964,6 +859,7 @@
   }
   sources += skia_effects_sources
   sources += skia_effects_imagefilter_sources
+  sources += skia_sksl_sources
   sources += [
     "src/android/SkAndroidFrameworkUtils.cpp",
     "src/android/SkAnimatedImage.cpp",
@@ -982,6 +878,7 @@
     "src/codec/SkEncodedInfo.cpp",
     "src/codec/SkMaskSwizzler.cpp",
     "src/codec/SkMasks.cpp",
+    "src/codec/SkParseEncodedOrigin.cpp",
     "src/codec/SkSampledCodec.cpp",
     "src/codec/SkSampler.cpp",
     "src/codec/SkStreamBuffer.cpp",
@@ -996,18 +893,9 @@
     "src/sfnt/SkOTTable_name.cpp",
     "src/sfnt/SkOTUtils.cpp",
     "src/utils/mac/SkStream_mac.cpp",
-    "third_party/etc1/etc1.cpp",
   ]
 
   defines = []
-  if (!skia_enable_skpicture) {
-    defines = [ "SK_DISABLE_SKPICTURE" ]
-    public -= skia_skpicture_public
-    sources -= skia_skpicture_sources
-    sources -= [ "//src/effects/imagefilters/SkPictureImageFilter.cpp" ]
-    sources += [ "src/core/SkPicture_none.cpp" ]
-  }
-
   libs = []
 
   if (is_win) {
@@ -1095,6 +983,15 @@
   if (is_fuchsia) {
     sources += [ "src/ports/SkDebug_stdio.cpp" ]
   }
+
+  if (skia_enable_spirv_validation) {
+    deps += [ "//third_party/spirv-tools:spvtools_val" ]
+    defines += [ "SK_ENABLE_SPIRV_VALIDATION" ]
+  }
+
+  if (skia_include_multiframe_procs) {
+    sources += [ "tools/SkSharingProc.cpp" ]
+  }
 }
 
 # DebugCanvas used in experimental/wasm-skp-debugger
@@ -1102,18 +999,8 @@
   static_library("debugcanvas") {
     public_configs = [ ":skia_public" ]
 
-    include_dirs = [
-      "include/gpu",
-      "include/private",
-      "src/gpu",
-      "src/core",
-      "src/shaders",
-      "src/utils",
-      "tools",
-      "tools/debugger",
-    ]
-
     sources = [
+      "tools/SkSharingProc.cpp",
       "tools/UrlDataManager.cpp",
       "tools/debugger/DebugCanvas.cpp",
       "tools/debugger/DrawCommand.cpp",
@@ -1200,13 +1087,38 @@
     "modules/skottie",
     "modules/skshaper",
   ]
+  if (target_cpu == "wasm") {
+    deps += [ "modules/skparagraph" ]
+  }
 }
 
 # Targets guarded by skia_enable_tools may use //third_party freely.
 if (skia_enable_tools) {
+  skia_public_includes = [
+    "include/android",
+    "include/atlastext",
+    "include/c",
+    "include/codec",
+    "include/config",
+    "include/core",
+    "include/docs",
+    "include/effects",
+    "include/encode",
+    "include/gpu",
+    "include/pathops",
+    "include/ports",
+    "include/svg",
+    "include/utils",
+    "include/utils/mac",
+    "modules/sksg/include",
+    "modules/skshaper/include",
+    "modules/skottie/include",
+  ]
+
   # Used by gn_to_bp.py to list our public include dirs.
   source_set("public") {
     configs += [ ":skia_public" ]
+    include_dirs = skia_public_includes
   }
 
   config("skia.h_config") {
@@ -1217,16 +1129,9 @@
     skia_h = "$target_gen_dir/skia.h"
     script = "gn/find_headers.py"
 
-    # TODO: would be cool to not hard-code these here, but how?
-    module_public_includes = [
-      "modules/sksg/include",
-      "modules/skshaper/include",
-      "modules/skottie/include",
-    ]
-    args =
-        [ rebase_path("//bin/gn") ] + [ rebase_path("//") ] +
-        [ rebase_path(skia_h, root_build_dir) ] +
-        rebase_path(skia_public_includes) + rebase_path(module_public_includes)
+    args = [ rebase_path("//bin/gn") ] + [ rebase_path("//") ] +
+           [ rebase_path(skia_h, root_build_dir) ] +
+           rebase_path(skia_public_includes)
     depfile = "$skia_h.deps"
     outputs = [
       skia_h,
@@ -1259,11 +1164,18 @@
     }
   }
 
+  config("our_vulkan_headers") {
+    # We add this directory to simulate the client already have
+    # vulkan/vulkan_core.h on their path.
+    include_dirs = [ "include/third_party/vulkan" ]
+  }
+
   source_set("public_headers_warnings_check") {
     sources = [
       "tools/public_headers_warnings_check.cpp",
     ]
     configs -= [ "//gn:warnings_except_public_headers" ]
+    configs += [ ":our_vulkan_headers" ]
     deps = [
       ":skia",
       ":skia.h",
@@ -1271,20 +1183,19 @@
       "modules/skshaper",
     ]
 
-    # We add this directory to simulate the client already have
-    # vulkan/vulkan_core.h on their path.
-    include_dirs = [ "include/third_party/vulkan" ]
+    if (skia_use_dawn) {
+      deps += [ "//third_party/dawn:dawn_headers" ]
+    }
   }
 
   template("test_lib") {
     config(target_name + "_config") {
-      include_dirs = invoker.public_include_dirs
       if (defined(invoker.public_defines)) {
         defines = invoker.public_defines
       }
     }
     source_set(target_name) {
-      forward_variables_from(invoker, "*", [ "public_include_dirs" ])
+      forward_variables_from(invoker, "*", [])
       check_includes = false
       public_configs = [
         ":" + target_name + "_config",
@@ -1301,54 +1212,7 @@
 
   template("test_app") {
     if (is_ios) {
-      app_name = target_name
-      gen_path = target_gen_dir
-
-      action("${app_name}_generate_info_plist") {
-        script = "//gn/gen_plist_ios.py"
-        outputs = [
-          "$gen_path/${app_name}_Info.plist",
-        ]
-        args = [ rebase_path("$gen_path/$app_name", root_build_dir) ]
-      }
-
-      bundle_data("${app_name}_bundle_info_plist") {
-        public_deps = [
-          ":${app_name}_generate_info_plist",
-        ]
-        sources = [
-          "$gen_path/${app_name}_Info.plist",
-        ]
-        outputs = [
-          "{{bundle_root_dir}}/Info.plist",
-        ]
-      }
-
-      has_skps = "True" == exec_script("//gn/checkdir.py",
-                                       [ rebase_path("skps", root_build_dir) ],
-                                       "trim string")
-      bundle_data("${app_name}_bundle_resources") {
-        sources = [
-          "resources",
-        ]
-        outputs = [
-          # iOS reserves the folders 'Resources' and 'resources' so store one level deeper
-          "{{bundle_resources_dir}}/data/resources",
-        ]
-      }
-      if (has_skps) {
-        bundle_data("${app_name}_bundle_skps") {
-          sources = [
-            "skps",
-          ]
-          outputs = [
-            # Store in same folder as resources
-            "{{bundle_resources_dir}}/data/skps",
-          ]
-        }
-      }
-
-      executable("${app_name}_generate_executable") {
+      ios_app_bundle(target_name) {
         forward_variables_from(invoker,
                                "*",
                                [
@@ -1356,68 +1220,14 @@
                                  "visibility",
                                  "is_shared_library",
                                ])
-        configs += [ ":skia_private" ]
         testonly = true
-        output_name = rebase_path("$gen_path/$app_name", root_build_dir)
-      }
-
-      bundle_data("${app_name}_bundle_executable") {
-        public_deps = [
-          ":${app_name}_generate_executable",
-        ]
-        sources = [
-          "$gen_path/$app_name",
-        ]
-        outputs = [
-          "{{bundle_executable_dir}}/$app_name",
-        ]
-        testonly = true
-      }
-
-      bundle_data("${app_name}_bundle_symbols") {
-        public_deps = [
-          ":${app_name}_generate_executable",
-        ]
-        sources = [
-          "$gen_path/${app_name}.dSYM",
-        ]
-        outputs = [
-          "{{bundle_executable_dir}}/${app_name}.dSYM",
-        ]
-        testonly = true
-      }
-
-      create_bundle("$app_name") {
-        product_type = "com.apple.product-type.application"
-        testonly = true
-
-        bundle_root_dir = "${root_build_dir}/${target_name}.app"
-        bundle_resources_dir = bundle_root_dir
-        bundle_executable_dir = bundle_root_dir
-
-        deps = [
-          ":${app_name}_bundle_executable",
-          ":${app_name}_bundle_info_plist",
-          ":${app_name}_bundle_resources",
-          ":${app_name}_bundle_symbols",
-        ]
-        if (has_skps) {
-          deps += [ ":${app_name}_bundle_skps" ]
-        }
-
-        # should only code sign when running on a device, not the simulator
-        if (target_cpu != "x64") {
-          code_signing_script = "//gn/codesign_ios.py"
-          code_signing_sources = [ "$target_gen_dir/$app_name" ]
-          code_signing_outputs = [
-            "$bundle_root_dir/_CodeSignature/CodeResources",
-            "$bundle_root_dir/embedded.mobileprovision",
-          ]
-          code_signing_args = [
-            rebase_path("$bundle_root_dir", root_build_dir),
-            skia_ios_identity,
-            skia_ios_profile,
-          ]
+        extra_configs = [ ":skia_private" ]
+        launchscreen = "platform_tools/ios/app/LaunchScreen.storyboard"
+        data_sources = [ "resources" ]
+        if ("True" == exec_script("//gn/checkdir.py",
+                                  [ rebase_path("skps", root_build_dir) ],
+                                  "trim string")) {
+          data_sources += [ "skps" ]
         }
       }
     } else {
@@ -1459,39 +1269,17 @@
     }
   }
 
-  config("moltenvk_config") {
-    if (defined(skia_moltenvk_path) && skia_moltenvk_path != "") {
-      if (is_ios) {
-        moltenvk_framework_path = "$skia_moltenvk_path/MoltenVK/iOS"
-      } else {
-        moltenvk_framework_path = "$skia_moltenvk_path/MoltenVK/macOS"
-      }
-      cflags = [ "-F$moltenvk_framework_path" ]
-      ldflags = [ "-F$moltenvk_framework_path" ]
-      libs = [
-        "MoltenVK.framework",
-        "Metal.framework",
-        "IOSurface.framework",
-        "QuartzCore.framework",
-        "Foundation.framework",
-      ]
-      if (is_ios) {
-        libs += [ "UIKit.framework" ]
-      } else {
-        libs += [ "IOKit.framework" ]
-      }
-      defines = [ "SK_MOLTENVK" ]
-    }
-  }
-
-  source_set("moltenvk") {
-    public_configs = [ ":moltenvk_config" ]
-  }
-
   test_lib("gpu_tool_utils") {
-    public_include_dirs = []
     public_defines = []
-    public_include_dirs += [ "tools/gpu" ]
+
+    # Bots and even devs may not have Vulkan headers, so put
+    # include/third_party/vulkan on our path so they're always available.
+    all_dependent_configs = [ ":our_vulkan_headers" ]
+
+    defines = []
+    if (skia_enable_discrete_gpu) {
+      defines += [ "SK_ENABLE_DISCRETE_GPU" ]
+    }
 
     deps = []
     public_deps = []
@@ -1539,28 +1327,26 @@
       sources += [ "tools/gpu/gl/angle/GLTestContext_angle.cpp" ]
     }
 
-    public_include_dirs += [ "include/third_party/vulkan" ]
     if (skia_use_vulkan) {
       sources += [ "tools/gpu/vk/VkTestContext.cpp" ]
       sources += [ "tools/gpu/vk/VkTestUtils.cpp" ]
-      if (defined(skia_moltenvk_path) && skia_moltenvk_path != "") {
-        public_deps += [ ":moltenvk" ]
-      }
     }
     if (skia_use_metal) {
       sources += [ "tools/gpu/mtl/MtlTestContext.mm" ]
     }
+    if (skia_use_dawn) {
+      public_deps += [ "//third_party/dawn:dawn_headers" ]
+      sources += [ "tools/gpu/dawn/DawnTestContext.cpp" ]
+    }
   }
 
   test_lib("flags") {
-    public_include_dirs = [ "tools/flags" ]
     sources = [
       "tools/flags/CommandLineFlags.cpp",
     ]
   }
 
   test_lib("common_flags_config") {
-    public_include_dirs = [ "tools/flags" ]
     sources = [
       "tools/flags/CommonFlagsConfig.cpp",
     ]
@@ -1572,7 +1358,6 @@
     ]
   }
   test_lib("common_flags_gpu") {
-    public_include_dirs = [ "tools/flags" ]
     sources = [
       "tools/flags/CommonFlagsGpu.cpp",
     ]
@@ -1584,7 +1369,6 @@
     ]
   }
   test_lib("common_flags_images") {
-    public_include_dirs = [ "tools/flags" ]
     sources = [
       "tools/flags/CommonFlagsImages.cpp",
     ]
@@ -1593,7 +1377,6 @@
     ]
   }
   test_lib("common_flags_aa") {
-    public_include_dirs = [ "tools/flags" ]
     sources = [
       "tools/flags/CommonFlagsAA.cpp",
     ]
@@ -1603,7 +1386,6 @@
   }
 
   test_lib("trace") {
-    public_include_dirs = [ "tools/trace" ]
     deps = [
       ":flags",
     ]
@@ -1618,20 +1400,18 @@
   }
 
   test_lib("tool_utils") {
-    public_include_dirs = [
-      "tools",
-      "tools/debugger",
-      "tools/fonts",
-      "tools/timer",
-    ]
     sources = [
       "tools/AndroidSkDebugToStdOut.cpp",
+      "tools/AutoreleasePool.h",
       "tools/CrashHandler.cpp",
       "tools/DDLPromiseImageHelper.cpp",
       "tools/DDLTileHelper.cpp",
       "tools/LsanSuppressions.cpp",
       "tools/ProcStats.cpp",
       "tools/Resources.cpp",
+      "tools/SkMetaData.cpp",
+      "tools/SkMetaData.h",
+      "tools/SkSharingProc.cpp",
       "tools/ToolUtils.cpp",
       "tools/UrlDataManager.cpp",
       "tools/debugger/DebugCanvas.cpp",
@@ -1647,14 +1427,26 @@
       "tools/fonts/TestTypeface.h",
       "tools/fonts/ToolUtilsFont.cpp",
       "tools/random_parse_path.cpp",
-      "tools/timer/AnimTimer.h",
+      "tools/timer/TimeUtils.h",
       "tools/timer/Timer.cpp",
     ]
     libs = []
     if (is_ios) {
       sources += [ "tools/ios_utils.m" ]
+      sources += [ "tools/ios_utils.h" ]
+      if (skia_use_metal) {
+        sources += [ "tools/AutoreleasePool.mm" ]
+      }
       libs += [ "Foundation.framework" ]
+    } else if (is_mac) {
+      if (skia_use_metal) {
+        sources += [ "tools/AutoreleasePool.mm" ]
+        libs += [ "Foundation.framework" ]
+      }
+    } else if (is_win) {
+      libs += [ "DbgHelp.lib" ]
     }
+
     defines = []
     if (skia_tools_require_resources) {
       defines += [ "SK_TOOLS_REQUIRE_RESOURCES" ]
@@ -1668,11 +1460,34 @@
     ]
   }
 
+  test_lib("etc1") {
+    sources = [
+      "third_party/etc1/etc1.cpp",
+    ]
+  }
+
+  if (skia_use_ffmpeg) {
+    test_lib("video_decoder") {
+      sources = [
+        "experimental/ffmpeg/SkVideoDecoder.cpp",
+        "experimental/ffmpeg/SkVideoDecoder.h",
+        "experimental/ffmpeg/SkVideoEncoder.cpp",
+        "experimental/ffmpeg/SkVideoEncoder.h",
+      ]
+      libs = [
+        "swscale",
+        "avcodec",
+        "avformat",
+        "avutil",
+      ]
+    }
+  }
+
   import("gn/gm.gni")
   test_lib("gm") {
-    public_include_dirs = [ "gm" ]
     sources = gm_sources
     deps = [
+      ":etc1",
       ":flags",
       ":skia",
       ":tool_utils",
@@ -1681,15 +1496,33 @@
       "modules/sksg",
       "modules/skshaper",
     ]
+    if (is_skia_dev_build) {
+      sources += [ "gm/fiddle.cpp" ]
+      deps += [ ":skia.h" ]
+    }
     public_deps = [
       ":gpu_tool_utils",
     ]
+
+    if (skia_use_ffmpeg) {
+      deps += [ ":video_decoder" ]
+      sources += [ "gm/video_decoder.cpp" ]
+    }
+  }
+
+  test_lib("skvm_builders") {
+    sources = [
+      "tools/SkVMBuilders.cpp",
+      "tools/SkVMBuilders.h",
+    ]
   }
 
   import("gn/tests.gni")
   test_lib("tests") {
-    public_include_dirs = [ "tests" ]
     sources = tests_sources + pathops_tests_sources
+    if (skia_use_metal) {
+      sources += metal_tests_sources
+    }
     if (!skia_enable_fontmgr_android) {
       sources -= [ "//tests/FontMgrAndroidParserTest.cpp" ]
     }
@@ -1700,8 +1533,10 @@
       ":experimental_svg_model",
       ":flags",
       ":skia",
+      ":skvm_builders",
       ":tool_utils",
       "modules/skottie:tests",
+      "modules/skparagraph:tests",
       "modules/sksg:tests",
       "modules/skshaper",
       "//third_party/libpng",
@@ -1715,21 +1550,21 @@
 
   import("gn/bench.gni")
   test_lib("bench") {
-    public_include_dirs = [ "bench" ]
     sources = bench_sources
     deps = [
       ":flags",
       ":gm",
       ":gpu_tool_utils",
       ":skia",
+      ":skvm_builders",
       ":tool_utils",
+      "modules/skparagraph:bench",
+      "modules/skshaper",
     ]
   }
 
   test_lib("experimental_svg_model") {
-    public_include_dirs = []
     if (skia_use_expat) {
-      public_include_dirs += [ "experimental/svg/model" ]
       sources = [
         "experimental/svg/model/SkSVGAttribute.cpp",
         "experimental/svg/model/SkSVGAttributeParser.cpp",
@@ -1762,9 +1597,19 @@
     }
   }
 
+  test_lib("experimental_xform") {
+    sources = [
+      "experimental/xform/SkShape.cpp",
+      "experimental/xform/SkXform.cpp",
+      "experimental/xform/XContext.cpp",
+    ]
+    deps = [
+      ":skia",
+    ]
+  }
+
   if (skia_use_lua) {
     test_lib("lua") {
-      public_include_dirs = []
       sources = [
         "src/utils/SkLua.cpp",
         "src/utils/SkLuaCanvas.cpp",
@@ -1820,8 +1665,6 @@
   if (target_cpu != "wasm") {
     import("gn/samples.gni")
     test_lib("samples") {
-      public_include_dirs = [ "samplecode" ]
-      include_dirs = [ "experimental" ]
       sources = samples_sources
       public_deps = [
         ":tool_utils",
@@ -1831,16 +1674,11 @@
         ":flags",
         ":gpu_tool_utils",
         ":xml",
+        "modules/skparagraph:samples",
         "modules/sksg",
         "modules/skshaper",
       ]
 
-      # NIMA does not build on Windows clang
-      if (!is_win || !is_clang) {
-        sources += [ "experimental/nima/NimaActor.cpp" ]
-        deps += [ "//third_party/Nima-Cpp" ]
-      }
-
       if (skia_use_lua) {
         sources += [ "samplecode/SampleLua.cpp" ]
         deps += [
@@ -1859,7 +1697,6 @@
       ]
     }
     test_lib("hash_and_encode") {
-      public_include_dirs = [ "tools" ]
       sources = [
         "tools/HashAndEncode.cpp",
         "tools/HashAndEncode.h",
@@ -1914,11 +1751,6 @@
         "modules/skottie:utils",
         "modules/sksg",
       ]
-
-      # NIMA does not build on Windows clang
-      if (!is_win || !is_clang) {
-        deps += [ "//third_party/Nima-Cpp" ]
-      }
     }
   }
 
@@ -1933,6 +1765,17 @@
     }
   }
 
+  if (!is_win) {
+    test_app("blob_cache_sim") {
+      sources = [
+        "tools/blob_cache_sim.cpp",
+      ]
+      deps = [
+        ":skia",
+      ]
+    }
+  }
+
   test_app("nanobench") {
     sources = [
       "bench/nanobench.cpp",
@@ -1950,7 +1793,9 @@
       ":skia",
       ":tool_utils",
       ":trace",
+      "modules/skparagraph:bench",
       "modules/sksg",
+      "modules/skshaper",
     ]
   }
 
@@ -1964,6 +1809,22 @@
     ]
   }
 
+  if (skia_use_ffmpeg) {
+    test_app("skottie2movie") {
+      sources = [
+        "tools/skottie2movie.cpp",
+      ]
+      deps = [
+        ":flags",
+        ":gpu_tool_utils",
+        ":skia",
+        ":video_decoder",
+        "modules/skottie",
+        "modules/skottie:utils",
+      ]
+    }
+  }
+
   test_app("skpbench") {
     sources = [
       "tools/skpbench/skpbench.cpp",
@@ -2057,12 +1918,6 @@
   }
 
   test_app("fuzz") {
-    include_dirs = [
-      "tools",
-      "tools/debugger",
-      "tools/fonts",
-      "src/sksl",
-    ]
     sources = [
       "fuzz/Fuzz.cpp",
       "fuzz/FuzzCanvas.cpp",
@@ -2076,6 +1931,7 @@
       "fuzz/FuzzPathop.cpp",
       "fuzz/FuzzPolyUtils.cpp",
       "fuzz/FuzzRegionOp.cpp",
+      "fuzz/FuzzSkDescriptor.cpp",
       "fuzz/oss_fuzz/FuzzAndroidCodec.cpp",
       "fuzz/oss_fuzz/FuzzAnimatedImage.cpp",
       "fuzz/oss_fuzz/FuzzImage.cpp",
@@ -2089,6 +1945,7 @@
       "fuzz/oss_fuzz/FuzzSKSL2Metal.cpp",
       "fuzz/oss_fuzz/FuzzSKSL2Pipeline.cpp",
       "fuzz/oss_fuzz/FuzzSKSL2SPIRV.cpp",
+      "fuzz/oss_fuzz/FuzzSkDescriptorDeserialize.cpp",
       "fuzz/oss_fuzz/FuzzTextBlobDeserialize.cpp",
       "tools/UrlDataManager.cpp",
       "tools/debugger/DebugCanvas.cpp",
@@ -2152,7 +2009,6 @@
 
   if (!is_win) {
     test_lib("skqp_lib") {
-      public_include_dirs = [ "tools/skqp/src" ]
       defines =
           [ "SK_SKQP_GLOBAL_ERROR_TOLERANCE=$skia_skqp_global_error_tolerance" ]
       sources = [
@@ -2213,7 +2069,6 @@
       ]
       libs = []
 
-      include_dirs = []
       deps = [
         ":skia",
         "modules/skottie",
@@ -2243,7 +2098,10 @@
   }
 
   test_lib("sk_app") {
-    public_include_dirs = [ "tools/sk_app" ]
+    public_deps = [
+      ":gpu_tool_utils",
+      ":skia",
+    ]
     sources = [
       "tools/sk_app/CommandSet.cpp",
       "tools/sk_app/GLWindowContext.cpp",
@@ -2251,6 +2109,10 @@
     ]
     libs = []
 
+    if (skia_use_dawn) {
+      sources += [ "tools/sk_app/DawnWindowContext.cpp" ]
+    }
+
     if (is_android) {
       sources += [
         "tools/sk_app/android/GLWindowContext_android.cpp",
@@ -2268,6 +2130,13 @@
         "tools/sk_app/unix/keysym2ucs.c",
         "tools/sk_app/unix/main_unix.cpp",
       ]
+      if (skia_use_dawn) {
+        if (dawn_enable_vulkan) {
+          sources += [ "tools/sk_app/unix/DawnVulkanWindowContext_unix.cpp" ]
+          defines = [ "VK_USE_PLATFORM_XCB_KHR" ]
+          libs += [ "X11-xcb" ]
+        }
+      }
       libs += [
         "GL",
         "X11",
@@ -2282,6 +2151,11 @@
       if (skia_use_angle) {
         sources += [ "tools/sk_app/win/ANGLEWindowContext_win.cpp" ]
       }
+      if (skia_use_dawn) {
+        if (dawn_enable_d3d12) {
+          sources += [ "tools/sk_app/win/DawnD3D12WindowContext_win.cpp" ]
+        }
+      }
     } else if (is_mac) {
       sources += [
         "tools/sk_app/mac/GLWindowContext_mac.mm",
@@ -2289,6 +2163,11 @@
         "tools/sk_app/mac/Window_mac.mm",
         "tools/sk_app/mac/main_mac.mm",
       ]
+      if (skia_use_dawn) {
+        if (dawn_enable_metal) {
+          sources += [ "tools/sk_app/mac/DawnMTLWindowContext_mac.mm" ]
+        }
+      }
       libs += [
         "QuartzCore.framework",
         "Cocoa.framework",
@@ -2296,11 +2175,12 @@
       ]
     } else if (is_ios) {
       sources += [
-        "tools/sk_app/ios/GLWindowContext_ios.cpp",
-        "tools/sk_app/ios/RasterWindowContext_ios.cpp",
-        "tools/sk_app/ios/Window_ios.cpp",
-        "tools/sk_app/ios/main_ios.cpp",
+        "tools/sk_app/ios/GLWindowContext_ios.mm",
+        "tools/sk_app/ios/RasterWindowContext_ios.mm",
+        "tools/sk_app/ios/Window_ios.mm",
+        "tools/sk_app/ios/main_ios.mm",
       ]
+      libs += [ "QuartzCore.framework" ]
     }
 
     if (skia_use_vulkan) {
@@ -2312,9 +2192,6 @@
         libs += [ "X11-xcb" ]
       } else if (is_win) {
         sources += [ "tools/sk_app/win/VulkanWindowContext_win.cpp" ]
-      } else if (is_mac) {
-        sources += [ "tools/sk_app/mac/VulkanWindowContext_mac.mm" ]
-        libs += [ "MetalKit.framework" ]
       }
     }
 
@@ -2322,19 +2199,16 @@
       sources += [ "tools/sk_app/MetalWindowContext.mm" ]
       if (is_mac) {
         sources += [ "tools/sk_app/mac/MetalWindowContext_mac.mm" ]
+      } else if (is_ios) {
+        sources += [ "tools/sk_app/ios/MetalWindowContext_ios.mm" ]
       }
-      libs += [ "MetalKit.framework" ]
     }
 
     deps = [
-      ":gpu_tool_utils",
-      ":skia",
       ":tool_utils",
     ]
     if (is_android) {
       deps += [ "//third_party/native_app_glue" ]
-    } else if (is_ios) {
-      deps += [ "//third_party/libsdl" ]
     }
     if (skia_use_angle) {
       deps += [ "//third_party/angle2" ]
@@ -2348,7 +2222,6 @@
         "tools/fiddle/examples.cpp",
         "tools/fiddle/examples.h",
       ]
-      include_dirs = [ "tools" ]
       if (is_win) {
         cflags = [ "/wd4756" ]  # Overflow in constant arithmetic
       }
@@ -2363,6 +2236,7 @@
   test_app("viewer") {
     is_shared_library = is_android
     sources = [
+      "tools/viewer/AnimTimer.h",
       "tools/viewer/BisectSlide.cpp",
       "tools/viewer/GMSlide.cpp",
       "tools/viewer/ImGuiLayer.cpp",
@@ -2380,7 +2254,6 @@
     ]
     libs = []
 
-    include_dirs = [ "experimental" ]
     deps = [
       ":common_flags_gpu",
       ":experimental_svg_model",
@@ -2399,68 +2272,9 @@
       "modules/sksg:samples",
       "//third_party/imgui",
     ]
-
-    # NIMA does not build on Windows clang
-    if (!is_win || !is_clang) {
-      sources += [ "tools/viewer/NIMASlide.cpp" ]
-      deps += [ "//third_party/Nima-Cpp" ]
-    }
-  }
-
-  if (is_android) {
-    test_app("arcore") {
-      is_shared_library = true
-      configs = [
-        ":skia_public",
-        "gn:default",
-      ]
-
-      # For internship expedience, yes, we're rebuilding Skia rather than depending on :skia.
-      # At the moment there's no way to use Skia and Skottie/SkShaper unless they're in the same .so.
-      public = skia_core_public
-      public += skia_utils_public
-      sources = []
-      sources += skia_core_sources
-      sources += skia_utils_sources
-      sources += skia_xps_sources
-      sources += [
-        "src/android/SkAndroidFrameworkUtils.cpp",
-        "src/android/SkAnimatedImage.cpp",
-        "src/android/SkBitmapRegionCodec.cpp",
-        "src/android/SkBitmapRegionDecoder.cpp",
-        "src/codec/SkAndroidCodec.cpp",
-        "src/codec/SkBmpBaseCodec.cpp",
-        "src/codec/SkBmpCodec.cpp",
-        "src/codec/SkBmpMaskCodec.cpp",
-        "src/codec/SkBmpRLECodec.cpp",
-        "src/codec/SkBmpStandardCodec.cpp",
-        "src/codec/SkCodec.cpp",
-        "src/codec/SkCodecImageGenerator.cpp",
-        "src/codec/SkColorTable.cpp",
-        "src/codec/SkGifCodec.cpp",
-        "src/codec/SkMaskSwizzler.cpp",
-        "src/codec/SkMasks.cpp",
-        "src/codec/SkSampledCodec.cpp",
-        "src/codec/SkSampler.cpp",
-        "src/codec/SkStreamBuffer.cpp",
-        "src/codec/SkSwizzler.cpp",
-        "src/codec/SkWbmpCodec.cpp",
-        "src/images/SkImageEncoder.cpp",
-        "src/ports/SkDiscardableMemory_none.cpp",
-        "src/ports/SkImageGenerator_skia.cpp",
-        "src/ports/SkMemory_malloc.cpp",
-        "src/ports/SkOSFile_stdio.cpp",
-        "src/sfnt/SkOTTable_name.cpp",
-        "src/sfnt/SkOTUtils.cpp",
-        "src/utils/mac/SkStream_mac.cpp",
-        "third_party/etc1/etc1.cpp",
-        "third_party/gif/SkGifImageReader.cpp",
-      ]
-      deps = [
-        ":tool_utils",
-        "modules/skottie",
-        "modules/skshaper",
-      ]
+    if (skia_use_experimental_xform) {
+      deps += [ ":experimental_xform" ]
+      sources += [ "gm/xform.cpp" ]
     }
   }
 
@@ -2471,7 +2285,6 @@
       ]
       libs = []
 
-      include_dirs = []
       deps = [
         ":flags",
         ":gpu_tool_utils",
@@ -2488,7 +2301,6 @@
         "example/SkiaSDLExample.cpp",
       ]
       libs = []
-      include_dirs = []
       deps = [
         ":gpu_tool_utils",
         ":skia",
@@ -2556,8 +2368,6 @@
         "$skia_qt_path/include",
         "$skia_qt_path/include/QtCore",
         "$skia_qt_path/include/QtWidgets",
-        "tools",
-        "tools/debugger",
       ]
       deps = [
         ":generate_mocs",
@@ -2588,4 +2398,45 @@
       ]
     }
   }
+
+  executable("cpu_modules") {
+    sources = [
+      "tools/cpu_modules.cpp",
+    ]
+    deps = [
+      ":skia",
+      "modules/particles",
+    ]
+  }
+
+  if (skia_use_icu && skia_use_harfbuzz) {
+    test_app("editor") {
+      is_shared_library = is_android
+      deps = [
+        "modules/skplaintexteditor:editor_app",
+      ]
+    }
+  }
+
+  executable("image_diff_metric") {
+    sources = [
+      "tools/image_diff_metric.cpp",
+    ]
+    deps = [
+      ":skia",
+    ]
+  }
+}
+
+if (is_ios && skia_use_metal && !skia_enable_flutter_defines) {
+  group("minimal_ios_mtl_skia_app") {
+    deps = [
+      "experimental/minimal_ios_mtl_skia_app",
+    ]
+  }
+  group("skottie_ios") {
+    deps = [
+      "experimental/skottie_ios",
+    ]
+  }
 }
diff --git a/DEPS b/DEPS
index 637885e..c510e4d 100644
--- a/DEPS
+++ b/DEPS
@@ -7,18 +7,19 @@
 deps = {
   "buildtools"                            : "https://chromium.googlesource.com/chromium/buildtools.git@505de88083136eefd056e5ee4ca0f01fe9b33de8",
   "common"                                : "https://skia.googlesource.com/common.git@9737551d7a52c3db3262db5856e6bcd62c462b92",
-  "third_party/externals/angle2"          : "https://chromium.googlesource.com/angle/angle.git@e6b23e45b380bee1a2dfda06e4728d24d4d4ad8b",
-  "third_party/externals/dng_sdk"         : "https://android.googlesource.com/platform/external/dng_sdk.git@96443b262250c390b0caefbf3eed8463ba35ecae",
+  "third_party/externals/angle2"          : "https://chromium.googlesource.com/angle/angle.git@77fba58c9658dcce5729f1df0217fe9e4c0a2733",
+  "third_party/externals/dawn"            : "https://dawn.googlesource.com/dawn.git@f104ec23bc569b5383b9d3df173beeef2b1ff128",
+  "third_party/externals/dng_sdk"         : "https://android.googlesource.com/platform/external/dng_sdk.git@c8d0c9b1d16bfda56f15165d39e0ffa360a11123",
   "third_party/externals/egl-registry"    : "https://skia.googlesource.com/external/github.com/KhronosGroup/EGL-Registry@a0bca08de07c7d7651047bedc0b653cfaaa4f2ae",
-  "third_party/externals/expat"           : "https://android.googlesource.com/platform/external/expat.git@android-6.0.1_r55",
-  "third_party/externals/freetype"        : "https://skia.googlesource.com/third_party/freetype2.git@7edc937fe679d14d66f55cf6f7fa607925d38f3c",
-  "third_party/externals/harfbuzz"        : "https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@4f37ab63de9705d7bf74ee75364747e41b7c06a1",
+  "third_party/externals/expat"           : "https://android.googlesource.com/platform/external/expat.git@e5aa0a2cb0a5f759ef31c0819dc67d9b14246a4a",
+  "third_party/externals/freetype"        : "https://skia.googlesource.com/third_party/freetype2.git@05439f5cc69eaa3deaf3db52a7999af09a2c293a",
+  "third_party/externals/harfbuzz"        : "https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git@1bada656a86e9cb27d4a6b9fcc50748f0bd9c1d9",
   "third_party/externals/icu"             : "https://chromium.googlesource.com/chromium/deps/icu.git@407b39301e71006b68bd38e770f35d32398a7b14",
   "third_party/externals/imgui"           : "https://skia.googlesource.com/external/github.com/ocornut/imgui.git@d38d7c6628bebd02692cfdd6fa76b4d992a35b75",
-  "third_party/externals/libjpeg-turbo"   : "https://skia.googlesource.com/external/github.com/libjpeg-turbo/libjpeg-turbo.git@2.0.0",
-  "third_party/externals/libpng"          : "https://skia.googlesource.com/third_party/libpng.git@v1.6.33",
-  "third_party/externals/libwebp"         : "https://chromium.googlesource.com/webm/libwebp.git@v1.0.2-rc1",
-  "third_party/externals/lua"             : "https://skia.googlesource.com/external/github.com/lua/lua.git@v5-3-4",
+  "third_party/externals/libjpeg-turbo"   : "https://skia.googlesource.com/external/github.com/libjpeg-turbo/libjpeg-turbo.git@574f3a772c96dc9db2c98ef24706feb3f6dbda9a",
+  "third_party/externals/libpng"          : "https://skia.googlesource.com/third_party/libpng.git@386707c6d19b974ca2e3db7f5c61873813c6fe44",
+  "third_party/externals/libwebp"         : "https://chromium.googlesource.com/webm/libwebp.git@0fe1a89dbf1930fc2554dbe76adad5d962054ead",
+  "third_party/externals/lua"             : "https://skia.googlesource.com/external/github.com/lua/lua.git@e354c6355e7f48e087678ec49e340ca0696725b1",
   "third_party/externals/microhttpd"      : "https://android.googlesource.com/platform/external/libmicrohttpd@748945ec6f1c67b7efc934ab0808e1d32f2fb98d",
   "third_party/externals/opencl-lib"      : "https://skia.googlesource.com/external/github.com/GPUOpen-Tools/common-lib-amd-APPSDK-3.0@4e6d30e406d2e5a65e1d65e404fe6df5f772a32b",
   "third_party/externals/opencl-registry" : "https://skia.googlesource.com/external/github.com/KhronosGroup/OpenCL-Registry@932ed55c85f887041291cef8019e54280c033c35",
@@ -26,17 +27,16 @@
   "third_party/externals/piex"            : "https://android.googlesource.com/platform/external/piex.git@bb217acdca1cc0c16b704669dd6f91a1b509c406",
   "third_party/externals/sdl"             : "https://skia.googlesource.com/third_party/sdl@5d7cfcca344034aff9327f77fc181ae3754e7a90",
   "third_party/externals/sfntly"          : "https://chromium.googlesource.com/external/github.com/googlei18n/sfntly.git@b55ff303ea2f9e26702b514cf6a3196a2e3e2974",
-  "third_party/externals/spirv-headers"   : "https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@661ad91124e6af2272afd00f804d8aa276e17107",
-  "third_party/externals/spirv-tools"     : "https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@e9e4393b1c5aad7553c05782acefbe32b42644bd",
-  "third_party/externals/swiftshader"     : "https://swiftshader.googlesource.com/SwiftShader@3954a0bafb8aba97b8fdc365a39161f896edc199",
+  "third_party/externals/spirv-cross"     : "https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross@53ab2144b90abede33be5161aec5dfc94ddc3caf",
+  "third_party/externals/spirv-headers"   : "https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers.git@29c11140baaf9f7fdaa39a583672c556bf1795a1",
+  "third_party/externals/spirv-tools"     : "https://skia.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools.git@0c4feb643b89d1792b02f7cbef315e9d95633bd7",
+  "third_party/externals/swiftshader"     : "https://swiftshader.googlesource.com/SwiftShader@6d69aae0e1ab49190ea46cd1c999fd3d02e016b9",
   #"third_party/externals/v8"              : "https://chromium.googlesource.com/v8/v8.git@5f1ae66d5634e43563b2d25ea652dfb94c31a3b4",
-  "third_party/externals/wuffs"           : "https://skia.googlesource.com/external/github.com/google/wuffs.git@f58ffbc927899b9534a273d3057094ce6ac1ed61",
+  "third_party/externals/wuffs"           : "https://skia.googlesource.com/external/github.com/google/wuffs.git@4080840928c0b05a80cda0d14ac2e2615f679f1a",
   "third_party/externals/zlib"            : "https://chromium.googlesource.com/chromium/src/third_party/zlib@47af7c547f8551bd25424e56354a2ae1e9062859",
-  "third_party/externals/Nima-Cpp"        : "https://skia.googlesource.com/external/github.com/2d-inc/Nima-Cpp.git@4bd02269d7d1d2e650950411325eafa15defb084",
-  "third_party/externals/Nima-Math-Cpp"   : "https://skia.googlesource.com/external/github.com/2d-inc/Nima-Math-Cpp.git@e0c12772093fa8860f55358274515b86885f0108",
 
   "../src": {
-    "url": "https://chromium.googlesource.com/chromium/src.git@f8764798ff0e0e0f41052ed0a70637102a499801",
+    "url": "https://chromium.googlesource.com/chromium/src.git@7ca6de3adb8e5c252e6a35ecd71bb0f52e4e559b",
     "condition": "checkout_chromium",
   },
 }
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 3f177e5..0b7e31f 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -38,6 +38,7 @@
 )
 
 AUTHORS_FILE_NAME = 'AUTHORS'
+RELEASE_NOTES_FILE_NAME = 'RELEASE_NOTES.txt'
 
 DOCS_PREVIEW_URL = 'https://skia.org/?cl='
 GOLD_TRYBOT_URL = 'https://gold.skia.org/search?issue='
@@ -191,6 +192,37 @@
           '`%s` failed, try\n\t%s' % (' '.join(cmd), fix)))
   return results
 
+def _CheckIncludesFormatted(input_api, output_api):
+  """Make sure #includes in files we're changing have been formatted."""
+  files = [str(f) for f in input_api.AffectedFiles() if f.Action() != 'D']
+  cmd = ['python',
+         'tools/rewrite_includes.py',
+         '--dry-run'] + files
+  if 0 != subprocess.call(cmd):
+    return [output_api.PresubmitError('`%s` failed' % ' '.join(cmd))]
+  return []
+
+def _CheckCompileIsolate(input_api, output_api):
+  """Ensure that gen_compile_isolate.py does not change compile.isolate."""
+  # Only run the check if files were added or removed.
+  results = []
+  script = os.path.join('infra', 'bots', 'gen_compile_isolate.py')
+  isolate = os.path.join('infra', 'bots', 'compile.isolated')
+  for f in input_api.AffectedFiles():
+    if f.Action() in ('A', 'D', 'R'):
+      break
+    if f.LocalPath() in (script, isolate):
+      break
+  else:
+    return results
+
+  cmd = ['python', script, 'test']
+  try:
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+  except subprocess.CalledProcessError as e:
+    results.append(output_api.PresubmitError(e.output))
+  return results
+
 
 class _WarningsAsErrors():
   def __init__(self, output_api):
@@ -204,6 +236,24 @@
     self.output_api.PresubmitPromptWarning = self.old_warning
 
 
+def _CheckDEPSValid(input_api, output_api):
+  """Ensure that DEPS contains valid entries."""
+  results = []
+  script = os.path.join('infra', 'bots', 'check_deps.py')
+  relevant_files = ('DEPS', script)
+  for f in input_api.AffectedFiles():
+    if f.LocalPath() in relevant_files:
+      break
+  else:
+    return results
+  cmd = ['python', script]
+  try:
+    subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+  except subprocess.CalledProcessError as e:
+    results.append(output_api.PresubmitError(e.output))
+  return results
+
+
 def _CommonChecks(input_api, output_api):
   """Presubmit checks common to upload and commit."""
   results = []
@@ -228,6 +278,9 @@
   results.extend(_CopyrightChecks(input_api, output_api,
                                   source_file_filter=sources))
   results.extend(_ToolFlags(input_api, output_api))
+  results.extend(_CheckCompileIsolate(input_api, output_api))
+  results.extend(_CheckDEPSValid(input_api, output_api))
+  results.extend(_CheckIncludesFormatted(input_api, output_api))
   return results
 
 
@@ -244,6 +297,7 @@
   results.extend(_InfraTests(input_api, output_api))
 
   results.extend(_CheckGNFormatted(input_api, output_api))
+  results.extend(_CheckReleaseNotesForPublicAPI(input_api, output_api))
   return results
 
 
@@ -259,7 +313,7 @@
       input_api, output_api, json_url=json_url)
   if not tree_status_results:
     # Check for caution state only if tree is not closed.
-    connection = input_api.urllib2.urlopen(json_url)
+    connection = input_api.urllib_request.urlopen(json_url)
     status = input_api.json.loads(connection.read())
     connection.close()
     if ('caution' in status['message'].lower() and
@@ -274,7 +328,7 @@
               message=short_text, long_text=long_text))
   else:
     # Tree status is closed. Put in message about contacting sheriff.
-    connection = input_api.urllib2.urlopen(
+    connection = input_api.urllib_request.urlopen(
         SKIA_TREE_STATUS_URL + '/current-sheriff')
     sheriff_details = input_api.json.loads(connection.read())
     if sheriff_details:
@@ -357,6 +411,31 @@
   return results
 
 
+def _CheckReleaseNotesForPublicAPI(input_api, output_api):
+  """Checks to see if release notes file is updated with public API changes."""
+  results = []
+  public_api_changed = False
+  release_file_changed = False
+  for affected_file in input_api.AffectedFiles():
+    affected_file_path = affected_file.LocalPath()
+    file_path, file_ext = os.path.splitext(affected_file_path)
+    # We only care about files that end in .h and are under the top-level
+    # include dir, but not include/private.
+    if (file_ext == '.h' and
+        file_path.split(os.path.sep)[0] == 'include' and
+        'private' not in file_path):
+      public_api_changed = True
+    elif affected_file_path == RELEASE_NOTES_FILE_NAME:
+      release_file_changed = True
+
+  if public_api_changed and not release_file_changed:
+    results.append(output_api.PresubmitPromptWarning(
+        'If this change affects a client API, please add a summary line '
+        'to the %s file.' % RELEASE_NOTES_FILE_NAME))
+  return results
+
+
+
 def _CheckLGTMsForPublicAPI(input_api, output_api):
   """Check LGTMs for public API changes.
 
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
new file mode 100644
index 0000000..af2be25
--- /dev/null
+++ b/RELEASE_NOTES.txt
@@ -0,0 +1,158 @@
+Skia Graphics Release Notes
+
+This file includes a list of high level updates for each milestone release.
+
+* * *
+
+Milestone 80
+
+<Insert new notes here- top is most recent.>
+
+* * *
+
+Milestone 79
+
+  * SkTextBlob::Iter to discover the glyph indices and typefaces in each run
+    https://skia-review.googlesource.com/246296
+
+  * Added support for PQ and HLG transfer functions to SkColorSpace.
+    https://skia-review.googlesource.com/c/skia/+/249000
+
+  * Added new api on GrContext ComputeImageSize. This replaces the hold static helper
+    ComputeTextureSize.
+    https://skia-review.googlesource.com/c/skia/+/247337
+
+  * New versions of SkSurface async-rescale-and read APIs that allow client to extend
+    the lifetime of the result data. Old versions are deprecated.
+    https://review.skia.org/245457
+
+  * Add SkColorInfo. It's dimensionless SkImageInfo.
+    https://review.skia.org/245261
+
+  * Added SkPixmap-based createBackendTexture method to GrContext. This allows clients to create
+    backend resources (initialized with texture data) that Skia/Ganesh doesn't know about/track.
+    https://review.skia.org/244676
+
+  * Add explicit src and dst colorspace parameters to SkColorFilter::filterColor4f()
+    https://review.skia.org/244882
+
+  * Remove Vulkan/Metal float32 RGBA texture support
+    https://review.skia.org/244881
+
+  * Add SkSurface::MakeFromCAMetalLayer
+    https://review.skia.org/242563
+
+  * Added kAlpha_F16_SkColorType, kRG_F16_SkColorType and kRGBA_16161616_SkColorType.
+    This is intended to help support HDR YUV uses case (e.g., P010 and P016). As such,
+    the addition is focused on allowing creation of SkPixmaps and SkImages and not
+    SkSurfaces (i.e., who wants to render to render to these?)
+    https://review.skia.org/241357
+
+  * Start to move nested SkPath types (e.g. Direction, Verb) up to root level in SkPathTypes.h
+    https://review.skia.org/241079
+
+  * Remove isRectContour and ksNestedFillRects from public
+    https://review.skia.org/241078
+
+  * Added kRG_88_SkColorType. This is intended to help support YUV uses case (e.g., NV12).
+    As such, the addition is focused on allowing creation of SkPixmaps and SkImages and not
+    SkSurfaces (i.e., who wants to render to RG?)
+    https://review.skia.org/239930
+    https://review.skia.org/235797
+
+  * Make the size of program/pipeline caches configurable via
+    GrContextOptions::fRuntimeProgramCacheSize
+    https://review.skia.org/239756
+
+  * Added kAlpha_16_SkColorType and kRG_1616_SkColorType. This is intended to help support HDR YUV
+    uses case (e.g., P010 and P016). As such, the addition is focused on allowing creation of
+    SkPixmaps and SkImages and not SkSurfaces (i.e., who wants to render to render to these?)
+    https://review.skia.org/239930
+
+  * Add GrContext::precompileShader to allow up-front compilation of previously-cached shaders.
+    https://review.skia.org/239438
+
+* * *
+
+Milestone 78
+
+  * SkDrawLooper is no longer supported in SkPaint or SkCanvas.
+    https://review.skia.org/230579
+    https://review.skia.org/231736
+
+  * SkPath::Iter::next() now ignores its consumDegenerates bools. Those will so
+    go away entirely
+    https://review.skia.org/235104
+
+  * SkImage: new factories: DecodeToRaster, DecodeToTexture
+    https://review.skia.org/234476
+
+  * SkImageFilter API refactor started:
+    - Provide new factory API in include/effects/SkImageFilters
+    - Consolidated enum types to use SkTileMode and SkColorChannel
+    - Hide filter implementation classes
+    - Hide previously public functions on SkImageFilter that were intended for
+      internal use only
+    https://review.skia.org/230198
+    https://review.skia.org/230876
+    https://review.skia.org/231256
+
+  * SkColorFilters::HSLAMatrix - new matrix color filter operating in HSLA
+    space.
+    https://review.skia.org/231736
+
+  * Modify GrBackendFormat getters to not return internal pointers. Use an enum
+    class for GL formats.
+    https://review.skia.org/233160
+
+  * Expose GrContext::dump() when SK_ENABLE_DUMP_GPU is defined.
+    https://review.skia.org/233557
+
+  * Vulkan backend now supports YCbCr sampler for I420 Vulkan images that are
+    not backed by external images.
+    https://review.skia.org/233776
+
+  * Add SkCodec::SelectionPolicy for distinguishing between decoding a still
+    image or an image sequence for a container format that has both (e.g. HEIF).
+    https://review.skia.org/232839
+
+  * SkImage::makeTextureImage and SkImage::MakeCrossContextFromPixmap no longer
+    take an SkColorSpace parameter. It was unused.
+    https://review.skia.org/234579
+    https://review.skia.org/234912
+
+  * SkImage::reinterpretColorSpace - to reinterpret image contents in a new
+    color space.
+    https://review.skia.org/234328
+
+  * Removed SkImage::MakeCrossContextFromEncoded.
+    https://review.skia.org/234912
+
+  * Add Metal support for GrFence, GrSemaphore, and GrBackendSemaphore
+    https://review.skia.org/233416
+
+  * SkMallocPixelRef: remove MakeDirect and MakeWithProc from API.
+    https://review.skia.org/234660
+
+  * Remove 4-parameter variant of SkRect::join() and intersect(), and
+    noemptycheck variants of intersect().
+    https://review.skia.org/235832
+    https://review.skia.org/237142
+
+  * Remove unused sk_sp comparison operators.
+    https://review.skia.org/236942
+
+  * Add SkColor4f variant to experimental_DrawEdgeAAQuad for SkiaRenderer.
+    https://review.skia.org/237492
+
+  * Deprecated maxCount resource cache limit for Ganesh.
+    This hasn't been relevant for a long time.
+
+  * Changed GrContextOptions' fDisallowGLSLBinaryCaching to fShaderCacheStrategy,
+    and allow caching SkSL.
+    https://review.skia.org/238856
+
+  * Use GL_QCOM_TILED_RENDERING to explicitly discard stencil
+
+  * Added RELEASE_NOTES.txt file
+    https://review.skia.org/229760
diff --git a/bench/AAClipBench.cpp b/bench/AAClipBench.cpp
index 82e4e38..abd7ec5 100644
--- a/bench/AAClipBench.cpp
+++ b/bench/AAClipBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkAAClip.h"
-#include "SkCanvas.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkRegion.h"
-#include "SkString.h"
-#include "SkClipOpPriv.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkRegion.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkAAClip.h"
+#include "src/core/SkClipOpPriv.h"
 
 ////////////////////////////////////////////////////////////////////////////////
 // This bench tests out AA/BW clipping via canvas' clipPath and clipRect calls
@@ -33,11 +33,9 @@
                      doPath ? "path" : "rect",
                      doAA ? "AA" : "BW");
 
-        fClipRect.set(10.5f, 10.5f,
-                      50.5f, 50.5f);
+        fClipRect.setLTRB(10.5f, 10.5f, 50.5f, 50.5f);
         fClipPath.addRoundRect(fClipRect, SkIntToScalar(10), SkIntToScalar(10));
-        fDrawRect.set(SkIntToScalar(0), SkIntToScalar(0),
-                      SkIntToScalar(100), SkIntToScalar(100));
+        fDrawRect.setWH(100, 100);
 
         SkASSERT(fClipPath.isConvex());
     }
@@ -187,7 +185,7 @@
         fName.printf("aaclip_build_%s_%s", doPath ? "path" : "rect",
                      doAA ? "AA" : "BW");
 
-        fRegion.setRect(0, 0, 640, 480);
+        fRegion.setRect({0, 0, 640, 480});
         fRect.set(fRegion.getBounds());
         fRect.inset(SK_Scalar1/4, SK_Scalar1/4);
         fPath.addRoundRect(fRect, SkIntToScalar(20), SkIntToScalar(20));
diff --git a/bench/AlternatingColorPatternBench.cpp b/bench/AlternatingColorPatternBench.cpp
index b2735cf0..4bcf0c3 100644
--- a/bench/AlternatingColorPatternBench.cpp
+++ b/bench/AlternatingColorPatternBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkGradientShader.h"
 
 enum ColorPattern {
     kWhite_ColorPattern,
@@ -121,8 +121,8 @@
                 int x = (w + offset) * i;
                 int y = (h * offset) * j;
                 if (kRect_DrawType == fDrawType) {
-                    fRects[count].set(SkIntToScalar(x), SkIntToScalar(y),
-                                      SkIntToScalar(x + w), SkIntToScalar(y + h));
+                    fRects[count].setXYWH(SkIntToScalar(x), SkIntToScalar(y),
+                                          SkIntToScalar(w), SkIntToScalar(h));
                 } else {
                     fPaths[count].moveTo(SkIntToScalar(x), SkIntToScalar(y));
                     fPaths[count].rLineTo(SkIntToScalar(w), 0);
diff --git a/bench/AndroidCodecBench.cpp b/bench/AndroidCodecBench.cpp
index ba92a74..894c21b 100644
--- a/bench/AndroidCodecBench.cpp
+++ b/bench/AndroidCodecBench.cpp
@@ -5,12 +5,12 @@
  * found in the LICENSE file.
  */
 
-#include "AndroidCodecBench.h"
-#include "CodecBenchPriv.h"
-#include "CommandLineFlags.h"
-#include "SkAndroidCodec.h"
-#include "SkBitmap.h"
-#include "SkOSFile.h"
+#include "bench/AndroidCodecBench.h"
+#include "bench/CodecBenchPriv.h"
+#include "include/codec/SkAndroidCodec.h"
+#include "include/core/SkBitmap.h"
+#include "src/core/SkOSFile.h"
+#include "tools/flags/CommandLineFlags.h"
 
 AndroidCodecBench::AndroidCodecBench(SkString baseName, SkData* encoded, int sampleSize)
     : fData(SkRef(encoded))
@@ -32,8 +32,7 @@
     std::unique_ptr<SkAndroidCodec> codec(SkAndroidCodec::MakeFromData(fData));
     SkISize scaledSize = codec->getSampledDimensions(fSampleSize);
 
-    fInfo = codec->getInfo().makeWH(scaledSize.width(), scaledSize.height())
-            .makeColorType(kN32_SkColorType);
+    fInfo = codec->getInfo().makeDimensions(scaledSize).makeColorType(kN32_SkColorType);
     if (kUnpremul_SkAlphaType == fInfo.alphaType()) {
         fInfo = fInfo.makeAlphaType(kPremul_SkAlphaType);
     }
diff --git a/bench/AndroidCodecBench.h b/bench/AndroidCodecBench.h
index 528ecab..95c9781 100644
--- a/bench/AndroidCodecBench.h
+++ b/bench/AndroidCodecBench.h
@@ -8,12 +8,12 @@
 #ifndef AndroidCodecBench_DEFINED
 #define AndroidCodecBench_DEFINED
 
-#include "Benchmark.h"
-#include "SkAutoMalloc.h"
-#include "SkData.h"
-#include "SkImageInfo.h"
-#include "SkRefCnt.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkData.h"
+#include "include/core/SkImageInfo.h"
+#include "include/core/SkRefCnt.h"
+#include "include/core/SkString.h"
+#include "src/core/SkAutoMalloc.h"
 
 /**
  *  Time SkAndroidCodec.
diff --git a/bench/BenchLogger.cpp b/bench/BenchLogger.cpp
index 7eae514..cef5232 100644
--- a/bench/BenchLogger.cpp
+++ b/bench/BenchLogger.cpp
@@ -5,9 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "BenchLogger.h"
+#include "bench/BenchLogger.h"
 
-#include "SkStream.h"
+#include "include/core/SkStream.h"
 
 BenchLogger::BenchLogger()
 : fFileStream(nullptr) {}
diff --git a/bench/BenchLogger.h b/bench/BenchLogger.h
index a7c283a..9e4aa65 100644
--- a/bench/BenchLogger.h
+++ b/bench/BenchLogger.h
@@ -9,8 +9,8 @@
 #define BenchLogger_DEFINED
 
 #include <stdio.h>
-#include "SkString.h"
-#include "SkTypes.h"
+#include "include/core/SkString.h"
+#include "include/core/SkTypes.h"
 
 class SkFILEWStream;
 
diff --git a/bench/Benchmark.cpp b/bench/Benchmark.cpp
index 9438e08..eba1750 100644
--- a/bench/Benchmark.cpp
+++ b/bench/Benchmark.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkParse.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/utils/SkParse.h"
 
 template BenchRegistry* BenchRegistry::gHead;
 
diff --git a/bench/Benchmark.h b/bench/Benchmark.h
index b9126ce..58fa2c6 100644
--- a/bench/Benchmark.h
+++ b/bench/Benchmark.h
@@ -8,10 +8,10 @@
 #ifndef Benchmark_DEFINED
 #define Benchmark_DEFINED
 
-#include "SkPoint.h"
-#include "SkRefCnt.h"
-#include "SkString.h"
-#include "../tools/Registry.h"
+#include "include/core/SkPoint.h"
+#include "include/core/SkRefCnt.h"
+#include "include/core/SkString.h"
+#include "tools/Registry.h"
 
 #define DEF_BENCH3(code, N) \
     static BenchRegistry gBench##N([](void*) -> Benchmark* { code; });
@@ -79,7 +79,12 @@
 
     virtual void getGpuStats(SkCanvas*, SkTArray<SkString>* keys, SkTArray<double>* values) {}
 
+    // Count of units (pixels, whatever) being exercised, to scale timing by.
+    int getUnits() const { return fUnits; }
+
 protected:
+    void setUnits(int units) { SkASSERT(units > 0); fUnits = units; }
+
     virtual void setupPaint(SkPaint* paint);
 
     virtual const char* onGetName() = 0;
@@ -96,6 +101,8 @@
     virtual SkIPoint onGetSize();
 
 private:
+    int fUnits = 1;
+
     typedef SkRefCnt INHERITED;
 };
 
diff --git a/bench/BezierBench.cpp b/bench/BezierBench.cpp
index 6c8be69..395cdde 100644
--- a/bench/BezierBench.cpp
+++ b/bench/BezierBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkString.h"
 
 struct BezierRec {
     SkCanvas*   fCanvas;
diff --git a/bench/BigPathBench.cpp b/bench/BigPathBench.cpp
index 6c49ae7..02f4203 100644
--- a/bench/BigPathBench.cpp
+++ b/bench/BigPathBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPath.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPath.h"
+#include "tools/ToolUtils.h"
 
 enum Align {
     kLeft_Align,
diff --git a/bench/BitmapBench.cpp b/bench/BitmapBench.cpp
index a44a897..aad28a6 100644
--- a/bench/BitmapBench.cpp
+++ b/bench/BitmapBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "tools/ToolUtils.h"
 
 /*  Variants for bitmaps
 
@@ -113,7 +113,7 @@
                           SkIntToScalar(SkMin32(w, h))*3/8, p);
 
         SkRect r;
-        r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
+        r.setWH(SkIntToScalar(w), SkIntToScalar(h));
         p.setStyle(SkPaint::kStroke_Style);
         p.setStrokeWidth(SkIntToScalar(4));
         p.setColor(SK_ColorBLUE);
@@ -178,7 +178,7 @@
 
             canvas->translate(x, y);
             // just enough so we can't take the sprite case
-            canvas->scale(SK_Scalar1 * 99/100, SK_Scalar1 * 99/100);
+            canvas->scale(1.1f, 1.1f);
             canvas->translate(-x, -y);
         }
         if (fFlags & kRotate_Flag) {
@@ -266,7 +266,7 @@
             SkRect r;
             for (int x = 0; x < w; x+=2)
             {
-                r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
+                r.setLTRB(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
                 canvas.drawRect(r, p);
             }
 
@@ -291,7 +291,7 @@
                 } else if (x % 3 == 2) {
                     p.setColor(SK_ColorRED); // Opaque
                 }
-                r.set(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
+                r.setLTRB(SkIntToScalar(x), 0, SkIntToScalar(x+1), SkIntToScalar(h));
                 canvas.drawRect(r, p);
             }
         }
diff --git a/bench/BitmapRectBench.cpp b/bench/BitmapRectBench.cpp
index 0e5d362..0a13362 100644
--- a/bench/BitmapRectBench.cpp
+++ b/bench/BitmapRectBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
-#include "SkTo.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/private/SkTo.h"
+#include "include/utils/SkRandom.h"
 
 static void draw_into_bitmap(const SkBitmap& bm) {
     const int w = bm.width();
@@ -26,7 +26,7 @@
                       SkIntToScalar(SkMin32(w, h))*3/8, p);
 
     SkRect r;
-    r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
+    r.setWH(SkIntToScalar(w), SkIntToScalar(h));
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SkIntToScalar(4));
     p.setColor(SK_ColorBLUE);
@@ -74,8 +74,8 @@
         fBitmap.eraseColor(SK_ColorBLACK);
         draw_into_bitmap(fBitmap);
 
-        fSrcR.iset(0, 0, kWidth, kHeight);
-        fDstR.iset(0, 0, kWidth, kHeight);
+        fSrcR.setWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight));
+        fDstR.setWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight));
 
         if (fSlightMatrix) {
             // want fractional translate
diff --git a/bench/BitmapRegionDecoderBench.cpp b/bench/BitmapRegionDecoderBench.cpp
index d80fc5d..52014b9 100644
--- a/bench/BitmapRegionDecoderBench.cpp
+++ b/bench/BitmapRegionDecoderBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "BitmapRegionDecoderBench.h"
-#include "CodecBenchPriv.h"
-#include "SkBitmap.h"
-#include "SkOSFile.h"
+#include "bench/BitmapRegionDecoderBench.h"
+#include "bench/CodecBenchPriv.h"
+#include "include/core/SkBitmap.h"
+#include "src/core/SkOSFile.h"
 
 BitmapRegionDecoderBench::BitmapRegionDecoderBench(const char* baseName, SkData* encoded,
         SkColorType colorType, uint32_t sampleSize, const SkIRect& subset)
diff --git a/bench/BitmapRegionDecoderBench.h b/bench/BitmapRegionDecoderBench.h
index 3099055..3d3372f 100644
--- a/bench/BitmapRegionDecoderBench.h
+++ b/bench/BitmapRegionDecoderBench.h
@@ -8,12 +8,12 @@
 #ifndef BitmapRegionDecoderBench_DEFINED
 #define BitmapRegionDecoderBench_DEFINED
 
-#include "Benchmark.h"
-#include "SkBitmapRegionDecoder.h"
-#include "SkData.h"
-#include "SkImageInfo.h"
-#include "SkRefCnt.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/android/SkBitmapRegionDecoder.h"
+#include "include/core/SkData.h"
+#include "include/core/SkImageInfo.h"
+#include "include/core/SkRefCnt.h"
+#include "include/core/SkString.h"
 
 /**
  *  Benchmark Android's BitmapRegionDecoder for a particular colorType, sampleSize, and subset.
diff --git a/bench/BlendmodeBench.cpp b/bench/BlendmodeBench.cpp
index c89e7ea..5fb7a7b 100644
--- a/bench/BlendmodeBench.cpp
+++ b/bench/BlendmodeBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBlendModePriv.h"
-#include "SkCanvas.h"
-#include "SkFont.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
-#include "SkTextBlob.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkFont.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/core/SkTextBlob.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkBlendModePriv.h"
 
 // Benchmark that draws non-AA rects or AA text with an SkXfermode::Mode.
 class XfermodeBench : public Benchmark {
@@ -40,7 +40,7 @@
                 font.setSize(random.nextRangeScalar(12, 96));
                 SkScalar x = random.nextRangeScalar(0, (SkScalar)size.fWidth),
                          y = random.nextRangeScalar(0, (SkScalar)size.fHeight);
-                auto blob = SkTextBlob::MakeFromText(text, len, font, kUTF8_SkTextEncoding);
+                auto blob = SkTextBlob::MakeFromText(text, len, font, SkTextEncoding::kUTF8);
                 for (int j = 0; j < 1000; ++j) {
                     canvas->drawTextBlob(blob, x, y, paint);
                 }
diff --git a/bench/BlurBench.cpp b/bench/BlurBench.cpp
index d253f67..06d19d6 100644
--- a/bench/BlurBench.cpp
+++ b/bench/BlurBench.cpp
@@ -4,14 +4,14 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkBlurMask.h"
-#include "SkCanvas.h"
-#include "SkMaskFilter.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkMaskFilter.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkBlurMask.h"
 
 #define MINI    0.01f
 #define SMALL   SkIntToScalar(2)
diff --git a/bench/BlurImageFilterBench.cpp b/bench/BlurImageFilterBench.cpp
index fdd77ae..4dadb76 100644
--- a/bench/BlurImageFilterBench.cpp
+++ b/bench/BlurImageFilterBench.cpp
@@ -5,15 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkBlurImageFilter.h"
-#include "SkOffsetImageFilter.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkImageFilters.h"
+#include "include/utils/SkRandom.h"
 
 #define FILTER_WIDTH_SMALL  32
 #define FILTER_HEIGHT_SMALL 32
@@ -91,22 +90,20 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        static const SkScalar kX = 0;
-        static const SkScalar kY = 0;
-        const SkRect bmpRect = SkRect::MakeXYWH(kX, kY,
-                                                SkIntToScalar(fCheckerboard.width()),
-                                                SkIntToScalar(fCheckerboard.height()));
-        const SkImageFilter::CropRect cropRect(bmpRect.makeInset(10.f, 10.f));
-        const SkImageFilter::CropRect cropRectLarge(bmpRect);
+        static const int kX = 0;
+        static const int kY = 0;
+        const SkIRect bmpRect = SkIRect::MakeXYWH(kX, kY, fCheckerboard.width(),
+                                                  fCheckerboard.height());
+        const SkIRect bmpRectInset = bmpRect.makeInset(10, 10);
 
         sk_sp<SkImageFilter> input = fIsExpanded
-                                        ? SkOffsetImageFilter::Make(0, 0, nullptr, &cropRect)
+                                        ? SkImageFilters::Offset(0, 0, nullptr, &bmpRectInset)
                                         : nullptr;
 
-        const SkImageFilter::CropRect* crop =
-            fIsExpanded ? &cropRectLarge : fIsCropped ? &cropRect : nullptr;
+        const SkIRect* crop =
+            fIsExpanded ? &bmpRect : fIsCropped ? &bmpRectInset : nullptr;
         SkPaint paint;
-        paint.setImageFilter(SkBlurImageFilter::Make(fSigmaX, fSigmaY, std::move(input), crop));
+        paint.setImageFilter(SkImageFilters::Blur(fSigmaX, fSigmaY, std::move(input), crop));
 
         for (int i = 0; i < loops; i++) {
             canvas->drawBitmap(fCheckerboard, kX, kY, &paint);
diff --git a/bench/BlurRectBench.cpp b/bench/BlurRectBench.cpp
index 3449ffa..2fe92bd 100644
--- a/bench/BlurRectBench.cpp
+++ b/bench/BlurRectBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBlurMask.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkBlurMask.h"
 
 #define SMALL   SkIntToScalar(2)
 #define REAL    1.5f
diff --git a/bench/BlurRectsBench.cpp b/bench/BlurRectsBench.cpp
index d41ee1a..ed2b254 100644
--- a/bench/BlurRectsBench.cpp
+++ b/bench/BlurRectsBench.cpp
@@ -5,13 +5,13 @@
 * found in the LICENSE file.
 */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkMaskFilter.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRect.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkMaskFilter.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkRect.h"
+#include "include/core/SkString.h"
 
 class BlurRectsBench : public Benchmark {
 public:
diff --git a/bench/BlurRoundRectBench.cpp b/bench/BlurRoundRectBench.cpp
deleted file mode 100644
index 624c681..0000000
--- a/bench/BlurRoundRectBench.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-* Copyright 2013 Google Inc.
-*
-* Use of this source code is governed by a BSD-style license that can be
-* found in the LICENSE file.
-*/
-
-#include "Benchmark.h"
-#include "SkBlurMask.h"
-#include "SkCanvas.h"
-#include "SkColorFilter.h"
-#include "SkLayerDrawLooper.h"
-#include "SkMaskFilter.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkPoint.h"
-#include "SkRRect.h"
-#include "SkRect.h"
-#include "SkString.h"
-
-// Large blurred RR appear frequently on web pages. This benchmark measures our
-// performance in this case.
-class BlurRoundRectBench : public Benchmark {
-public:
-    BlurRoundRectBench(int width, int height, int cornerRadius)
-        : fName("blurroundrect") {
-        fName.appendf("_WH_%ix%i_cr_%i", width, height, cornerRadius);
-        SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
-        fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius));
-    }
-
-    const char* onGetName() override {
-        return fName.c_str();
-    }
-
-    SkIPoint onGetSize() override {
-        return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()),
-                              SkScalarCeilToInt(fRRect.rect().height()));
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkLayerDrawLooper::Builder looperBuilder;
-        {
-            SkLayerDrawLooper::LayerInfo info;
-            info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
-                              | SkLayerDrawLooper::kColorFilter_Bit;
-            info.fColorMode = SkBlendMode::kSrc;
-            info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
-            info.fPostTranslate = false;
-            SkPaint* paint = looperBuilder.addLayerOnTop(info);
-            paint->setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
-                                                        SkBlurMask::ConvertRadiusToSigma(0.5)));
-            paint->setColorFilter(SkColorFilters::Blend(SK_ColorLTGRAY, SkBlendMode::kSrcIn));
-            paint->setColor(SK_ColorGRAY);
-        }
-        {
-            SkLayerDrawLooper::LayerInfo info;
-            looperBuilder.addLayerOnTop(info);
-        }
-        SkPaint dullPaint;
-        dullPaint.setAntiAlias(true);
-
-        SkPaint loopedPaint;
-        loopedPaint.setLooper(looperBuilder.detach());
-        loopedPaint.setAntiAlias(true);
-        loopedPaint.setColor(SK_ColorCYAN);
-
-        for (int i = 0; i < loops; i++) {
-            canvas->drawRect(fRRect.rect(), dullPaint);
-            canvas->drawRRect(fRRect, loopedPaint);
-        }
-    }
-
-private:
-    SkString    fName;
-    SkRRect     fRRect;
-
-    typedef     Benchmark INHERITED;
-};
-
-// Create one with dimensions/rounded corners based on the skp
-DEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);)
-// Same radii, much smaller rectangle
-DEF_BENCH(return new BlurRoundRectBench(100, 100, 6);)
-// Other radii options
-DEF_BENCH(return new BlurRoundRectBench(100, 100, 30);)
-DEF_BENCH(return new BlurRoundRectBench(100, 100, 90);)
diff --git a/bench/CTConvertBench.cpp b/bench/CTConvertBench.cpp
new file mode 100644
index 0000000..a46c88c
--- /dev/null
+++ b/bench/CTConvertBench.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkString.h"
+#include "include/core/SkSurface.h"
+#include "src/core/SkAutoPixmapStorage.h"
+
+class CTConvertBench : public Benchmark {
+public:
+    enum class Mode { kDrawBitmap, kReadPixels };
+
+    CTConvertBench(SkColorType from, SkColorType to, Mode m)
+        : fName(SkStringPrintf("ctconvert_%d_%d_%s", from, to,
+                               m == Mode::kReadPixels ? "readpixels" : "drawbitmap"))
+        , fFrom(from)
+        , fTo(to)
+        , fMode(m) {}
+
+    bool isSuitableFor(Backend backend) override {
+        return backend == kNonRendering_Backend;
+    }
+
+protected:
+    const char* onGetName() override {
+        return fName.c_str();
+    }
+
+    void onPreDraw(SkCanvas*) override {
+        if (fSrc.addr()) return;
+
+        fSrc.alloc(SkImageInfo::Make(kBMSize, kBMSize, fFrom, kPremul_SkAlphaType));
+        fSrc.erase(0x80808080);
+
+        fDst.alloc(SkImageInfo::Make(kBMSize, kBMSize, fTo  , kPremul_SkAlphaType));
+
+        if (fMode == Mode::kDrawBitmap) {
+            fSrcBM.installPixels(fSrc);
+            fDstSurf = SkSurface::MakeRasterDirect(fDst.info(), fDst.writable_addr(),
+                                                   fDst.info().minRowBytes());
+        }
+    }
+
+    void onDraw(int loops, SkCanvas*) override {
+        switch (fMode) {
+        case Mode::kDrawBitmap: {
+            SkPaint p;
+            p.setBlendMode(SkBlendMode::kSrc);
+            for (int i = 0; i < loops; ++i) {
+                fDstSurf->getCanvas()->drawBitmap(fSrcBM, 0, 0, &p);
+            }
+        } break;
+        case Mode::kReadPixels: {
+            for (int i = 0; i < loops; ++i) {
+                fSrc.readPixels(fDst);
+            }
+        } break;
+        }
+    }
+
+private:
+    static constexpr size_t kBMSize = 512;
+
+    const SkString    fName;
+    const SkColorType fFrom, fTo;
+    const Mode        fMode;
+
+    SkAutoPixmapStorage fSrc, fDst;
+    SkBitmap            fSrcBM;
+    sk_sp<SkSurface>    fDstSurf;
+
+    typedef Benchmark INHERITED;
+};
+
+DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
+                                     CTConvertBench::Mode::kDrawBitmap); )
+
+DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kBGRA_8888_SkColorType,
+                                     CTConvertBench::Mode::kReadPixels); )
+
+DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kRGBA_8888_SkColorType,
+                                     CTConvertBench::Mode::kDrawBitmap); )
+
+DEF_BENCH( return new CTConvertBench(kRGBA_8888_SkColorType, kRGBA_8888_SkColorType,
+                                     CTConvertBench::Mode::kReadPixels); )
diff --git a/bench/ChartBench.cpp b/bench/ChartBench.cpp
index 944f610..1daa637 100644
--- a/bench/ChartBench.cpp
+++ b/bench/ChartBench.cpp
@@ -5,12 +5,12 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkTDArray.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/private/SkTDArray.h"
+#include "include/utils/SkRandom.h"
 
 /**
  * This is a conversion of samplecode/SampleChart.cpp into a bench. It sure would be nice to be able
diff --git a/bench/ChecksumBench.cpp b/bench/ChecksumBench.cpp
index 685ac20..03d8bef 100644
--- a/bench/ChecksumBench.cpp
+++ b/bench/ChecksumBench.cpp
@@ -4,13 +4,13 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkChecksum.h"
-#include "SkOpts.h"
-#include "SkMD5.h"
-#include "SkRandom.h"
-#include "SkTemplates.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/private/SkChecksum.h"
+#include "include/private/SkTemplates.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkMD5.h"
+#include "src/core/SkOpts.h"
 
 enum ChecksumType {
     kMD5_ChecksumType,
@@ -43,7 +43,7 @@
             case kMD5_ChecksumType: return "compute_md5";
             case kHash_ChecksumType: return "compute_hash";
 
-            default: SK_ABORT("Invalid Type"); return "";
+            default: SK_ABORT("Invalid Type");
         }
     }
 
diff --git a/bench/ChromeBench.cpp b/bench/ChromeBench.cpp
index 60d86f9..a4f56e9 100644
--- a/bench/ChromeBench.cpp
+++ b/bench/ChromeBench.cpp
@@ -4,10 +4,10 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
 
 /**
    Benchmarks that try to emulate a particular Skia call pattern observed in Chrome.
@@ -476,8 +476,8 @@
     virtual SkIPoint onGetSize() { return SkIPoint::Make(W, H); }
 
     void setRectangle(SkRect& current, int i) {
-        current.set(0, 0,
-                    SkIntToScalar(gmailScrollingRectSpec[i*3+1]), SkIntToScalar(gmailScrollingRectSpec[i*3+2]));
+        current.setWH(SkIntToScalar(gmailScrollingRectSpec[i*3+1]),
+                      SkIntToScalar(gmailScrollingRectSpec[i*3+2]));
     }
     void validateBounds(SkCanvas* canvas) {
 #ifdef SK_DEBUG
diff --git a/bench/ClearBench.cpp b/bench/ClearBench.cpp
index 2fbfd8f..5b548c2 100644
--- a/bench/ClearBench.cpp
+++ b/bench/ClearBench.cpp
@@ -10,15 +10,15 @@
 // partial clears on the GPU should follow a fast path that maps to backend-specialized clear
 // operations, whereas the rounded-rect clear cannot be.
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkPaint.h"
-#include "SkRect.h"
-#include "SkRRect.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkRRect.h"
+#include "include/core/SkRect.h"
+#include "include/effects/SkGradientShader.h"
 
-#include "GrRenderTargetContext.h"
+#include "src/gpu/GrRenderTargetContext.h"
 
 static sk_sp<SkShader> make_shader() {
     static const SkPoint kPts[] = {{0, 0}, {10, 10}};
@@ -64,11 +64,11 @@
 
         GrRenderTargetContext* rtc = canvas->internal_private_accessTopLayerRenderTargetContext();
         if (rtc) {
-            // Tricks the GrRenderTargetOpList into thinking it cannot reset its draw op list on
-            // a fullscreen clear. If we don't do this, fullscreen clear ops would be created and
-            // constantly discard the previous iteration's op so execution would only invoke one
-            // actual clear on the GPU (not what we want to measure).
-            rtc->setNeedsStencil();
+            // Tell the GrRenderTargetContext to not reset its draw op list on a fullscreen clear.
+            // If we don't do this, fullscreen clear ops would be created and constantly discard the
+            // previous iteration's op so execution would only invoke one actual clear on the GPU
+            // (not what we want to measure).
+            rtc->testingOnly_SetPreserveOpsOnFullClear();
         }
 
         for (int i = 0; i < loops; i++) {
diff --git a/bench/ClipMaskBench.cpp b/bench/ClipMaskBench.cpp
index a6e4994..c030b4a 100644
--- a/bench/ClipMaskBench.cpp
+++ b/bench/ClipMaskBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkColorSpace.h"
-#include "SkImage.h"
-#include "SkPictureRecorder.h"
-#include "SkString.h"
-#include "SkSurface.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorSpace.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkPictureRecorder.h"
+#include "include/core/SkString.h"
+#include "include/core/SkSurface.h"
+#include "tools/ToolUtils.h"
 
 static void DrawMask(SkCanvas* canvas) {
     ToolUtils::draw_checkerboard(canvas, SK_ColorTRANSPARENT, SK_ColorGREEN, 10);
@@ -67,8 +67,8 @@
 });)
 
 /////////
-#include "SkSurface.h"
-#include "SkPath.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkSurface.h"
 
 class RasterTileBench : public Benchmark {
     sk_sp<SkSurface> fSurf;
diff --git a/bench/ClipStrategyBench.cpp b/bench/ClipStrategyBench.cpp
index c65cf4b..4110e3b 100644
--- a/bench/ClipStrategyBench.cpp
+++ b/bench/ClipStrategyBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPath.h"
-#include "SkPathOps.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPath.h"
+#include "include/pathops/SkPathOps.h"
 
 class ClipStrategyBench : public Benchmark {
 public:
diff --git a/bench/CmapBench.cpp b/bench/CmapBench.cpp
index 3fcda85..7988165 100644
--- a/bench/CmapBench.cpp
+++ b/bench/CmapBench.cpp
@@ -5,72 +5,101 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkFont.h"
-#include "SkTypeface.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkFont.h"
+#include "include/core/SkTypeface.h"
+#include "include/utils/SkRandom.h"
+#include "src/utils/SkCharToGlyphCache.h"
+#include "src/utils/SkUTF.h"
 
 enum {
     NGLYPHS = 100
 };
 
-typedef void (*TypefaceProc)(int loops, const SkFont&, const void* text, size_t len,
-                             int glyphCount);
+namespace {
+struct Rec {
+    const SkCharToGlyphCache&   fCache;
+    int                         fLoops;
+    const SkFont&               fFont;
+    const SkUnichar*            fText;
+    int                         fCount;
+};
+}
 
-static void textToGlyphs_proc(int loops, const SkFont& font, const void* text, size_t len,
-                              int glyphCount) {
+typedef void (*TypefaceProc)(const Rec& r);
+
+static void textToGlyphs_proc(const Rec& r) {
     uint16_t glyphs[NGLYPHS];
-    SkASSERT(glyphCount <= NGLYPHS);
+    SkASSERT(r.fCount <= NGLYPHS);
 
-    for (int i = 0; i < loops; ++i) {
-        font.textToGlyphs(text, len, kUTF8_SkTextEncoding, glyphs, NGLYPHS);
+    for (int i = 0; i < r.fLoops; ++i) {
+        r.fFont.textToGlyphs(r.fText, r.fCount*4, SkTextEncoding::kUTF32, glyphs, NGLYPHS);
     }
 }
 
-static void charsToGlyphs_proc(int loops, const SkFont& font, const void* text,
-                               size_t len, int glyphCount) {
+static void charsToGlyphs_proc(const Rec& r) {
     uint16_t glyphs[NGLYPHS];
-    SkASSERT(glyphCount <= NGLYPHS);
+    SkASSERT(r.fCount <= NGLYPHS);
 
-    SkTypeface* face = font.getTypefaceOrDefault();
-    for (int i = 0; i < loops; ++i) {
-        face->charsToGlyphs(text, SkTypeface::kUTF8_Encoding, glyphs, glyphCount);
+    SkTypeface* face = r.fFont.getTypefaceOrDefault();
+    for (int i = 0; i < r.fLoops; ++i) {
+        face->unicharsToGlyphs(r.fText, r.fCount, glyphs);
     }
 }
 
-static void charsToGlyphsNull_proc(int loops, const SkFont& font, const void* text,
-                                   size_t len, int glyphCount) {
-    SkTypeface* face = font.getTypefaceOrDefault();
-    for (int i = 0; i < loops; ++i) {
-        face->charsToGlyphs(text, SkTypeface::kUTF8_Encoding, nullptr, glyphCount);
+static void addcache_proc(const Rec& r) {
+    for (int i = 0; i < r.fLoops; ++i) {
+        SkCharToGlyphCache cache;
+        for (int i = 0; i < r.fCount; ++i) {
+            cache.addCharAndGlyph(r.fText[i], i);
+        }
+    }
+}
+
+static void findcache_proc(const Rec& r) {
+    for (int i = 0; i < r.fLoops; ++i) {
+        for (int i = 0; i < r.fCount; ++i) {
+            r.fCache.findGlyphIndex(r.fText[i]);
+        }
     }
 }
 
 class CMAPBench : public Benchmark {
     TypefaceProc fProc;
     SkString     fName;
-    char         fText[NGLYPHS];
+    SkUnichar    fText[NGLYPHS];
     SkFont       fFont;
+    SkCharToGlyphCache fCache;
+    int          fCount;
 
 public:
-    CMAPBench(TypefaceProc proc, const char name[]) {
-        fProc = proc;
-        fName.printf("cmap_%s", name);
+    CMAPBench(TypefaceProc proc, const char name[], int count) {
+        SkASSERT(count <= NGLYPHS);
 
-        for (int i = 0; i < NGLYPHS; ++i) {
-            // we're jamming values into utf8, so we must keep it legal utf8
-            fText[i] = 'A' + (i & 31);
+        fProc = proc;
+        fName.printf("%s_%d", name, count);
+        fCount = count;
+
+        SkRandom rand;
+        for (int i = 0; i < count; ++i) {
+            fText[i] = rand.nextU() & 0xFFFF;
+            fCache.addCharAndGlyph(fText[i], i);
         }
         fFont.setTypeface(SkTypeface::MakeDefault());
     }
 
+    bool isSuitableFor(Backend backend) override {
+        return backend == kNonRendering_Backend;
+    }
+
 protected:
     const char* onGetName() override {
         return fName.c_str();
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        fProc(loops, fFont, fText, sizeof(fText), NGLYPHS);
+        fProc({fCache, loops, fFont, fText, fCount});
     }
 
 private:
@@ -80,6 +109,16 @@
 
 //////////////////////////////////////////////////////////////////////////////
 
-DEF_BENCH( return new CMAPBench(textToGlyphs_proc, "paint_textToGlyphs"); )
-DEF_BENCH( return new CMAPBench(charsToGlyphs_proc, "face_charsToGlyphs"); )
-DEF_BENCH( return new CMAPBench(charsToGlyphsNull_proc, "face_charsToGlyphs_null"); )
+constexpr int SMALL = 10;
+
+DEF_BENCH( return new CMAPBench(textToGlyphs_proc, "font_charToGlyph", SMALL); )
+DEF_BENCH( return new CMAPBench(charsToGlyphs_proc, "face_charToGlyph", SMALL); )
+DEF_BENCH( return new CMAPBench(addcache_proc, "addcache_charToGlyph", SMALL); )
+DEF_BENCH( return new CMAPBench(findcache_proc, "findcache_charToGlyph", SMALL); )
+
+constexpr int BIG = 100;
+
+DEF_BENCH( return new CMAPBench(textToGlyphs_proc, "font_charToGlyph", BIG); )
+DEF_BENCH( return new CMAPBench(charsToGlyphs_proc, "face_charToGlyph", BIG); )
+DEF_BENCH( return new CMAPBench(addcache_proc, "addcache_charToGlyph", BIG); )
+DEF_BENCH( return new CMAPBench(findcache_proc, "findcache_charToGlyph", BIG); )
diff --git a/bench/CodecBench.cpp b/bench/CodecBench.cpp
index 2794c4a..2c56838 100644
--- a/bench/CodecBench.cpp
+++ b/bench/CodecBench.cpp
@@ -5,12 +5,12 @@
  * found in the LICENSE file.
  */
 
-#include "CodecBench.h"
-#include "CodecBenchPriv.h"
-#include "CommandLineFlags.h"
-#include "SkBitmap.h"
-#include "SkCodec.h"
-#include "SkOSFile.h"
+#include "bench/CodecBench.h"
+#include "bench/CodecBenchPriv.h"
+#include "include/codec/SkCodec.h"
+#include "include/core/SkBitmap.h"
+#include "src/core/SkOSFile.h"
+#include "tools/flags/CommandLineFlags.h"
 
 // Actually zeroing the memory would throw off timing, so we just lie.
 static DEFINE_bool(zero_init, false,
diff --git a/bench/CodecBench.h b/bench/CodecBench.h
index dc44704..78211d7 100644
--- a/bench/CodecBench.h
+++ b/bench/CodecBench.h
@@ -8,12 +8,12 @@
 #ifndef CodecBench_DEFINED
 #define CodecBench_DEFINED
 
-#include "Benchmark.h"
-#include "SkAutoMalloc.h"
-#include "SkData.h"
-#include "SkImageInfo.h"
-#include "SkRefCnt.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkData.h"
+#include "include/core/SkImageInfo.h"
+#include "include/core/SkRefCnt.h"
+#include "include/core/SkString.h"
+#include "src/core/SkAutoMalloc.h"
 
 /**
  *  Time SkCodec.
diff --git a/bench/CodecBenchPriv.h b/bench/CodecBenchPriv.h
index 50b68f6..44b57ed 100644
--- a/bench/CodecBenchPriv.h
+++ b/bench/CodecBenchPriv.h
@@ -8,7 +8,7 @@
 #ifndef CodecBenchPriv_DEFINED
 #define CodecBenchPriv_DEFINED
 
-#include "SkImageInfo.h"
+#include "include/core/SkImageInfo.h"
 
 inline const char* color_type_to_str(SkColorType colorType) {
     switch (colorType) {
diff --git a/bench/ColorFilterBench.cpp b/bench/ColorFilterBench.cpp
index 46052b3..8005cf5 100644
--- a/bench/ColorFilterBench.cpp
+++ b/bench/ColorFilterBench.cpp
@@ -5,277 +5,210 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkColorFilterImageFilter.h"
-#include "SkColorMatrixFilter.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorFilter.h"
+#include "include/core/SkSurface.h"
+#include "include/effects/SkImageFilters.h"
+#include "src/core/SkColorFilterPriv.h"
+#include "tools/Resources.h"
 
-#define FILTER_WIDTH_SMALL  SkIntToScalar(32)
-#define FILTER_HEIGHT_SMALL SkIntToScalar(32)
-#define FILTER_WIDTH_LARGE  SkIntToScalar(256)
-#define FILTER_HEIGHT_LARGE SkIntToScalar(256)
-
-static sk_sp<SkImageFilter> make_brightness(float amount, sk_sp<SkImageFilter> input) {
-    SkScalar amount255 = amount * 255;
-    SkScalar matrix[20] = { 1, 0, 0, 0, amount255,
-                            0, 1, 0, 0, amount255,
-                            0, 0, 1, 0, amount255,
-                            0, 0, 0, 1, 0 };
-    sk_sp<SkColorFilter> filter(SkColorFilters::MatrixRowMajor255(matrix));
-    return SkColorFilterImageFilter::Make(std::move(filter), std::move(input));
-}
-
-static sk_sp<SkImageFilter> make_grayscale(sk_sp<SkImageFilter> input) {
-    SkScalar matrix[20];
-    memset(matrix, 0, 20 * sizeof(SkScalar));
+// Just need an interesting filter, nothing to special about colormatrix
+static sk_sp<SkColorFilter> make_grayscale() {
+    float matrix[20];
+    memset(matrix, 0, 20 * sizeof(float));
     matrix[0] = matrix[5] = matrix[10] = 0.2126f;
     matrix[1] = matrix[6] = matrix[11] = 0.7152f;
     matrix[2] = matrix[7] = matrix[12] = 0.0722f;
     matrix[18] = 1.0f;
-    sk_sp<SkColorFilter> filter(SkColorFilters::MatrixRowMajor255(matrix));
-    return SkColorFilterImageFilter::Make(std::move(filter), std::move(input));
+    return SkColorFilters::Matrix(matrix);
 }
 
-static sk_sp<SkImageFilter> make_mode_blue(sk_sp<SkImageFilter> input) {
-    sk_sp<SkColorFilter> filter(SkColorFilters::Blend(SK_ColorBLUE, SkBlendMode::kSrcIn));
-    return SkColorFilterImageFilter::Make(std::move(filter), std::move(input));
-}
-
-class ColorFilterBaseBench : public Benchmark {
-
+/**
+ *  Different ways to draw the same thing (a red rect)
+ *  All of their timings should be about the same
+ *  (we allow for slight overhead to figure out that we can undo the presence of the filters)
+ */
+class FilteredRectBench : public Benchmark {
 public:
-    ColorFilterBaseBench(bool small) : fIsSmall(small) { }
+    enum Type {
+        kNoFilter_Type,
+        kColorFilter_Type,
+        kImageFilter_Type,
+    };
 
-protected:
-    SkRect getFilterRect() const {
-        return this->isSmall() ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
-                                 SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
+    FilteredRectBench(Type t) : fType(t) {
+        static const char* suffix[] = { "nofilter", "colorfilter", "imagefilter" };
+        fName.printf("filteredrect_%s", suffix[t]);
+        fPaint.setColor(SK_ColorRED);
     }
 
-    inline bool isSmall() const { return fIsSmall; }
+protected:
+    const char* onGetName() override {
+        return fName.c_str();
+    }
+
+    void onDelayedSetup() override {
+        switch (fType) {
+            case kNoFilter_Type:
+                break;
+            case kColorFilter_Type:
+                fPaint.setColorFilter(make_grayscale());
+                break;
+            case kImageFilter_Type:
+                fPaint.setImageFilter(SkImageFilters::ColorFilter(make_grayscale(), nullptr));
+            break;
+        }
+    }
+
+    void onDraw(int loops, SkCanvas* canvas) override {
+        const SkRect r = { 0, 0, 256, 256 };
+        for (int i = 0; i < loops; ++i) {
+            canvas->drawRect(r, fPaint);
+        }
+    }
 
 private:
-    bool fIsSmall;
+    SkPaint  fPaint;
+    SkString fName;
+    Type     fType;
 
     typedef Benchmark INHERITED;
 };
 
-class ColorFilterDimBrightBench : public ColorFilterBaseBench {
+DEF_BENCH( return new FilteredRectBench(FilteredRectBench::kNoFilter_Type); )
+DEF_BENCH( return new FilteredRectBench(FilteredRectBench::kColorFilter_Type); )
+DEF_BENCH( return new FilteredRectBench(FilteredRectBench::kImageFilter_Type); )
 
+namespace  {
+
+class ColorMatrixBench final : public Benchmark {
 public:
-    ColorFilterDimBrightBench(bool small) : INHERITED(small) { }
+    using Factory = sk_sp<SkColorFilter>(*)();
 
-protected:
+    explicit ColorMatrixBench(const char* suffix, Factory f)
+        : fFactory(f)
+        , fName(SkStringPrintf("colorfilter_%s", suffix)) {}
+
+private:
     const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_dim_bright_small" : "colorfilter_dim_bright_large";
+        return fName.c_str();
+    }
+
+    SkIPoint onGetSize() override {
+        return { 256, 256 };
+    }
+
+    void onDelayedSetup() override {
+        // Pass the image though a premul canvas so that we "forget" it is opaque.
+        auto surface = SkSurface::MakeRasterN32Premul(256, 256);
+        surface->getCanvas()->drawImage(GetResourceAsImage("images/mandrill_256.png"), 0, 0);
+
+        fImage = surface->makeImageSnapshot();
+        fColorFilter = fFactory();
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
+        SkPaint p;
+        p.setColorFilter(fColorFilter);
 
-        for (int i = 0; i < loops; i++) {
-            for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.4f) {
-                sk_sp<SkImageFilter> dim(make_brightness(-brightness, nullptr));
-                paint.setImageFilter(make_brightness(brightness, std::move(dim)));
-                canvas->drawRect(r, paint);
-            }
+        for (int i = 0; i < loops; ++i) {
+            canvas->drawImage(fImage, 0, 0, &p);
         }
     }
 
-private:
-    typedef ColorFilterBaseBench INHERITED;
+    const Factory  fFactory;
+    const SkString fName;
+
+    sk_sp<SkImage>       fImage;
+    sk_sp<SkColorFilter> fColorFilter;
 };
 
-class ColorFilterBrightGrayBench : public ColorFilterBaseBench {
+void RuntimeNone_CPU(float[4], const void*) {}
 
-public:
-    ColorFilterBrightGrayBench(bool small) : INHERITED(small) { }
+const char RuntimeNone_GPU_SRC[] = R"(
+    void main(inout half4 c) {}
+)";
 
-protected:
-    const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_bright_gray_small" : "colorfilter_bright_gray_large";
+void RuntimeColorMatrix_CPU(float colors[4], const void* ctx) {
+    auto c = reinterpret_cast<SkRGBA4f<kPremul_SkAlphaType>*>(colors)->unpremul();
+
+    const auto* m = static_cast<const float*>(ctx);
+    const auto c0 = c[0]*m[ 0] + c[1]*m[ 1] + c[2]*m[ 2] + c[3]*m[ 3] + m[ 4],
+               c1 = c[0]*m[ 5] + c[1]*m[ 6] + c[2]*m[ 7] + c[3]*m[ 8] + m[ 9],
+               c2 = c[0]*m[10] + c[1]*m[11] + c[2]*m[12] + c[3]*m[13] + m[14],
+               c3 = c[0]*m[15] + c[1]*m[16] + c[2]*m[17] + c[3]*m[18] + m[19];
+    c[0] = c0;
+    c[1] = c1;
+    c[2] = c2;
+    c[3] = c3;
+
+    *reinterpret_cast<SkRGBA4f<kPremul_SkAlphaType>*>(colors) = c.premul();
+}
+
+const char RuntimeColorMatrix_GPU_SRC[] = R"(
+    // WTB matrix/vector inputs.
+    layout(ctype=float) in uniform half m0 , m1 , m2 , m3 , m4 ,
+                                        m5 , m6 , m7 , m8 , m9 ,
+                                        m10, m11, m12, m13, m14,
+                                        m15, m16, m17, m18, m19;
+    void main(inout half4 c) {
+        half nonZeroAlpha = max(c.a, 0.0001);
+        c = half4(c.rgb / nonZeroAlpha, nonZeroAlpha);
+
+        half4x4 m = half4x4(m0, m5, m10, m15,
+                            m1, m6, m11, m16,
+                            m2, m7, m12, m17,
+                            m3, m8, m13, m18);
+        c = m * c + half4  (m4, m9, m14, m19);
+
+        c = saturate(c);
+        c.rgb *= c.a;
     }
+)";
 
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
-        for (int i = 0; i < loops; i++) {
-            sk_sp<SkImageFilter> brightness(make_brightness(0.9f, nullptr));
-            paint.setImageFilter(make_grayscale(std::move(brightness)));
-            canvas->drawRect(r, paint);
-        }
-    }
-
-private:
-    typedef ColorFilterBaseBench INHERITED;
+static constexpr float gColorMatrix[] = {
+    0.3f, 0.3f, 0.0f, 0.0f, 0.3f,
+    0.0f, 0.3f, 0.3f, 0.0f, 0.3f,
+    0.0f, 0.0f, 0.3f, 0.3f, 0.3f,
+    0.3f, 0.0f, 0.3f, 0.3f, 0.0f,
 };
 
-class ColorFilterGrayBrightBench : public ColorFilterBaseBench {
+} // namespace
 
-public:
-    ColorFilterGrayBrightBench(bool small) : INHERITED(small) { }
+DEF_BENCH( return new ColorMatrixBench("none",
+    []() { return sk_sp<SkColorFilter>(nullptr); }); )
+DEF_BENCH( return new ColorMatrixBench("blend_src",
+    []() { return SkColorFilters::Blend(0x80808080, SkBlendMode::kSrc); }); )
+DEF_BENCH( return new ColorMatrixBench("blend_srcover",
+    []() { return SkColorFilters::Blend(0x80808080, SkBlendMode::kSrcOver); }); )
+DEF_BENCH( return new ColorMatrixBench("linear_to_srgb",
+    []() { return SkColorFilters::LinearToSRGBGamma(); }); )
+DEF_BENCH( return new ColorMatrixBench("srgb_to_linear",
+    []() { return SkColorFilters::SRGBToLinearGamma(); }); )
+DEF_BENCH( return new ColorMatrixBench("matrix_rgba",
+    []() { return SkColorFilters::Matrix(gColorMatrix); }); )
+DEF_BENCH( return new ColorMatrixBench("matrix_hsla",
+    []() { return SkColorFilters::HSLAMatrix(gColorMatrix); }); )
+DEF_BENCH( return new ColorMatrixBench("compose_src",
+    []() { return SkColorFilters::Compose(SkColorFilters::Blend(0x80808080, SkBlendMode::kSrc),
+                                          SkColorFilters::Blend(0x80808080, SkBlendMode::kSrc));
+    }); )
+DEF_BENCH( return new ColorMatrixBench("lerp_src",
+    []() { return SkColorFilters::Lerp(0.3f,
+                                       SkColorFilters::Blend(0x80808080, SkBlendMode::kSrc),
+                                       SkColorFilters::Blend(0x80808080, SkBlendMode::kSrc));
+    }); )
 
-protected:
-    const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_gray_bright_small" : "colorfilter_gray_bright_large";
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
-        for (int i = 0; i < loops; i++) {
-            sk_sp<SkImageFilter> grayscale(make_grayscale(nullptr));
-            paint.setImageFilter(make_brightness(0.9f, std::move(grayscale)));
-            canvas->drawRect(r, paint);
-        }
-    }
-
-private:
-    typedef ColorFilterBaseBench INHERITED;
-};
-
-class ColorFilterBlueBrightBench : public ColorFilterBaseBench {
-
-public:
-    ColorFilterBlueBrightBench(bool small) : INHERITED(small) { }
-
-protected:
-    const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_blue_bright_small" : "colorfilter_blue_bright_large";
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
-        for (int i = 0; i < loops; i++) {
-            sk_sp<SkImageFilter> blue(make_mode_blue(nullptr));
-            paint.setImageFilter(make_brightness(1.0f, std::move(blue)));
-            canvas->drawRect(r, paint);
-        }
-    }
-
-private:
-    typedef ColorFilterBaseBench INHERITED;
-};
-
-class ColorFilterBrightBlueBench : public ColorFilterBaseBench {
-
-public:
-    ColorFilterBrightBlueBench(bool small) : INHERITED(small) { }
-
-protected:
-    const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_bright_blue_small" : "colorfilter_bright_blue_large";
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
-        for (int i = 0; i < loops; i++) {
-            sk_sp<SkImageFilter> brightness(make_brightness(1.0f, nullptr));
-            paint.setImageFilter(make_mode_blue(std::move(brightness)));
-            canvas->drawRect(r, paint);
-        }
-    }
-
-private:
-    typedef ColorFilterBaseBench INHERITED;
-};
-
-class ColorFilterBrightBench : public ColorFilterBaseBench {
-
-public:
-    ColorFilterBrightBench(bool small) : INHERITED(small) { }
-
-protected:
-    const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_bright_small" : "colorfilter_bright_large";
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
-        for (int i = 0; i < loops; i++) {
-            paint.setImageFilter(make_brightness(1.0f, nullptr));
-            canvas->drawRect(r, paint);
-        }
-    }
-
-private:
-    typedef ColorFilterBaseBench INHERITED;
-};
-
-class ColorFilterBlueBench : public ColorFilterBaseBench {
-
-public:
-    ColorFilterBlueBench(bool small) : INHERITED(small) { }
-
-protected:
-    const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_blue_small" : "colorfilter_blue_large";
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
-        for (int i = 0; i < loops; i++) {
-            paint.setImageFilter(make_mode_blue(nullptr));
-            canvas->drawRect(r, paint);
-        }
-    }
-
-private:
-    typedef ColorFilterBaseBench INHERITED;
-};
-
-class ColorFilterGrayBench : public ColorFilterBaseBench {
-
-public:
-    ColorFilterGrayBench(bool small) : INHERITED(small) { }
-
-protected:
-    const char* onGetName() override {
-        return this->isSmall() ? "colorfilter_gray_small" : "colorfilter_gray_large";
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRect r = this->getFilterRect();
-        SkPaint paint;
-        paint.setColor(SK_ColorRED);
-        for (int i = 0; i < loops; i++) {
-            paint.setImageFilter(make_grayscale(nullptr));
-            canvas->drawRect(r, paint);
-        }
-    }
-
-private:
-    typedef ColorFilterBaseBench INHERITED;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-DEF_BENCH( return new ColorFilterDimBrightBench(true); )
-DEF_BENCH( return new ColorFilterBrightGrayBench(true); )
-DEF_BENCH( return new ColorFilterGrayBrightBench(true); )
-DEF_BENCH( return new ColorFilterBlueBrightBench(true); )
-DEF_BENCH( return new ColorFilterBrightBlueBench(true); )
-DEF_BENCH( return new ColorFilterBrightBench(true); )
-DEF_BENCH( return new ColorFilterBlueBench(true); )
-DEF_BENCH( return new ColorFilterGrayBench(true); )
-
-DEF_BENCH( return new ColorFilterDimBrightBench(false); )
-DEF_BENCH( return new ColorFilterBrightGrayBench(false); )
-DEF_BENCH( return new ColorFilterGrayBrightBench(false); )
-DEF_BENCH( return new ColorFilterBlueBrightBench(false); )
-DEF_BENCH( return new ColorFilterBrightBlueBench(false); )
-DEF_BENCH( return new ColorFilterBrightBench(false); )
-DEF_BENCH( return new ColorFilterBlueBench(false); )
-DEF_BENCH( return new ColorFilterGrayBench(false); )
+#ifdef SK_SUPPORT_GPU
+DEF_BENCH( return new ColorMatrixBench("src_runtime", []() {
+        static SkRuntimeColorFilterFactory gRuntimeFact(SkString(RuntimeNone_GPU_SRC),
+                                                        RuntimeNone_CPU);
+        return gRuntimeFact.make(SkData::MakeWithCopy(gColorMatrix, sizeof(gColorMatrix)));
+    });)
+DEF_BENCH( return new ColorMatrixBench("matrix_runtime", []() {
+        static SkRuntimeColorFilterFactory gRuntimeFact(SkString(RuntimeColorMatrix_GPU_SRC),
+                                                        RuntimeColorMatrix_CPU);
+        return gRuntimeFact.make(SkData::MakeWithCopy(gColorMatrix, sizeof(gColorMatrix)));
+    });)
+#endif
diff --git a/bench/ColorPrivBench.cpp b/bench/ColorPrivBench.cpp
index 46aacd7..404fc1f 100644
--- a/bench/ColorPrivBench.cpp
+++ b/bench/ColorPrivBench.cpp
@@ -4,10 +4,10 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkColorData.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkString.h"
+#include "include/private/SkColorData.h"
+#include "include/utils/SkRandom.h"
 
 template <bool kFast, bool kScale>
 class FourByteInterpBench : public Benchmark {
diff --git a/bench/CompositingImagesBench.cpp b/bench/CompositingImagesBench.cpp
index 00e07cb..6b37a3f 100644
--- a/bench/CompositingImagesBench.cpp
+++ b/bench/CompositingImagesBench.cpp
@@ -5,29 +5,82 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "SkCanvas.h"
-#include "SkImage.h"
-#include "SkRandom.h"
-#include "SkSurface.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkSurface.h"
+#include "include/utils/SkRandom.h"
+
+enum class ClampingMode {
+    // Submit image set entries with the fast constraint
+    kAlwaysFast,
+    // Submit image set entries with the strict constraint
+    kAlwaysStrict,
+    // Submit non-right/bottom tiles as fast, the bottom-right corner as strict, and bottom or right
+    // edge tiles as strict with geometry modification to match content area. These will be
+    // submitted from left-to-right, top-to-bottom so will necessarily be split into many batches.
+    kChromeTiling_RowMajor,
+    // As above, but group all fast tiles first, then bottom and right edge tiles in a second batch.
+    kChromeTiling_Optimal
+};
+
+enum class TransformMode {
+    // Tiles will be axis aligned on integer pixels
+    kNone,
+    // Subpixel, tiles will be axis aligned but adjusted to subpixel coordinates
+    kSubpixel,
+    // Rotated, tiles will be rotated globally; they won't overlap but their device space bounds may
+    kRotated,
+    // Perspective, tiles will have global perspective
+    kPerspective
+};
 
 /**
- * Simulates drawing layers images in a grid a la a tile based compositor. The layers are all
- * untransformed.
+ * Simulates drawing layers images in a grid a la a tile based compositor.
  */
 class CompositingImages : public Benchmark {
 public:
-    CompositingImages(SkISize tileSize, SkISize tileGridSize, int layerCnt, bool subpixelOffset)
-            : fTileSize(tileSize)
+    CompositingImages(SkISize imageSize, SkISize tileSize, SkISize tileGridSize,
+                      ClampingMode clampMode, TransformMode transformMode, int layerCnt)
+            : fImageSize(imageSize)
+            , fTileSize(tileSize)
             , fTileGridSize(tileGridSize)
-            , fLayerCnt(layerCnt)
-            , fSubpixelOffset(subpixelOffset) {
-        fName.appendf("compositing_images_tile_size_%dx%d_tile_cnt_%dx%d_layers_%d",
+            , fClampMode(clampMode)
+            , fTransformMode(transformMode)
+            , fLayerCnt(layerCnt) {
+        fName.appendf("compositing_images_tile_size_%dx%d_grid_%dx%d_layers_%d",
                       fTileSize.fWidth, fTileSize.fHeight, fTileGridSize.fWidth,
                       fTileGridSize.fHeight, fLayerCnt);
-        if (subpixelOffset) {
-            fName.append("_subpixel");
+        if (imageSize != tileSize) {
+            fName.appendf("_image_%dx%d", imageSize.fWidth, imageSize.fHeight);
+        }
+        switch(clampMode) {
+            case ClampingMode::kAlwaysFast:
+                fName.append("_fast");
+                break;
+            case ClampingMode::kAlwaysStrict:
+                fName.append("_strict");
+                break;
+            case ClampingMode::kChromeTiling_RowMajor:
+                fName.append("_chrome");
+                break;
+            case ClampingMode::kChromeTiling_Optimal:
+                fName.append("_chrome_optimal");
+                break;
+        }
+        switch(transformMode) {
+            case TransformMode::kNone:
+                break;
+            case TransformMode::kSubpixel:
+                fName.append("_subpixel");
+                break;
+            case TransformMode::kRotated:
+                fName.append("_rotated");
+                break;
+            case TransformMode::kPerspective:
+                fName.append("_persp");
+                break;
         }
     }
 
@@ -37,7 +90,9 @@
     const char* onGetName() override { return fName.c_str(); }
 
     void onPerCanvasPreDraw(SkCanvas* canvas) override {
-        auto ii = SkImageInfo::Make(fTileSize.fWidth, fTileSize.fHeight, kRGBA_8888_SkColorType,
+        // Use image size, which may be larger than the tile size (emulating how Chrome specifies
+        // their tiles).
+        auto ii = SkImageInfo::Make(fImageSize.fWidth, fImageSize.fHeight, kRGBA_8888_SkColorType,
                                     kPremul_SkAlphaType, nullptr);
         SkRandom random;
         int numImages = fLayerCnt * fTileGridSize.fWidth * fTileGridSize.fHeight;
@@ -49,6 +104,8 @@
             SkPaint paint;
             paint.setColor(~color);
             paint.setBlendMode(SkBlendMode::kSrc);
+            // While the image may be bigger than fTileSize, prepare its content as if fTileSize
+            // is what will be visible.
             surf->getCanvas()->drawRect(
                     SkRect::MakeLTRB(3, 3, fTileSize.fWidth - 3, fTileSize.fHeight - 3), paint);
             fImages[i] = surf->makeImageSnapshot();
@@ -58,71 +115,249 @@
     void onPerCanvasPostDraw(SkCanvas*) override { fImages.reset(); }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        SkScalar o = this->offset();
-
         SkPaint paint;
-        paint.setFilterQuality(kNone_SkFilterQuality);
-        // TODO: Use per-edge AA flags for tiles when API available.
+        paint.setFilterQuality(kLow_SkFilterQuality);
         paint.setAntiAlias(true);
+
+        canvas->save();
+        canvas->concat(this->getTransform());
+
         for (int i = 0; i < loops; ++i) {
-            int imgIdx = 0;
             for (int l = 0; l < fLayerCnt; ++l) {
-                for (int y = 0; y < fTileGridSize.fHeight; ++y) {
-                    for (int x = 0; x < fTileGridSize.fWidth; ++x) {
-                        canvas->drawImage(fImages[imgIdx++].get(), x * fTileSize.fWidth + o,
-                                          y * fTileSize.fHeight + o, &paint);
+                SkAutoTArray<SkCanvas::ImageSetEntry> set(
+                        fTileGridSize.fWidth * fTileGridSize.fHeight);
+
+                if (fClampMode == ClampingMode::kAlwaysFast ||
+                    fClampMode == ClampingMode::kAlwaysStrict) {
+                    // Simple 2D for loop, submit everything as a single batch
+                    int i = 0;
+                    for (int y = 0; y < fTileGridSize.fHeight; ++y) {
+                        for (int x = 0; x < fTileGridSize.fWidth; ++x) {
+                            set[i++] = this->getEntry(x, y, l);
+                        }
                     }
+
+                    SkCanvas::SrcRectConstraint constraint =
+                            fClampMode == ClampingMode::kAlwaysFast
+                                    ? SkCanvas::kFast_SrcRectConstraint
+                                    : SkCanvas::kStrict_SrcRectConstraint;
+                    canvas->experimental_DrawEdgeAAImageSet(set.get(), i, nullptr, nullptr, &paint,
+                                                            constraint);
+                } else if (fClampMode == ClampingMode::kChromeTiling_RowMajor) {
+                    // Same tile order, but break batching between fast and strict sections, and
+                    // adjust bottom and right tiles to encode content area distinct from src rect.
+                    int i = 0;
+                    for (int y = 0; y < fTileGridSize.fHeight - 1; ++y) {
+                        int rowStart = i;
+                        for (int x = 0; x < fTileGridSize.fWidth - 1; ++x) {
+                            set[i++] = this->getEntry(x, y, l);
+                        }
+                        // Flush "fast" horizontal row
+                        canvas->experimental_DrawEdgeAAImageSet(set.get() + rowStart,
+                                fTileGridSize.fWidth - 1, nullptr, nullptr, &paint,
+                                SkCanvas::kFast_SrcRectConstraint);
+                        // Then flush a single adjusted entry for the right edge
+                        SkPoint dstQuad[4];
+                        set[i++] = this->getAdjustedEntry(fTileGridSize.fWidth - 1, y, l, dstQuad);
+                        canvas->experimental_DrawEdgeAAImageSet(
+                                set.get() + fTileGridSize.fWidth - 1, 1, dstQuad, nullptr, &paint,
+                                SkCanvas::kStrict_SrcRectConstraint);
+                    }
+                    // For last row, accumulate it as a single strict batch
+                    int rowStart = i;
+                    SkAutoTArray<SkPoint> dstQuads(4 * (fTileGridSize.fWidth - 1));
+                    for (int x = 0; x < fTileGridSize.fWidth - 1; ++x) {
+                        set[i++] = this->getAdjustedEntry(x, fTileGridSize.fHeight - 1, l,
+                                                          dstQuads.get() + x * 4);
+                    }
+                    // The corner can use conventional strict mode without geometric adjustment
+                    set[i++] = this->getEntry(
+                            fTileGridSize.fWidth - 1, fTileGridSize.fHeight - 1, l);
+                    canvas->experimental_DrawEdgeAAImageSet(set.get() + rowStart,
+                            fTileGridSize.fWidth, dstQuads.get(), nullptr, &paint,
+                            SkCanvas::kStrict_SrcRectConstraint);
+                } else {
+                    SkASSERT(fClampMode == ClampingMode::kChromeTiling_Optimal);
+                    int i = 0;
+                    // Interior fast tiles
+                    for (int y = 0; y < fTileGridSize.fHeight - 1; ++y) {
+                        for (int x = 0; x < fTileGridSize.fWidth - 1; ++x) {
+                            set[i++] = this->getEntry(x, y, l);
+                        }
+                    }
+                    canvas->experimental_DrawEdgeAAImageSet(set.get(), i, nullptr, nullptr, &paint,
+                                                            SkCanvas::kFast_SrcRectConstraint);
+
+                    // Right edge
+                    int strictStart = i;
+                    SkAutoTArray<SkPoint> dstQuads(
+                            4 * (fTileGridSize.fWidth + fTileGridSize.fHeight - 2));
+                    for (int y = 0; y < fTileGridSize.fHeight - 1; ++y) {
+                        set[i++] = this->getAdjustedEntry(fTileGridSize.fWidth - 1, y, l,
+                                                          dstQuads.get() + y * 4);
+                    }
+                    canvas->experimental_DrawEdgeAAImageSet(set.get() + strictStart,
+                            i - strictStart, dstQuads.get(), nullptr, &paint,
+                            SkCanvas::kStrict_SrcRectConstraint);
+                    int quadStart = 4 * (fTileGridSize.fHeight - 1);
+                    strictStart = i;
+                    for (int x = 0; x < fTileGridSize.fWidth - 1; ++x) {
+                        set[i++] = this->getAdjustedEntry(x, fTileGridSize.fHeight - 1, l,
+                                                          dstQuads.get() + quadStart + x * 4);
+                    }
+                    set[i++] = this->getEntry(
+                            fTileGridSize.fWidth - 1, fTileGridSize.fHeight - 1, l);
+                    canvas->experimental_DrawEdgeAAImageSet(set.get() + strictStart,
+                            i - strictStart, dstQuads.get() + quadStart, nullptr, &paint,
+                            SkCanvas::kStrict_SrcRectConstraint);
                 }
             }
             // Prevent any batching between composited "frames".
             canvas->flush();
         }
+        canvas->restore();
     }
 
 private:
-    SkScalar offset() const {
-        return fSubpixelOffset ? SK_ScalarHalf : 0.f;
+    SkMatrix getTransform() const {
+        SkMatrix m;
+        switch(fTransformMode) {
+            case TransformMode::kNone:
+                m.setIdentity();
+                break;
+            case TransformMode::kSubpixel:
+                m.setTranslate(0.5f, 0.5f);
+                break;
+            case TransformMode::kRotated:
+                m.setRotate(15.f);
+                break;
+            case TransformMode::kPerspective: {
+                m.setIdentity();
+                m.setPerspY(0.001f);
+                m.setSkewX(SkIntToScalar(8) / 25);
+                break;
+            }
+        }
+        return m;
     }
 
     SkIPoint onGetSize() override {
-        SkScalar o = this->offset();
-        return SkIPoint::Make(SkScalarCeilToInt(fTileSize.fWidth * fTileGridSize.fWidth + o),
-                              SkScalarCeilToInt(fTileSize.fHeight * fTileGridSize.fHeight + o));
+        SkRect size = SkRect::MakeWH(1.25f * fTileSize.fWidth * fTileGridSize.fWidth,
+                                     1.25f * fTileSize.fHeight * fTileGridSize.fHeight);
+        this->getTransform().mapRect(&size);
+        return SkIPoint::Make(SkScalarCeilToInt(size.width()), SkScalarCeilToInt(size.height()));
+    }
+
+    unsigned getEdgeFlags(int x, int y) const {
+        unsigned flags = SkCanvas::kNone_QuadAAFlags;
+        if (x == 0) {
+            flags |= SkCanvas::kLeft_QuadAAFlag;
+        } else if (x == fTileGridSize.fWidth - 1) {
+            flags |= SkCanvas::kRight_QuadAAFlag;
+        }
+
+        if (y == 0) {
+            flags |= SkCanvas::kTop_QuadAAFlag;
+        } else if (y == fTileGridSize.fHeight - 1) {
+            flags |= SkCanvas::kBottom_QuadAAFlag;
+        }
+        return flags;
+    }
+
+    SkCanvas::ImageSetEntry getEntry(int x, int y, int layer) const {
+        int imageIdx =
+                fTileGridSize.fWidth * fTileGridSize.fHeight * layer + fTileGridSize.fWidth * y + x;
+        SkRect srcRect = SkRect::Make(fTileSize);
+        // Make a non-identity transform between src and dst so bilerp isn't disabled.
+        float dstWidth = srcRect.width() * 1.25f;
+        float dstHeight = srcRect.height() * 1.25f;
+        SkRect dstRect = SkRect::MakeXYWH(dstWidth * x, dstHeight * y, dstWidth, dstHeight);
+        return SkCanvas::ImageSetEntry(fImages[imageIdx], srcRect, dstRect, 1.f,
+                                       this->getEdgeFlags(x, y));
+    }
+
+    SkCanvas::ImageSetEntry getAdjustedEntry(int x, int y, int layer, SkPoint dstQuad[4]) const {
+        SkASSERT(x == fTileGridSize.fWidth - 1 || y == fTileGridSize.fHeight - 1);
+
+        SkCanvas::ImageSetEntry entry = this->getEntry(x, y, layer);
+        SkRect contentRect = SkRect::Make(fImageSize);
+        if (x == fTileGridSize.fWidth - 1) {
+            // Right edge, so restrict horizontal content to tile width
+            contentRect.fRight = fTileSize.fWidth;
+        }
+        if (y == fTileGridSize.fHeight - 1) {
+            // Bottom edge, so restrict vertical content to tile height
+            contentRect.fBottom = fTileSize.fHeight;
+        }
+
+        SkMatrix srcToDst = SkMatrix::MakeRectToRect(entry.fSrcRect, entry.fDstRect,
+                                                     SkMatrix::kFill_ScaleToFit);
+
+        // Story entry's dstRect into dstQuad, and use contentRect and contentDst as its src and dst
+        entry.fDstRect.toQuad(dstQuad);
+        entry.fSrcRect = contentRect;
+        entry.fDstRect = srcToDst.mapRect(contentRect);
+        entry.fHasClip = true;
+
+        return entry;
     }
 
     std::unique_ptr<sk_sp<SkImage>[]> fImages;
     SkString fName;
+    SkISize fImageSize;
     SkISize fTileSize;
     SkISize fTileGridSize;
+    ClampingMode fClampMode;
+    TransformMode fTransformMode;
     int fLayerCnt;
-    bool fSubpixelOffset;
 
     typedef Benchmark INHERITED;
 };
 
 // Subpixel = false; all of the draw commands align with integer pixels so AA will be automatically
 // turned off within the operation
-DEF_BENCH(return new CompositingImages({256, 256}, {8, 8}, 1, false));
-DEF_BENCH(return new CompositingImages({512, 512}, {4, 4}, 1, false));
-DEF_BENCH(return new CompositingImages({1024, 512}, {2, 4}, 1, false));
+DEF_BENCH(return new CompositingImages({256, 256}, {256, 256}, {8, 8}, ClampingMode::kAlwaysFast, TransformMode::kNone, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {512, 512}, {4, 4}, ClampingMode::kAlwaysFast, TransformMode::kNone, 1));
+DEF_BENCH(return new CompositingImages({1024, 512}, {1024, 512}, {2, 4}, ClampingMode::kAlwaysFast, TransformMode::kNone, 1));
 
-DEF_BENCH(return new CompositingImages({256, 256}, {8, 8}, 4, false));
-DEF_BENCH(return new CompositingImages({512, 512}, {4, 4}, 4, false));
-DEF_BENCH(return new CompositingImages({1024, 512}, {2, 4}, 4, false));
+DEF_BENCH(return new CompositingImages({256, 256}, {256, 256}, {8, 8}, ClampingMode::kAlwaysFast, TransformMode::kNone, 4));
+DEF_BENCH(return new CompositingImages({512, 512}, {512, 512}, {4, 4}, ClampingMode::kAlwaysFast, TransformMode::kNone, 4));
+DEF_BENCH(return new CompositingImages({1024, 512}, {1024, 512}, {2, 4}, ClampingMode::kAlwaysFast, TransformMode::kNone, 4));
 
-DEF_BENCH(return new CompositingImages({256, 256}, {8, 8}, 16, false));
-DEF_BENCH(return new CompositingImages({512, 512}, {4, 4}, 16, false));
-DEF_BENCH(return new CompositingImages({1024, 512}, {2, 4}, 16, false));
+DEF_BENCH(return new CompositingImages({256, 256}, {256, 256}, {8, 8}, ClampingMode::kAlwaysFast, TransformMode::kNone, 16));
+DEF_BENCH(return new CompositingImages({512, 512}, {512, 512}, {4, 4}, ClampingMode::kAlwaysFast, TransformMode::kNone, 16));
+DEF_BENCH(return new CompositingImages({1024, 512}, {1024, 512}, {2, 4}, ClampingMode::kAlwaysFast, TransformMode::kNone, 16));
 
 // Subpixel = true; force the draw commands to not align with pixels exactly so AA remains on
-DEF_BENCH(return new CompositingImages({256, 256}, {8, 8}, 1, true));
-DEF_BENCH(return new CompositingImages({512, 512}, {4, 4}, 1, true));
-DEF_BENCH(return new CompositingImages({1024, 512}, {2, 4}, 1, true));
+DEF_BENCH(return new CompositingImages({256, 256}, {256, 256}, {8, 8}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {512, 512}, {4, 4}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 1));
+DEF_BENCH(return new CompositingImages({1024, 512}, {1024, 512}, {2, 4}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 1));
 
-DEF_BENCH(return new CompositingImages({256, 256}, {8, 8}, 4, true));
-DEF_BENCH(return new CompositingImages({512, 512}, {4, 4}, 4, true));
-DEF_BENCH(return new CompositingImages({1024, 512}, {2, 4}, 4, true));
+DEF_BENCH(return new CompositingImages({256, 256}, {256, 256}, {8, 8}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 4));
+DEF_BENCH(return new CompositingImages({512, 512}, {512, 512}, {4, 4}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 4));
+DEF_BENCH(return new CompositingImages({1024, 512}, {1024, 512}, {2, 4}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 4));
 
-DEF_BENCH(return new CompositingImages({256, 256}, {8, 8}, 16, true));
-DEF_BENCH(return new CompositingImages({512, 512}, {4, 4}, 16, true));
-DEF_BENCH(return new CompositingImages({1024, 512}, {2, 4}, 16, true));
+DEF_BENCH(return new CompositingImages({256, 256}, {256, 256}, {8, 8}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 16));
+DEF_BENCH(return new CompositingImages({512, 512}, {512, 512}, {4, 4}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 16));
+DEF_BENCH(return new CompositingImages({1024, 512}, {1024, 512}, {2, 4}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 16));
+
+// Test different tiling scenarios inspired by Chrome's compositor
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysFast, TransformMode::kNone, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysStrict, TransformMode::kNone, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_RowMajor, TransformMode::kNone, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_Optimal, TransformMode::kNone, 1));
+
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysFast, TransformMode::kSubpixel, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysStrict, TransformMode::kSubpixel, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_RowMajor, TransformMode::kSubpixel, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_Optimal, TransformMode::kSubpixel, 1));
+
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysFast, TransformMode::kRotated, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysStrict, TransformMode::kRotated, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_RowMajor, TransformMode::kRotated, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_Optimal, TransformMode::kRotated, 1));
+
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysFast, TransformMode::kPerspective, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kAlwaysStrict, TransformMode::kPerspective, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_RowMajor, TransformMode::kPerspective, 1));
+DEF_BENCH(return new CompositingImages({512, 512}, {380, 380}, {5, 5}, ClampingMode::kChromeTiling_Optimal, TransformMode::kPerspective, 1));
diff --git a/bench/ControlBench.cpp b/bench/ControlBench.cpp
index d76184c..f8e15c9 100644
--- a/bench/ControlBench.cpp
+++ b/bench/ControlBench.cpp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
 // This benchmark's runtime should be fairly constant for a given machine,
 // so it can be used as a baseline to control for thermal or other throttling.
diff --git a/bench/CoverageBench.cpp b/bench/CoverageBench.cpp
index ce590e5..512e2ec 100644
--- a/bench/CoverageBench.cpp
+++ b/bench/CoverageBench.cpp
@@ -5,15 +5,15 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkAutoPixmapStorage.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkDraw.h"
-#include "SkMatrix.h"
-#include "SkPath.h"
-#include "SkRasterClip.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkMatrix.h"
+#include "include/core/SkPath.h"
+#include "src/core/SkAutoPixmapStorage.h"
+#include "src/core/SkDraw.h"
+#include "src/core/SkRasterClip.h"
 
 class DrawPathBench : public Benchmark {
     SkPaint     fPaint;
diff --git a/bench/CubicKLMBench.cpp b/bench/CubicKLMBench.cpp
index 8e13a2d..c60f8fe 100644
--- a/bench/CubicKLMBench.cpp
+++ b/bench/CubicKLMBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "GrPathUtils.h"
-#include "SkGeometry.h"
+#include "src/core/SkGeometry.h"
+#include "src/gpu/geometry/GrPathUtils.h"
 
 class CubicKLMBench : public Benchmark {
 public:
diff --git a/bench/CubicMapBench.cpp b/bench/CubicMapBench.cpp
index 4cc55c5..1427a7e 100644
--- a/bench/CubicMapBench.cpp
+++ b/bench/CubicMapBench.cpp
@@ -5,8 +5,8 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCubicMap.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCubicMap.h"
 
 class CubicMapBench : public Benchmark {
 public:
@@ -23,9 +23,11 @@
     }
 
     void onDraw(int loops, SkCanvas*) override {
-        for (int i = 0; i < loops * 100; ++i) {
-            for (SkScalar x = 0; x <= 1; x += 1.0f / 512) {
-                fCMap.computeYFromX(x);
+        for (int outer = 0; outer < 100; ++outer) {
+            for (int i = 0; i < loops; ++i) {
+                for (SkScalar x = 0; x <= 1; x += 1.0f / 512) {
+                    fCMap.computeYFromX(x);
+                }
             }
         }
     }
diff --git a/bench/DDLRecorderBench.cpp b/bench/DDLRecorderBench.cpp
new file mode 100644
index 0000000..2fc116c
--- /dev/null
+++ b/bench/DDLRecorderBench.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "bench/Benchmark.h"
+
+#include "include/core/SkDeferredDisplayListRecorder.h"
+#include "include/core/SkSurfaceCharacterization.h"
+
+static SkSurfaceCharacterization create_characterization(GrContext* context) {
+    size_t maxResourceBytes = context->getResourceCacheLimit();
+
+    if (!context->colorTypeSupportedAsSurface(kRGBA_8888_SkColorType)) {
+        return SkSurfaceCharacterization();
+    }
+
+    SkImageInfo ii = SkImageInfo::Make(32, 32, kRGBA_8888_SkColorType,
+                                       kPremul_SkAlphaType, nullptr);
+
+    GrBackendFormat backendFormat = context->defaultBackendFormat(kRGBA_8888_SkColorType,
+                                                                  GrRenderable::kYes);
+    if (!backendFormat.isValid()) {
+        return SkSurfaceCharacterization();
+    }
+
+    SkSurfaceProps props(0x0, kUnknown_SkPixelGeometry);
+
+    SkSurfaceCharacterization c = context->threadSafeProxy()->createCharacterization(
+                                                        maxResourceBytes, ii, backendFormat, 1,
+                                                        kTopLeft_GrSurfaceOrigin, props, false);
+    return c;
+}
+
+// This benchmark tries to simulate how Viz is using SkDDLRecorders.
+// For each config it will create a single DDLRecorder which it reuses for all the runs
+// For each run it creates a DDL and stores it for later deletion.
+class DDLRecorderBench : public Benchmark {
+public:
+    DDLRecorderBench() { }
+
+protected:
+    const char* onGetName() override { return "DDLRecorder"; }
+
+    void onDraw(int loops, SkCanvas* origCanvas) override {
+        if (!fRecorder) {
+            return;
+        }
+
+        SkASSERT(!fDDLs.size());
+        fDDLs.reserve(loops);
+
+        for (int i = 0; i < loops; ++i) {
+            SkCanvas* recordingCanvas = fRecorder->getCanvas();
+
+            recordingCanvas->drawRect(SkRect::MakeWH(32, 32), SkPaint());
+
+            fDDLs.emplace_back(fRecorder->detach());
+        }
+    }
+
+private:
+    // We create one DDLRecorder for all the timing runs and just keep reusing it
+    void onPerCanvasPreDraw(SkCanvas* origCanvas) override {
+        GrContext* context = origCanvas->getGrContext();
+        if (!context) {
+            return;
+        }
+
+        SkSurfaceCharacterization c = create_characterization(context);
+
+        fRecorder.reset(new SkDeferredDisplayListRecorder(c));
+    }
+
+    // We defer the clean up of the DDLs so it is done outside of the timing loop
+    void onPostDraw(SkCanvas*) override {
+        fDDLs.clear();
+    }
+
+    std::unique_ptr<SkDeferredDisplayListRecorder>      fRecorder = nullptr;
+    std::vector<std::unique_ptr<SkDeferredDisplayList>> fDDLs;
+
+    typedef Benchmark INHERITED;
+};
+
+DEF_BENCH(return new DDLRecorderBench();)
diff --git a/bench/DashBench.cpp b/bench/DashBench.cpp
index 7c3df8a..99ca576 100644
--- a/bench/DashBench.cpp
+++ b/bench/DashBench.cpp
@@ -4,16 +4,16 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkDashPathEffect.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkString.h"
-#include "SkStrokeRec.h"
-#include "SkTDArray.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkString.h"
+#include "include/core/SkStrokeRec.h"
+#include "include/effects/SkDashPathEffect.h"
+#include "include/private/SkTDArray.h"
+#include "include/utils/SkRandom.h"
 
 
 /*
diff --git a/bench/DisplacementBench.cpp b/bench/DisplacementBench.cpp
index 97c008a..6c9a6bf 100644
--- a/bench/DisplacementBench.cpp
+++ b/bench/DisplacementBench.cpp
@@ -5,12 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkFont.h"
-#include "SkDisplacementMapEffect.h"
-#include "SkImageSource.h"
-#include "SkSurface.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkFont.h"
+#include "include/core/SkSurface.h"
+#include "include/effects/SkImageFilters.h"
 
 #define FILTER_WIDTH_SMALL  32
 #define FILTER_HEIGHT_SMALL 32
@@ -41,7 +40,7 @@
 
         SkFont font;
         font.setSize(SkIntToScalar(96));
-        canvas.drawSimpleText("g", 1, kUTF8_SkTextEncoding, SkIntToScalar(15), SkIntToScalar(55), font, paint);
+        canvas.drawSimpleText("g", 1, SkTextEncoding::kUTF8, SkIntToScalar(15), SkIntToScalar(55), font, paint);
     }
 
     void makeCheckerboard() {
@@ -100,12 +99,10 @@
 
     void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
-        sk_sp<SkImageFilter> displ(SkImageSource::Make(fCheckerboard));
+        sk_sp<SkImageFilter> displ(SkImageFilters::Image(fCheckerboard));
         // No displacement effect
-        paint.setImageFilter(SkDisplacementMapEffect::Make(
-                                                SkDisplacementMapEffect::kR_ChannelSelectorType,
-                                                SkDisplacementMapEffect::kG_ChannelSelectorType,
-                                                0.0f, std::move(displ), nullptr));
+        paint.setImageFilter(SkImageFilters::DisplacementMap(SkColorChannel::kR, SkColorChannel::kG,
+                                                             0.0f, std::move(displ), nullptr));
 
         for (int i = 0; i < loops; i++) {
             this->drawClippedBitmap(canvas, 0, 0, paint);
@@ -127,12 +124,10 @@
 
     void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
-        sk_sp<SkImageFilter> displ(SkImageSource::Make(fCheckerboard));
+        sk_sp<SkImageFilter> displ(SkImageFilters::Image(fCheckerboard));
         // Displacement, with 1 alpha component (which isn't pre-multiplied)
-        paint.setImageFilter(SkDisplacementMapEffect::Make(
-                                                SkDisplacementMapEffect::kB_ChannelSelectorType,
-                                                SkDisplacementMapEffect::kA_ChannelSelectorType,
-                                                16.0f, std::move(displ), nullptr));
+        paint.setImageFilter(SkImageFilters::DisplacementMap(SkColorChannel::kB, SkColorChannel::kA,
+                                                             16.0f, std::move(displ), nullptr));
         for (int i = 0; i < loops; i++) {
             this->drawClippedBitmap(canvas, 100, 0, paint);
         }
@@ -153,12 +148,10 @@
 
     void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
-        sk_sp<SkImageFilter> displ(SkImageSource::Make(fCheckerboard));
+        sk_sp<SkImageFilter> displ(SkImageFilters::Image(fCheckerboard));
         // Displacement, with 2 non-alpha components
-        paint.setImageFilter(SkDisplacementMapEffect::Make(
-                                                SkDisplacementMapEffect::kR_ChannelSelectorType,
-                                                SkDisplacementMapEffect::kB_ChannelSelectorType,
-                                                32.0f, std::move(displ), nullptr));
+        paint.setImageFilter(SkImageFilters::DisplacementMap(SkColorChannel::kR, SkColorChannel::kB,
+                                                             32.0f, std::move(displ), nullptr));
         for (int i = 0; i < loops; ++i) {
             this->drawClippedBitmap(canvas, 200, 0, paint);
         }
diff --git a/bench/DrawBitmapAABench.cpp b/bench/DrawBitmapAABench.cpp
index f0ccd89..52a92f7 100644
--- a/bench/DrawBitmapAABench.cpp
+++ b/bench/DrawBitmapAABench.cpp
@@ -4,12 +4,12 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkMatrix.h"
-#include "SkPaint.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkMatrix.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
 
 /**
  * This bench measures the rendering time of SkCanvas::drawBitmap with different anti-aliasing /
diff --git a/bench/DrawLatticeBench.cpp b/bench/DrawLatticeBench.cpp
index fbab2f7..6182070 100644
--- a/bench/DrawLatticeBench.cpp
+++ b/bench/DrawLatticeBench.cpp
@@ -5,11 +5,11 @@
 * found in the LICENSE file.
 */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkRect.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkRect.h"
+#include "include/core/SkString.h"
 
 class DrawLatticeBench : public Benchmark {
 public:
diff --git a/bench/EncodeBench.cpp b/bench/EncodeBench.cpp
index e9957de..d17ebed 100644
--- a/bench/EncodeBench.cpp
+++ b/bench/EncodeBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "Resources.h"
-#include "SkBitmap.h"
-#include "SkJpegEncoder.h"
-#include "SkPngEncoder.h"
-#include "SkWebpEncoder.h"
-#include "SkStream.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkStream.h"
+#include "include/encode/SkJpegEncoder.h"
+#include "include/encode/SkPngEncoder.h"
+#include "include/encode/SkWebpEncoder.h"
+#include "tools/Resources.h"
 
 // Like other Benchmark subclasses, Encoder benchmarks are run by:
 // nanobench --match ^Encode_
diff --git a/bench/FSRectBench.cpp b/bench/FSRectBench.cpp
index ba68ea1..0307069 100644
--- a/bench/FSRectBench.cpp
+++ b/bench/FSRectBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/utils/SkRandom.h"
 
 /**
  * Draws full screen opaque rectangles. It is designed to test any optimizations in the GPU backend
diff --git a/bench/FontCacheBench.cpp b/bench/FontCacheBench.cpp
index 2eb2b71..72a4d53 100644
--- a/bench/FontCacheBench.cpp
+++ b/bench/FontCacheBench.cpp
@@ -5,16 +5,16 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkChecksum.h"
-#include "SkFont.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkString.h"
-#include "SkTemplates.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkFont.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkString.h"
+#include "include/private/SkChecksum.h"
+#include "include/private/SkTemplates.h"
 
-#include "gUniqueGlyphIDs.h"
+#include "bench/gUniqueGlyphIDs.h"
 
 #define gUniqueGlyphIDs_Sentinel    0xFFFF
 
@@ -43,7 +43,7 @@
         while (*array != gUniqueGlyphIDs_Sentinel) {
             int count = count_glyphs(array);
             for (int i = 0; i < loops; ++i) {
-                (void)font.measureText(array, count * sizeof(uint16_t), kGlyphID_SkTextEncoding);
+                (void)font.measureText(array, count * sizeof(uint16_t), SkTextEncoding::kGlyphID);
             }
             array += count + 1;    // skip the sentinel
         }
diff --git a/bench/GMBench.cpp b/bench/GMBench.cpp
index 297ff42..1e15c32 100644
--- a/bench/GMBench.cpp
+++ b/bench/GMBench.cpp
@@ -5,14 +5,12 @@
  * found in the LICENSE file.
  */
 
-#include "GMBench.h"
+#include "bench/GMBench.h"
 
-GMBench::GMBench(skiagm::GM* gm) : fGM(gm) {
-    fName.printf("GM_%s", gm->getName());
+GMBench::GMBench(std::unique_ptr<skiagm::GM> gm) : fGM(std::move(gm)) {
+    fName.printf("GM_%s", fGM->getName());
 }
 
-GMBench::~GMBench() { delete fGM; }
-
 const char* GMBench::onGetName() {
     return fName.c_str();
 }
diff --git a/bench/GMBench.h b/bench/GMBench.h
index 5a917ad..89065c4 100644
--- a/bench/GMBench.h
+++ b/bench/GMBench.h
@@ -7,18 +7,16 @@
 #ifndef GMBench_DEFINED
 #define GMBench_DEFINED
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "gm.h"
+#include "bench/Benchmark.h"
+#include "gm/gm.h"
+#include "include/core/SkCanvas.h"
 
 /**
  * Runs a GM as a benchmark by repeatedly drawing the GM.
  */
 class GMBench : public Benchmark {
 public:
-    // Constructor takes ownership of the GM param.
-    GMBench(skiagm::GM* gm);
-    ~GMBench() override;
+    GMBench(std::unique_ptr<skiagm::GM> gm);
 
     void modifyGrContextOptions(GrContextOptions* options) override {
         return fGM->modifyGrContextOptions(options);
@@ -31,7 +29,7 @@
     SkIPoint onGetSize() override;
 
 private:
-    skiagm::GM* fGM;
+    std::unique_ptr<skiagm::GM> fGM;
     SkString    fName;
     typedef Benchmark INHERITED;
 };
diff --git a/bench/GameBench.cpp b/bench/GameBench.cpp
index 4096e0d..48c774c 100644
--- a/bench/GameBench.cpp
+++ b/bench/GameBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "SkVertices.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/core/SkVertices.h"
+#include "include/utils/SkRandom.h"
 
 // This bench simulates the calls Skia sees from various HTML5 canvas
 // game bench marks
diff --git a/bench/GeometryBench.cpp b/bench/GeometryBench.cpp
index 9b0ac88..457151d 100644
--- a/bench/GeometryBench.cpp
+++ b/bench/GeometryBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkGeometry.h"
-#include "SkRandom.h"
-#include "SkRect.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkRect.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkGeometry.h"
 
 class GeometryBench : public Benchmark {
 public:
@@ -244,7 +244,7 @@
 };
 DEF_BENCH( return new ChopCubicAt; )
 
-#include "SkPath.h"
+#include "include/core/SkPath.h"
 
 class ConvexityBench : public Benchmark {
     SkPath fPath;
diff --git a/bench/GrCCFillGeometryBench.cpp b/bench/GrCCFillGeometryBench.cpp
index 84a9e1e..962dcb2 100644
--- a/bench/GrCCFillGeometryBench.cpp
+++ b/bench/GrCCFillGeometryBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "ccpr/GrCCFillGeometry.h"
-#include "SkGeometry.h"
+#include "src/core/SkGeometry.h"
+#include "src/gpu/ccpr/GrCCFillGeometry.h"
 
 static int kNumBaseLoops = 50000;
 
diff --git a/bench/GrMemoryPoolBench.cpp b/bench/GrMemoryPoolBench.cpp
index bcc28c5..4d52662 100644
--- a/bench/GrMemoryPoolBench.cpp
+++ b/bench/GrMemoryPoolBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "SkTypes.h"
+#include "include/core/SkTypes.h"
 
-#include "Benchmark.h"
-#include "GrMemoryPool.h"
-#include "SkRandom.h"
-#include "SkTDArray.h"
-#include "SkTemplates.h"
+#include "bench/Benchmark.h"
+#include "include/private/SkTDArray.h"
+#include "include/private/SkTemplates.h"
+#include "include/utils/SkRandom.h"
+#include "src/gpu/GrMemoryPool.h"
 
 #include <new>
 
diff --git a/bench/GrMipMapBench.cpp b/bench/GrMipMapBench.cpp
index e7f34de..a0a1525 100644
--- a/bench/GrMipMapBench.cpp
+++ b/bench/GrMipMapBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkImage.h"
-#include "SkPaint.h"
-#include "SkSurface.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkSurface.h"
 
 class GrMipMapBench: public Benchmark {
     sk_sp<SkSurface> fSurface;
diff --git a/bench/GrResourceCacheBench.cpp b/bench/GrResourceCacheBench.cpp
index 8d96480..18b901e 100644
--- a/bench/GrResourceCacheBench.cpp
+++ b/bench/GrResourceCacheBench.cpp
@@ -5,15 +5,15 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "GrContext.h"
-#include "GrContextPriv.h"
-#include "GrGpu.h"
-#include "GrGpuResource.h"
-#include "GrGpuResourcePriv.h"
-#include "GrResourceCache.h"
-#include "SkCanvas.h"
+#include "include/core/SkCanvas.h"
+#include "include/gpu/GrContext.h"
+#include "include/gpu/GrGpuResource.h"
+#include "src/gpu/GrContextPriv.h"
+#include "src/gpu/GrGpu.h"
+#include "src/gpu/GrGpuResourcePriv.h"
+#include "src/gpu/GrResourceCache.h"
 
 enum {
     CACHE_SIZE_COUNT = 4096,
diff --git a/bench/GradientBench.cpp b/bench/GradientBench.cpp
index 4f28b6e..e202350 100644
--- a/bench/GradientBench.cpp
+++ b/bench/GradientBench.cpp
@@ -4,14 +4,16 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkGradientShader.h"
-#include "SkPaint.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkGradientShader.h"
+
+#include "tools/ToolUtils.h"
 
 struct GradData {
     int             fCount;
@@ -155,20 +157,6 @@
     kOval_GeomType
 };
 
-static const char* tilemodename(SkTileMode tm) {
-    switch (tm) {
-        case SkTileMode::kClamp:
-            return "clamp";
-        case SkTileMode::kRepeat:
-            return "repeat";
-        case SkTileMode::kMirror:
-            return "mirror";
-        case SkTileMode::kDecal:
-            return "decal";
-    }
-    return "";
-}
-
 static const char* geomtypename(GeomType gt) {
     switch (gt) {
         case kRect_GeomType:
@@ -193,7 +181,7 @@
         : fGeomType(geomType) {
 
         fName.printf("gradient_%s_%s", gGrads[gradType].fName,
-                     tilemodename(tm));
+                     ToolUtils::tilemode_name(tm));
         if (geomType != kRect_GeomType) {
             fName.appendf("_%s", geomtypename(geomType));
         }
@@ -211,7 +199,7 @@
     GradientBench(GradType gradType, GradData data, bool dither)
         : fGeomType(kRect_GeomType) {
 
-        const char *tmname = tilemodename(SkTileMode::kClamp);
+        const char *tmname = ToolUtils::tilemode_name(SkTileMode::kClamp);
         fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname);
         fName.append(data.fName);
 
diff --git a/bench/HairlinePathBench.cpp b/bench/HairlinePathBench.cpp
index 176adc5..d57f616 100644
--- a/bench/HairlinePathBench.cpp
+++ b/bench/HairlinePathBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
 
 enum Flags {
     kBig_Flag = 1 << 0,
diff --git a/bench/HardStopGradientBench_ScaleNumColors.cpp b/bench/HardStopGradientBench_ScaleNumColors.cpp
index b1f6267..00990ea 100644
--- a/bench/HardStopGradientBench_ScaleNumColors.cpp
+++ b/bench/HardStopGradientBench_ScaleNumColors.cpp
@@ -5,33 +5,22 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "SkCanvas.h"
-#include "SkShader.h"
-#include "SkGradientShader.h"
-#include "SkString.h"
-#include "SkColor.h"
-#include "SkPaint.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColor.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkGradientShader.h"
 
-static const char* get_tilemode_name(SkTileMode tilemode) {
-    switch (tilemode) {
-        case SkTileMode::kClamp:
-            return "clamp";
-        case SkTileMode::kRepeat:
-            return "repeat";
-        case SkTileMode::kMirror:
-            return "mirror";
-        case SkTileMode::kDecal:
-            return "decal";
-    }
-    return "";
-}
+#include "tools/ToolUtils.h"
 
 class HardStopGradientBench_ScaleNumColors : public Benchmark {
 public:
     HardStopGradientBench_ScaleNumColors(SkTileMode tilemode, int count) {
-        fName.printf("hardstop_scale_num_colors_%s_%03d_colors", get_tilemode_name(tilemode), count);
+        fName.printf("hardstop_scale_num_colors_%s_%03d_colors",
+                     ToolUtils::tilemode_name(tilemode), count);
 
         fTileMode   = tilemode;
         fColorCount = count;
diff --git a/bench/HardStopGradientBench_ScaleNumHardStops.cpp b/bench/HardStopGradientBench_ScaleNumHardStops.cpp
index b1ea306..01ed7be 100644
--- a/bench/HardStopGradientBench_ScaleNumHardStops.cpp
+++ b/bench/HardStopGradientBench_ScaleNumHardStops.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "SkCanvas.h"
-#include "SkShader.h"
-#include "SkGradientShader.h"
-#include "SkString.h"
-#include "SkColor.h"
-#include "SkPaint.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColor.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkGradientShader.h"
 
 class HardStopGradientBench_ScaleNumHardStops : public Benchmark {
 public:
diff --git a/bench/HardStopGradientBench_SpecialHardStops.cpp b/bench/HardStopGradientBench_SpecialHardStops.cpp
index 607080a..ac6e461 100644
--- a/bench/HardStopGradientBench_SpecialHardStops.cpp
+++ b/bench/HardStopGradientBench_SpecialHardStops.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "SkCanvas.h"
-#include "SkShader.h"
-#include "SkGradientShader.h"
-#include "SkString.h"
-#include "SkColor.h"
-#include "SkPaint.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColor.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkGradientShader.h"
 
 enum class Kind {
     k001,
diff --git a/bench/ImageBench.cpp b/bench/ImageBench.cpp
index d8260e7..a452903 100644
--- a/bench/ImageBench.cpp
+++ b/bench/ImageBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkImage.h"
-#include "SkSurface.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkSurface.h"
 
 class Image2RasterBench : public Benchmark {
 public:
diff --git a/bench/ImageCacheBench.cpp b/bench/ImageCacheBench.cpp
index cf35bbf..1d577d6 100644
--- a/bench/ImageCacheBench.cpp
+++ b/bench/ImageCacheBench.cpp
@@ -5,8 +5,8 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkResourceCache.h"
+#include "bench/Benchmark.h"
+#include "src/core/SkResourceCache.h"
 
 namespace {
 static void* gGlobalAddress;
diff --git a/bench/ImageCacheBudgetBench.cpp b/bench/ImageCacheBudgetBench.cpp
index fb714ba..0a98a96 100644
--- a/bench/ImageCacheBudgetBench.cpp
+++ b/bench/ImageCacheBudgetBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkImage.h"
-#include "SkSurface.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkSurface.h"
+#include "tools/ToolUtils.h"
 
-#include "GrContext.h"
-#include "GrContextPriv.h"
+#include "include/gpu/GrContext.h"
+#include "src/gpu/GrContextPriv.h"
 
 #include <utility>
 
@@ -91,7 +91,7 @@
     void onPerCanvasPreDraw(SkCanvas* canvas) override {
         GrContext* context = canvas->getGrContext();
         SkASSERT(context);
-        context->getResourceCacheLimits(&fOldCount, &fOldBytes);
+        fOldBytes = context->getResourceCacheLimit();
         set_cache_budget(canvas, fBudgetSize);
         make_images(fImages, kImagesToDraw);
         if (fShuffle) {
@@ -114,7 +114,7 @@
     void onPerCanvasPostDraw(SkCanvas* canvas) override {
         GrContext* context =  canvas->getGrContext();
         SkASSERT(context);
-        context->setResourceCacheLimits(fOldCount, fOldBytes);
+        context->setResourceCacheLimit(fOldBytes);
         for (int i = 0; i < kImagesToDraw; ++i) {
             fImages[i].reset();
         }
@@ -149,7 +149,6 @@
     sk_sp<SkImage>              fImages[kImagesToDraw];
     std::unique_ptr<int[]>      fIndices;
     size_t                      fOldBytes;
-    int                         fOldCount;
 
     typedef Benchmark INHERITED;
 };
diff --git a/bench/ImageCycleBench.cpp b/bench/ImageCycleBench.cpp
index e7e0025..032e43b 100644
--- a/bench/ImageCycleBench.cpp
+++ b/bench/ImageCycleBench.cpp
@@ -5,12 +5,12 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "SkCanvas.h"
-#include "SkImage.h"
-#include "SkRandom.h"
-#include "SkSurface.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkSurface.h"
+#include "include/utils/SkRandom.h"
 
 /**
  * Draws a small set of small images multiple times each with no overlaps so that each image could
diff --git a/bench/ImageFilterCollapse.cpp b/bench/ImageFilterCollapse.cpp
index 3562766..00b8232 100644
--- a/bench/ImageFilterCollapse.cpp
+++ b/bench/ImageFilterCollapse.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorFilterImageFilter.h"
-#include "SkColorMatrixFilter.h"
-#include "SkGradientShader.h"
-#include "SkImageFilter.h"
-#include "SkTableColorFilter.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImageFilter.h"
+#include "include/effects/SkColorMatrixFilter.h"
+#include "include/effects/SkGradientShader.h"
+#include "include/effects/SkImageFilters.h"
+#include "include/effects/SkTableColorFilter.h"
 
 // Chains several matrix color filters image filter or several
 // table filter image filters and draws a bitmap.
@@ -30,7 +30,7 @@
 
         // Create a chain of ImageFilters from colorFilters
         for(int i = nFilters; i --> 0;) {
-            fImageFilter = SkColorFilterImageFilter::Make(colorFilters[i], fImageFilter);
+            fImageFilter = SkImageFilters::ColorFilter(colorFilters[i], fImageFilter);
         }
     }
 
@@ -98,22 +98,21 @@
 };
 
 static sk_sp<SkColorFilter> make_brightness(float amount) {
-    SkScalar amount255 = amount * 255;
-    SkScalar matrix[20] = { 1, 0, 0, 0, amount255,
-                            0, 1, 0, 0, amount255,
-                            0, 0, 1, 0, amount255,
+    SkScalar matrix[20] = { 1, 0, 0, 0, amount,
+                            0, 1, 0, 0, amount,
+                            0, 0, 1, 0, amount,
                             0, 0, 0, 1, 0 };
-    return SkColorFilters::MatrixRowMajor255(matrix);
+    return SkColorFilters::Matrix(matrix);
 }
 
 static sk_sp<SkColorFilter> make_grayscale() {
-    SkScalar matrix[20];
-    memset(matrix, 0, 20 * sizeof(SkScalar));
+    float matrix[20];
+    memset(matrix, 0, 20 * sizeof(float));
     matrix[0] = matrix[5] = matrix[10] = 0.2126f;
     matrix[1] = matrix[6] = matrix[11] = 0.7152f;
     matrix[2] = matrix[7] = matrix[12] = 0.0722f;
     matrix[18] = 1.0f;
-    return SkColorFilters::MatrixRowMajor255(matrix);
+    return SkColorFilters::Matrix(matrix);
 }
 
 class MatrixCollapseBench: public BaseImageFilterCollapseBench {
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp
index 76b091f..7c586f4 100644
--- a/bench/ImageFilterDAGBench.cpp
+++ b/bench/ImageFilterDAGBench.cpp
@@ -5,15 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "Resources.h"
-#include "SkBlurImageFilter.h"
-#include "SkCanvas.h"
-#include "SkDisplacementMapEffect.h"
-#include "SkImage.h"
-#include "SkMergeImageFilter.h"
-#include "SkOffsetImageFilter.h"
-#include "SkXfermodeImageFilter.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/effects/SkImageFilters.h"
+#include "tools/Resources.h"
 
 // Exercise a blur filter connected to 5 inputs of the same merge filter.
 // This bench shows an improvement in performance once cacheing of re-used
@@ -30,14 +26,23 @@
     void onDraw(int loops, SkCanvas* canvas) override {
         const SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
 
+        // Set up the filters once, we're not interested in measuring allocation time here
+        sk_sp<SkImageFilter> blur(SkImageFilters::Blur(20.0f, 20.0f, nullptr));
+        sk_sp<SkImageFilter> inputs[kNumInputs];
+        for (int i = 0; i < kNumInputs; ++i) {
+            inputs[i] = blur;
+        }
+        SkPaint paint;
+        paint.setImageFilter(SkImageFilters::Merge(inputs, kNumInputs));
+
+        // Only measure the filter computations done in drawRect()
+        // TODO (michaelludwig) - This benchmark, and the ones defined below, allocate their filters
+        // outside of the loop. This means that repeatedly drawing with the same filter will hit
+        // the global image filter cache inside the loop. Raster backend uses this cache so will see
+        // artificially improved performance. Ganesh will not because it uses a cache per filter
+        // call, so only within-DAG cache hits are measured (as desired). skbug:9297 wants to move
+        // raster backend to the same pattern, which will make the benchmark executions fair again.
         for (int j = 0; j < loops; j++) {
-            sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(20.0f, 20.0f, nullptr));
-            sk_sp<SkImageFilter> inputs[kNumInputs];
-            for (int i = 0; i < kNumInputs; ++i) {
-                inputs[i] = blur;
-            }
-            SkPaint paint;
-            paint.setImageFilter(SkMergeImageFilter::Make(inputs, kNumInputs));
             canvas->drawRect(rect, paint);
         }
     }
@@ -65,15 +70,22 @@
         SkIRect subset = SkIRect::MakeSize(fImage->dimensions());
         SkIPoint offset = SkIPoint::Make(0, 0);
         SkIRect discardSubset;
-        sk_sp<SkImage> image = fImage;
+        // makeWithFilter will only use the GPU backend if the image is already a texture
+        sk_sp<SkImage> image = fImage->makeTextureImage(canvas->getGrContext());
+        if (!image) {
+            image = fImage;
+        }
 
+        // Set up the filters once so the allocation cost isn't included per-loop
+        sk_sp<SkImageFilter> blur(SkImageFilters::Blur(20.0f, 20.0f, nullptr));
+        sk_sp<SkImageFilter> inputs[kNumInputs];
+        for (int i = 0; i < kNumInputs; ++i) {
+            inputs[i] = blur;
+        }
+        sk_sp<SkImageFilter> mergeFilter = SkImageFilters::Merge(inputs, kNumInputs);
+
+        // But measure makeWithFilter() per loop since that's the focus of this benchmark
         for (int j = 0; j < loops; j++) {
-            sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(20.0f, 20.0f, nullptr));
-            sk_sp<SkImageFilter> inputs[kNumInputs];
-            for (int i = 0; i < kNumInputs; ++i) {
-                inputs[i] = blur;
-            }
-            sk_sp<SkImageFilter> mergeFilter = SkMergeImageFilter::Make(inputs, kNumInputs);
             image = image->makeWithFilter(mergeFilter.get(), subset, subset, &discardSubset,
                                           &offset);
             SkASSERT(image && image->dimensions() == fImage->dimensions());
@@ -99,17 +111,18 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
+        // Setup filter once
+        sk_sp<SkImageFilter> blur(SkImageFilters::Blur(4.0f, 4.0f, nullptr));
+        SkScalar scale = 2;
+
+        SkPaint paint;
+        paint.setImageFilter(SkImageFilters::DisplacementMap(SkColorChannel::kR, SkColorChannel::kR,
+                                                             scale, blur, blur));
+
+        SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
+
+        // As before, measure just the filter computation time inside the loops
         for (int j = 0; j < loops; j++) {
-            sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(4.0f, 4.0f, nullptr));
-            auto xSelector = SkDisplacementMapEffect::kR_ChannelSelectorType;
-            auto ySelector = SkDisplacementMapEffect::kB_ChannelSelectorType;
-            SkScalar scale = 2;
-
-            SkPaint paint;
-            paint.setImageFilter(SkDisplacementMapEffect::Make(xSelector, ySelector, scale,
-                                                               blur, blur));
-
-            SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
             canvas->drawRect(rect, paint);
         }
     }
@@ -127,15 +140,18 @@
     const char* onGetName() override { return "image_filter_xfermode_in"; }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        for (int j = 0; j < loops; j++) {
-            auto blur = SkBlurImageFilter::Make(20.0f, 20.0f, nullptr);
-            auto offset1 = SkOffsetImageFilter::Make(100.0f, 100.0f, blur);
-            auto offset2 = SkOffsetImageFilter::Make(-100.0f, -100.0f, blur);
-            auto xfermode =
-                    SkXfermodeImageFilter::Make(SkBlendMode::kSrcIn, offset1, offset2, nullptr);
+        // Allocate filters once to avoid measuring instantiation time
+        auto blur = SkImageFilters::Blur(20.0f, 20.0f, nullptr);
+        auto offset1 = SkImageFilters::Offset(100.0f, 100.0f, blur);
+        auto offset2 = SkImageFilters::Offset(-100.0f, -100.0f, blur);
+        auto xfermode =
+                SkImageFilters::Xfermode(SkBlendMode::kSrcIn, offset1, offset2, nullptr);
 
-            SkPaint paint;
-            paint.setImageFilter(xfermode);
+        SkPaint paint;
+        paint.setImageFilter(xfermode);
+
+        // Measure only the filter time
+        for (int j = 0; j < loops; j++) {
             canvas->drawRect(SkRect::MakeWH(200.0f, 200.0f), paint);
         }
     }
diff --git a/bench/InterpBench.cpp b/bench/InterpBench.cpp
index 16cc499..61c3de6 100644
--- a/bench/InterpBench.cpp
+++ b/bench/InterpBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkColorData.h"
-#include "SkFixed.h"
-#include "SkMatrix.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkMatrix.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/private/SkColorData.h"
+#include "include/private/SkFixed.h"
+#include "include/utils/SkRandom.h"
 
 #define TILE(x, width)  (((x) & 0xFFFF) * width >> 16)
 
diff --git a/bench/JSONBench.cpp b/bench/JSONBench.cpp
index 4ef1d6c..061316d 100644
--- a/bench/JSONBench.cpp
+++ b/bench/JSONBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkData.h"
-#include "SkJSON.h"
-#include "SkStream.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkData.h"
+#include "include/core/SkStream.h"
+#include "src/utils/SkJSON.h"
 
 #if defined(SK_BUILD_FOR_ANDROID)
 static constexpr const char* kBenchFile = "/data/local/tmp/bench.json";
diff --git a/bench/LightingBench.cpp b/bench/LightingBench.cpp
index a924f4a..06d72d0d 100644
--- a/bench/LightingBench.cpp
+++ b/bench/LightingBench.cpp
@@ -4,10 +4,10 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkLightingImageFilter.h"
-#include "SkPoint3.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPoint3.h"
+#include "include/effects/SkImageFilters.h"
 
 #define FILTER_WIDTH_SMALL  SkIntToScalar(32)
 #define FILTER_HEIGHT_SMALL SkIntToScalar(32)
@@ -105,11 +105,8 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        draw(loops, canvas, SkLightingImageFilter::MakePointLitDiffuse(GetPointLocation(),
-                                                                       GetWhite(),
-                                                                       GetSurfaceScale(),
-                                                                       GetKd(),
-                                                                       nullptr));
+        draw(loops, canvas, SkImageFilters::PointLitDiffuse(
+                GetPointLocation(), GetWhite(),  GetSurfaceScale(), GetKd(), nullptr));
     }
 
 private:
@@ -126,11 +123,8 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        draw(loops, canvas, SkLightingImageFilter::MakeDistantLitDiffuse(GetDistantDirection(),
-                                                                         GetWhite(),
-                                                                         GetSurfaceScale(),
-                                                                         GetKd(),
-                                                                         nullptr));
+        draw(loops, canvas, SkImageFilters::DistantLitDiffuse(
+            GetDistantDirection(), GetWhite(), GetSurfaceScale(), GetKd(), nullptr));
     }
 
 private:
@@ -147,14 +141,9 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        draw(loops, canvas, SkLightingImageFilter::MakeSpotLitDiffuse(GetSpotLocation(),
-                                                                       GetSpotTarget(),
-                                                                       GetSpotExponent(),
-                                                                       GetCutoffAngle(),
-                                                                       GetWhite(),
-                                                                       GetSurfaceScale(),
-                                                                       GetKd(),
-                                                                       nullptr));
+        draw(loops, canvas, SkImageFilters::SpotLitDiffuse(
+                GetSpotLocation(), GetSpotTarget(), GetSpotExponent(), GetCutoffAngle(),
+                GetWhite(), GetSurfaceScale(), GetKd(), nullptr));
     }
 
 private:
@@ -171,12 +160,9 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        draw(loops, canvas, SkLightingImageFilter::MakePointLitSpecular(GetPointLocation(),
-                                                                        GetWhite(),
-                                                                        GetSurfaceScale(),
-                                                                        GetKs(),
-                                                                        GetShininess(),
-                                                                        nullptr));
+        draw(loops, canvas, SkImageFilters::PointLitSpecular(
+                GetPointLocation(), GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(),
+                nullptr));
     }
 
 private:
@@ -193,12 +179,9 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        draw(loops, canvas, SkLightingImageFilter::MakeDistantLitSpecular(GetDistantDirection(),
-                                                                          GetWhite(),
-                                                                          GetSurfaceScale(),
-                                                                          GetKs(),
-                                                                          GetShininess(),
-                                                                          nullptr));
+        draw(loops, canvas, SkImageFilters::DistantLitSpecular(
+                GetDistantDirection(), GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(),
+                nullptr));
     }
 
 private:
@@ -215,15 +198,9 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
-        draw(loops, canvas, SkLightingImageFilter::MakeSpotLitSpecular(GetSpotLocation(),
-                                                                       GetSpotTarget(),
-                                                                       GetSpotExponent(),
-                                                                       GetCutoffAngle(),
-                                                                       GetWhite(),
-                                                                       GetSurfaceScale(),
-                                                                       GetKs(),
-                                                                       GetShininess(),
-                                                                       nullptr));
+        draw(loops, canvas, SkImageFilters::SpotLitSpecular(
+                GetSpotLocation(), GetSpotTarget(), GetSpotExponent(), GetCutoffAngle(),
+                GetWhite(), GetSurfaceScale(), GetKs(), GetShininess(), nullptr));
     }
 
 private:
diff --git a/bench/LineBench.cpp b/bench/LineBench.cpp
index 67dc564..b904cb8 100644
--- a/bench/LineBench.cpp
+++ b/bench/LineBench.cpp
@@ -5,15 +5,15 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "SkTArray.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/private/SkTArray.h"
+#include "include/utils/SkRandom.h"
 
 
 class LineBench : public Benchmark {
diff --git a/bench/MagnifierBench.cpp b/bench/MagnifierBench.cpp
index d345c63..9b09da9 100644
--- a/bench/MagnifierBench.cpp
+++ b/bench/MagnifierBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkMagnifierImageFilter.h"
-#include "SkRandom.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/effects/SkImageFilters.h"
+#include "include/utils/SkRandom.h"
 
 #define FILTER_WIDTH_SMALL  32
 #define FILTER_HEIGHT_SMALL 32
@@ -39,7 +39,7 @@
         const int h = fIsSmall ? FILTER_HEIGHT_SMALL : FILTER_HEIGHT_LARGE;
         SkPaint paint;
         paint.setImageFilter(
-            SkMagnifierImageFilter::Make(
+            SkImageFilters::Magnifier(
                 SkRect::MakeXYWH(SkIntToScalar(w / 4),
                                  SkIntToScalar(h / 4),
                                  SkIntToScalar(w / 2),
diff --git a/bench/MathBench.cpp b/bench/MathBench.cpp
index 74b89a3..e47c6ac 100644
--- a/bench/MathBench.cpp
+++ b/bench/MathBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkColorData.h"
-#include "SkFixed.h"
-#include "SkMathPriv.h"
-#include "SkMatrix.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkMatrix.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/private/SkColorData.h"
+#include "include/private/SkFixed.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkMathPriv.h"
 
 static float sk_fsel(float pred, float result_ge, float result_lt) {
     return pred >= 0 ? result_ge : result_lt;
@@ -601,7 +601,7 @@
 
 //////////////////////////////////////////////////////////////
 
-#include "../private/SkFloatBits.h"
+#include "include/private/SkFloatBits.h"
 class Floor2IntBench : public Benchmark {
     enum {
         ARRAY = 1000,
diff --git a/bench/Matrix44Bench.cpp b/bench/Matrix44Bench.cpp
index 35c3e68..5698751 100644
--- a/bench/Matrix44Bench.cpp
+++ b/bench/Matrix44Bench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkMatrix44.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkMatrix44.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
 
 class Matrix44Bench : public Benchmark {
     SkString    fName;
diff --git a/bench/MatrixBench.cpp b/bench/MatrixBench.cpp
index 53e7296..7248d01 100644
--- a/bench/MatrixBench.cpp
+++ b/bench/MatrixBench.cpp
@@ -4,11 +4,11 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkMatrix.h"
-#include "SkMatrixUtils.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkMatrix.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkMatrixUtils.h"
 
 class MatrixBench : public Benchmark {
     SkString    fName;
@@ -313,7 +313,7 @@
         fM.setScale(2, 3);
         fM.postTranslate(1, 2);
 
-        fR.set(10, 10, 100, 200);
+        fR.setLTRB(10, 10, 100, 200);
     }
 
     void performTest() override {
diff --git a/bench/MatrixConvolutionBench.cpp b/bench/MatrixConvolutionBench.cpp
index 3a43de8..2121e86 100644
--- a/bench/MatrixConvolutionBench.cpp
+++ b/bench/MatrixConvolutionBench.cpp
@@ -4,27 +4,21 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkMatrixConvolutionImageFilter.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/core/SkTileMode.h"
+#include "include/effects/SkImageFilters.h"
+#include "include/utils/SkRandom.h"
 
-static const char* name(SkMatrixConvolutionImageFilter::TileMode mode) {
-    switch (mode) {
-        case SkMatrixConvolutionImageFilter::kClamp_TileMode:        return "clamp";
-        case SkMatrixConvolutionImageFilter::kRepeat_TileMode:       return "repeat";
-        case SkMatrixConvolutionImageFilter::kClampToBlack_TileMode: return "clampToBlack";
-    }
-    return "oops";
-}
+#include "tools/ToolUtils.h"
 
 class MatrixConvolutionBench : public Benchmark {
 public:
-    MatrixConvolutionBench(SkMatrixConvolutionImageFilter::TileMode tileMode, bool convolveAlpha)
+    MatrixConvolutionBench(SkTileMode tileMode, bool convolveAlpha)
         : fName(SkStringPrintf("matrixconvolution_%s%s",
-                               name(tileMode),
+                               ToolUtils::tilemode_name(tileMode),
                                convolveAlpha ? "" : "_noConvolveAlpha")) {
         SkISize kernelSize = SkISize::Make(3, 3);
         SkScalar kernel[9] = {
@@ -34,25 +28,25 @@
         };
         SkScalar gain = 0.3f, bias = SkIntToScalar(100);
         SkIPoint kernelOffset = SkIPoint::Make(1, 1);
-        fFilter = SkMatrixConvolutionImageFilter::Make(kernelSize, kernel, gain, bias,
-                                                       kernelOffset, tileMode, convolveAlpha,
-                                                       nullptr);
+        fFilter = SkImageFilters::MatrixConvolution(kernelSize, kernel, gain, bias,
+                                                    kernelOffset, tileMode, convolveAlpha, nullptr);
     }
 
 protected:
-    virtual const char* onGetName() {
+    const char* onGetName() override {
         return fName.c_str();
     }
 
-    virtual void onDraw(int loops, SkCanvas* canvas) {
+    void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         this->setupPaint(&paint);
+        paint.setImageFilter(fFilter);
         paint.setAntiAlias(true);
+
         SkRandom rand;
         for (int i = 0; i < loops; i++) {
             SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
                                       rand.nextUScalar1() * 400);
-            paint.setImageFilter(fFilter);
             canvas->drawOval(r, paint);
         }
     }
@@ -64,7 +58,8 @@
     typedef Benchmark INHERITED;
 };
 
-DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClamp_TileMode, true); )
-DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kRepeat_TileMode, true); )
-DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, true); )
-DEF_BENCH( return new MatrixConvolutionBench(SkMatrixConvolutionImageFilter::kClampToBlack_TileMode, false); )
+DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kClamp, true); )
+DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kRepeat, true); )
+DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kMirror, true); )
+DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kDecal, true); )
+DEF_BENCH( return new MatrixConvolutionBench(SkTileMode::kDecal, false); )
diff --git a/bench/MemsetBench.cpp b/bench/MemsetBench.cpp
index beae339..ccdbebb 100644
--- a/bench/MemsetBench.cpp
+++ b/bench/MemsetBench.cpp
@@ -5,9 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkTemplates.h"
-#include "SkUtils.h"
+#include "bench/Benchmark.h"
+#include "include/private/SkTemplates.h"
+#include "src/core/SkUtils.h"
 
 template <typename T, bool kInline>
 class MemsetBench : public Benchmark {
diff --git a/bench/MergeBench.cpp b/bench/MergeBench.cpp
index dd0e07c..ddf52b7 100644
--- a/bench/MergeBench.cpp
+++ b/bench/MergeBench.cpp
@@ -5,12 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkFont.h"
-#include "SkImageSource.h"
-#include "SkMergeImageFilter.h"
-#include "SkSurface.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkFont.h"
+#include "include/core/SkSurface.h"
+#include "include/effects/SkImageFilters.h"
 
 #define FILTER_WIDTH_SMALL  SkIntToScalar(32)
 #define FILTER_HEIGHT_SMALL SkIntToScalar(32)
@@ -24,7 +23,7 @@
     paint.setColor(0xFF884422);
     SkFont font;
     font.setSize(SkIntToScalar(96));
-    surface->getCanvas()->drawSimpleText("g", 1, kUTF8_SkTextEncoding, 15, 55, font, paint);
+    surface->getCanvas()->drawSimpleText("g", 1, SkTextEncoding::kUTF8, 15, 55, font, paint);
     return surface->makeImageSnapshot();
 }
 
@@ -72,18 +71,14 @@
         SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
                               SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
         SkPaint paint;
-        paint.setImageFilter(this->mergeBitmaps());
+        paint.setImageFilter(SkImageFilters::Merge(SkImageFilters::Image(fCheckerboard),
+                                                   SkImageFilters::Image(fImage)));
         for (int i = 0; i < loops; i++) {
             canvas->drawRect(r, paint);
         }
     }
 
 private:
-    sk_sp<SkImageFilter> mergeBitmaps() {
-        return SkMergeImageFilter::Make(SkImageSource::Make(fCheckerboard),
-                                        SkImageSource::Make(fImage));
-    }
-
     bool fIsSmall;
     bool fInitialized;
     sk_sp<SkImage> fImage, fCheckerboard;
diff --git a/bench/MipMapBench.cpp b/bench/MipMapBench.cpp
index aed2c59..baa8cd3 100644
--- a/bench/MipMapBench.cpp
+++ b/bench/MipMapBench.cpp
@@ -5,9 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkMipMap.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "src/core/SkMipMap.h"
 
 class MipMapBench: public Benchmark {
     SkBitmap fBitmap;
diff --git a/bench/MorphologyBench.cpp b/bench/MorphologyBench.cpp
index 5edae6e..ad18954 100644
--- a/bench/MorphologyBench.cpp
+++ b/bench/MorphologyBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkMorphologyImageFilter.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkImageFilters.h"
+#include "include/utils/SkRandom.h"
 
 #define SMALL   SkIntToScalar(2)
 #define REAL    1.5f
@@ -66,14 +66,12 @@
                 sk_sp<SkImageFilter> mf;
                 switch (fStyle) {
                 case kDilate_MT:
-                    mf = SkDilateImageFilter::Make(SkScalarFloorToInt(fRadius),
-                                                   SkScalarFloorToInt(fRadius),
-                                                   nullptr);
+                    mf = SkImageFilters::Dilate(
+                            SkScalarFloorToInt(fRadius), SkScalarFloorToInt(fRadius), nullptr);
                     break;
                 case kErode_MT:
-                    mf = SkErodeImageFilter::Make(SkScalarFloorToInt(fRadius),
-                                                  SkScalarFloorToInt(fRadius),
-                                                  nullptr);
+                    mf = SkImageFilters::Erode(
+                            SkScalarFloorToInt(fRadius), SkScalarFloorToInt(fRadius), nullptr);
                     break;
                 }
                 paint.setImageFilter(std::move(mf));
diff --git a/bench/MutexBench.cpp b/bench/MutexBench.cpp
index 27ebee5..bb98368 100644
--- a/bench/MutexBench.cpp
+++ b/bench/MutexBench.cpp
@@ -4,11 +4,11 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkMutex.h"
-#include "SkSharedMutex.h"
-#include "SkSpinlock.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkString.h"
+#include "include/private/SkMutex.h"
+#include "include/private/SkSpinlock.h"
+#include "src/core/SkSharedMutex.h"
 
 template <typename Mutex>
 class MutexBench : public Benchmark {
diff --git a/bench/PDFBench.cpp b/bench/PDFBench.cpp
index c3521b3..f78bd22 100644
--- a/bench/PDFBench.cpp
+++ b/bench/PDFBench.cpp
@@ -5,20 +5,20 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "Resources.h"
-#include "SkAutoPixmapStorage.h"
-#include "SkData.h"
-#include "SkExecutor.h"
-#include "SkFloatToDecimal.h"
-#include "SkGradientShader.h"
-#include "SkImage.h"
-#include "SkPDFUnion.h"
-#include "SkPixmap.h"
-#include "SkRandom.h"
-#include "SkStream.h"
-#include "SkTo.h"
+#include "include/core/SkData.h"
+#include "include/core/SkExecutor.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkPixmap.h"
+#include "include/core/SkStream.h"
+#include "include/effects/SkGradientShader.h"
+#include "include/private/SkTo.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkAutoPixmapStorage.h"
+#include "src/pdf/SkPDFUnion.h"
+#include "src/utils/SkFloatToDecimal.h"
+#include "tools/Resources.h"
 
 namespace {
 struct WStreamWriteTextBenchmark : public Benchmark {
@@ -75,10 +75,10 @@
 
 #ifdef SK_SUPPORT_PDF
 
-#include "SkPDFBitmap.h"
-#include "SkPDFDocumentPriv.h"
-#include "SkPDFShader.h"
-#include "SkPDFUtils.h"
+#include "src/pdf/SkPDFBitmap.h"
+#include "src/pdf/SkPDFDocumentPriv.h"
+#include "src/pdf/SkPDFShader.h"
+#include "src/pdf/SkPDFUtils.h"
 
 namespace {
 class PDFImageBench : public Benchmark {
@@ -219,7 +219,7 @@
             SkPDFDocument doc(&nullStream, SkPDF::Metadata());
             doc.beginPage(256, 256);
             (void) SkPDFMakeShader(&doc, fShader.get(), SkMatrix::I(),
-                                   {0, 0, 400, 400}, SK_ColorBLACK);
+                                   {0, 0, 400, 400}, SkColors::kBlack);
         }
     }
 };
@@ -311,7 +311,7 @@
 DEF_BENCH(return new PDFClipPathBenchmark;)
 
 #ifdef SK_PDF_ENABLE_SLOW_TESTS
-#include "SkExecutor.h"
+#include "include/core/SkExecutor.h"
 namespace {
 void big_pdf_test(SkDocument* doc, const SkBitmap& background) {
     static const char* kText[] = {
diff --git a/bench/ParagraphBench.cpp b/bench/ParagraphBench.cpp
new file mode 100644
index 0000000..35e4300
--- /dev/null
+++ b/bench/ParagraphBench.cpp
@@ -0,0 +1,64 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+
+#include "bench/Benchmark.h"
+
+#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3)
+
+#include "modules/skparagraph/include/FontCollection.h"
+#include "modules/skparagraph/include/Paragraph.h"
+#include "modules/skparagraph/src/ParagraphBuilderImpl.h"
+#include "modules/skparagraph/src/ParagraphImpl.h"
+#include "tools/Resources.h"
+
+#include <cfloat>
+#include "include/core/SkPictureRecorder.h"
+#include "modules/skparagraph/utils/TestFontCollection.h"
+
+using namespace skia::textlayout;
+namespace {
+struct ParagraphBench : public Benchmark {
+    ParagraphBench(SkScalar width, const char* r, const char* n)
+            : fResource(r), fName(n), fWidth(width) {}
+    sk_sp<SkData> fData;
+    const char* fResource;
+    const char* fName;
+    SkScalar fWidth;
+    const char* onGetName() override { return fName; }
+    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
+    void onDelayedSetup() override { fData = GetResourceAsData(fResource); }
+    void onDraw(int loops, SkCanvas*) override {
+        if (!fData) {
+            return;
+        }
+
+        const char* text = (const char*)fData->data();
+
+        auto fontCollection = sk_make_sp<FontCollection>();
+        fontCollection->setDefaultFontManager(SkFontMgr::RefDefault());
+        ParagraphStyle paragraph_style;
+        paragraph_style.turnHintingOff();
+        ParagraphBuilderImpl builder(paragraph_style, fontCollection);
+        builder.addText(text);
+        auto paragraph = builder.Build();
+
+        SkPictureRecorder rec;
+        SkCanvas* canvas = rec.beginRecording({0,0, 2000,3000});
+        while (loops-- > 0) {
+            paragraph->layout(fWidth);
+            auto impl = static_cast<ParagraphImpl*>(paragraph.get());
+            paragraph->paint(canvas, 0, 0);
+            paragraph->markDirty();
+            impl->resetCache();
+        }
+    }
+};
+}  // namespace
+
+#define PARAGRAPH_BENCH(X) DEF_BENCH(return new ParagraphBench(50000, "text/" #X ".txt", "paragraph_" #X);)
+//PARAGRAPH_BENCH(arabic)
+//PARAGRAPH_BENCH(emoji)
+PARAGRAPH_BENCH(english)
+#undef PARAGRAPH_BENCH
+
+#endif  // !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3)
diff --git a/bench/PatchBench.cpp b/bench/PatchBench.cpp
index 064db69..b2fc1a8 100644
--- a/bench/PatchBench.cpp
+++ b/bench/PatchBench.cpp
@@ -4,12 +4,12 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkPaint.h"
-#include "SkPatchUtils.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkGradientShader.h"
+#include "src/utils/SkPatchUtils.h"
 
 /**
  * This bench measures the rendering time of the call SkCanvas::drawPatch with different types of
@@ -324,7 +324,7 @@
                                         PatchBench::kBoth_VertexMode); )
 
 //////////////////////////////////////////////
-#include "SkPatchUtils.h"
+#include "src/utils/SkPatchUtils.h"
 
 class PatchUtilsBench : public Benchmark {
     SkString    fName;
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index b065c0c..eb4d4a3 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -5,16 +5,16 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "SkTArray.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/private/SkTArray.h"
+#include "include/utils/SkRandom.h"
 
 enum Flags {
     kStroke_Flag = 1 << 0,
@@ -736,7 +736,7 @@
         SkScalar ry = SkMinScalar(rect.height(), yIn);
 
         SkRect arcRect;
-        arcRect.set(-rx, -ry, rx, ry);
+        arcRect.setLTRB(-rx, -ry, rx, ry);
         switch (startAngle) {
         case 0:
             arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom);
@@ -885,7 +885,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-#include "SkGeometry.h"
+#include "src/core/SkGeometry.h"
 
 class ConicBench_Chop : public Benchmark {
 protected:
@@ -1175,8 +1175,8 @@
 DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); )
 DEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); )
 
-#include "SkPathOps.h"
-#include "SkPathPriv.h"
+#include "include/pathops/SkPathOps.h"
+#include "src/core/SkPathPriv.h"
 
 DEF_BENCH( return new TightBoundsBench([](const SkPath& path){ return path.computeTightBounds();},
                                        "priv"); )
diff --git a/bench/PathIterBench.cpp b/bench/PathIterBench.cpp
index cf93b5d..d5f3d38 100644
--- a/bench/PathIterBench.cpp
+++ b/bench/PathIterBench.cpp
@@ -4,15 +4,25 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkPathPriv.h"
+
+enum class PathIterType {
+    kIter,
+    kRaw,
+    kEdge,
+};
+const char* gPathIterNames[] = {
+    "iter", "raw", "edge"
+};
 
 static int rand_pts(SkRandom& rand, SkPoint pts[4]) {
     int n = rand.nextU() & 3;
@@ -26,14 +36,16 @@
 }
 
 class PathIterBench : public Benchmark {
-    SkString    fName;
-    SkPath      fPath;
-    bool        fRaw;
+    SkString        fName;
+    SkPath          fPath;
+    PathIterType    fType;
+
+    int fVerbInc = 0;
+    SkScalar fXInc = 0, fYInc = 0;
 
 public:
-    PathIterBench(bool raw)  {
-        fName.printf("pathiter_%s", raw ? "raw" : "consume");
-        fRaw = raw;
+    PathIterBench(PathIterType t) : fType(t) {
+        fName.printf("pathiter_%s", gPathIterNames[static_cast<unsigned>(t)]);
 
         SkRandom rand;
         for (int i = 0; i < 1000; ++i) {
@@ -66,22 +78,41 @@
     }
 
     void onDraw(int loops, SkCanvas*) override {
-        if (fRaw) {
-            for (int i = 0; i < loops; ++i) {
-                SkPath::RawIter iter(fPath);
-                SkPath::Verb verb;
-                SkPoint      pts[4];
+        // Need to do *something* with the results, so the compile doesn't elide
+        // away the code we want to time.
+        auto handle = [this](int verb, const SkPoint pts[]) {
+            fVerbInc += verb;
+            fXInc += pts[0].fX;
+            fYInc += pts[0].fY;
+        };
 
-                while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { }
-            }
-        } else {
-            for (int i = 0; i < loops; ++i) {
-                SkPath::Iter iter(fPath, false);
-                SkPath::Verb verb;
-                SkPoint      pts[4];
-
-                while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { }
-            }
+        SkPath::Verb verb;
+        SkPoint      pts[4];
+        switch (fType) {
+            case PathIterType::kIter:
+                for (int i = 0; i < loops; ++i) {
+                    SkPath::Iter iter(fPath, true);
+                    while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
+                        handle(verb, pts);
+                    }
+                }
+                break;
+            case PathIterType::kRaw:
+                for (int i = 0; i < loops; ++i) {
+                    SkPath::RawIter iter(fPath);
+                    while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
+                        handle(verb, pts);
+                    }
+                }
+                break;
+            case PathIterType::kEdge:
+                for (int i = 0; i < loops; ++i) {
+                    SkPathEdgeIter iter(fPath);
+                    while (auto r = iter.next()) {
+                        handle((int)r.fEdge, r.fPts);
+                    }
+                }
+                break;
         }
     }
 
@@ -91,5 +122,6 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-DEF_BENCH( return new PathIterBench(false); )
-DEF_BENCH( return new PathIterBench(true); )
+DEF_BENCH( return new PathIterBench(PathIterType::kIter); )
+DEF_BENCH( return new PathIterBench(PathIterType::kRaw); )
+DEF_BENCH( return new PathIterBench(PathIterType::kEdge); )
diff --git a/bench/PathOpsBench.cpp b/bench/PathOpsBench.cpp
index 4d2e9e1..c7df558 100644
--- a/bench/PathOpsBench.cpp
+++ b/bench/PathOpsBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkPath.h"
-#include "SkPathOps.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "SkTArray.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/pathops/SkPathOps.h"
+#include "include/private/SkTArray.h"
+#include "include/utils/SkRandom.h"
 
 class PathOpsBench : public Benchmark {
     SkString    fName;
diff --git a/bench/PathTextBench.cpp b/bench/PathTextBench.cpp
index a9b845d..9f51f38 100644
--- a/bench/PathTextBench.cpp
+++ b/bench/PathTextBench.cpp
@@ -5,14 +5,15 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkStrike.h"
-#include "SkStrikeCache.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkStrike.h"
+#include "src/core/SkStrikeCache.h"
+#include "src/core/SkStrikeSpec.h"
+#include "tools/ToolUtils.h"
 
 static constexpr int kScreenWidth = 1500;
 static constexpr int kScreenHeight = 1500;
@@ -46,7 +47,8 @@
 
     void onDelayedSetup() override {
         SkFont defaultFont;
-        auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(defaultFont);
+        SkStrikeSpec strikeSpec = SkStrikeSpec::MakeWithNoDevice(defaultFont);
+        auto cache = strikeSpec.findOrCreateExclusiveStrike();
         for (int i = 0; i < kNumGlyphs; ++i) {
             SkPackedGlyphID id(defaultFont.unicharToGlyph(kGlyphs[i]));
             sk_ignore_unused_variable(cache->getScalerContext()->getPath(id, &fGlyphs[i]));
diff --git a/bench/PerlinNoiseBench.cpp b/bench/PerlinNoiseBench.cpp
index 802c5be0..1d246b6 100644
--- a/bench/PerlinNoiseBench.cpp
+++ b/bench/PerlinNoiseBench.cpp
@@ -4,10 +4,10 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPerlinNoiseShader.h"
-#include "SkShader.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkShader.h"
+#include "include/effects/SkPerlinNoiseShader.h"
 
 class PerlinNoiseBench : public Benchmark {
     SkISize fSize;
diff --git a/bench/PictureNestingBench.cpp b/bench/PictureNestingBench.cpp
index abe8936..fab48f3 100644
--- a/bench/PictureNestingBench.cpp
+++ b/bench/PictureNestingBench.cpp
@@ -5,14 +5,14 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkColor.h"
-#include "SkNullCanvas.h"
-#include "SkPaint.h"
-#include "SkPicture.h"
-#include "SkPictureRecorder.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColor.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPicture.h"
+#include "include/core/SkPictureRecorder.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkNullCanvas.h"
 
 class PictureNesting : public Benchmark {
 public:
diff --git a/bench/PictureOverheadBench.cpp b/bench/PictureOverheadBench.cpp
index 8489ab8..4fca2f4 100644
--- a/bench/PictureOverheadBench.cpp
+++ b/bench/PictureOverheadBench.cpp
@@ -5,112 +5,38 @@
  * found in the LICENSE file.
  */
 
-// A benchmark designed to isolate the constant overheads of picture recording.
-// We record an empty picture and a picture with one draw op to force memory allocation.
-
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkLiteDL.h"
-#include "SkLiteRecorder.h"
-#include "SkPictureRecorder.h"
-
-template <int kDraws, bool kLite>
-struct PictureOverheadBench : public Benchmark {
-    PictureOverheadBench() {
-        fName.appendf("picture_overhead_%d%s", kDraws, kLite ? "_lite" : "");
-    }
-    const char* onGetName() override { return fName.c_str(); }
-    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
-
-    void onDraw(int loops, SkCanvas*) override {
-        SkLiteRecorder lite;
-        SkPictureRecorder rec;
-
-        SkIRect iBounds = {0,0, 2000,3000};
-        SkRect bounds = SkRect::Make(iBounds);
-
-        for (int i = 0; i < loops; i++) {
-            SkLiteDL liteDL;
-            SkCanvas* canvas;
-            if (kLite) {
-                lite.reset(&liteDL, iBounds);
-                canvas = &lite;
-            } else {
-                rec.beginRecording(bounds);
-                canvas = rec.getRecordingCanvas();
-            }
-
-            for (int i = 0; i < kDraws; i++) {
-                canvas->drawRect({10,10, 1000, 1000}, SkPaint{});
-            }
-
-            if (!kLite) {
-                (void)rec.finishRecordingAsPicture();
-            }
-        }
-    }
-
-    SkString fName;
-};
-
-DEF_BENCH(return (new PictureOverheadBench<0, false>);)
-DEF_BENCH(return (new PictureOverheadBench<1, false>);)
-DEF_BENCH(return (new PictureOverheadBench<2, false>);)
-DEF_BENCH(return (new PictureOverheadBench<10,false>);)
-DEF_BENCH(return (new PictureOverheadBench<0,  true>);)
-DEF_BENCH(return (new PictureOverheadBench<1,  true>);)
-DEF_BENCH(return (new PictureOverheadBench<2,  true>);)
-DEF_BENCH(return (new PictureOverheadBench<10, true>);)
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPictureRecorder.h"
+#include "include/core/SkRRect.h"
 
 class ClipOverheadRecordingBench : public Benchmark {
-    SkString fName;
-    const bool fDoLite;
-
 public:
-    ClipOverheadRecordingBench(bool doLite) : fDoLite(doLite) {
-        fName.printf("clip_overhead_recording_%s", doLite ? "lite" : "std");
-    }
+    ClipOverheadRecordingBench() {}
 
-protected:
-    const char* onGetName() override { return fName.c_str(); }
+private:
+    const char* onGetName() override { return "clip_overhead_recording"; }
     bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
 
     void onDraw(int loops, SkCanvas*) override {
-        SkLiteRecorder lite;
         SkPictureRecorder rec;
 
-        SkIRect iBounds = {0,0, 2000,3000};
-        SkRect bounds = SkRect::Make(iBounds);
-
         for (int i = 0; i < loops; i++) {
-            SkLiteDL liteDL;
-            SkCanvas* canvas;
-            if (fDoLite) {
-                lite.reset(&liteDL, iBounds);
-                canvas = &lite;
-            } else {
-                rec.beginRecording(bounds);
-                canvas = rec.getRecordingCanvas();
-            }
+            SkCanvas* canvas = rec.beginRecording({0,0, 2000,3000});
 
             SkPaint paint;
             SkRRect rrect;
             rrect.setOval({0, 0, 1000, 1000});
             for (int i = 0; i < 1000; i++) {
                 canvas->save();
-                canvas->translate(10, 10);
-                canvas->clipRect({10,10, 1000, 1000});
-                canvas->drawRRect(rrect, paint);
+                    canvas->translate(10, 10);
+                    canvas->clipRect({10,10, 1000, 1000});
+                    canvas->drawRRect(rrect, paint);
                 canvas->restore();
             }
 
-            if (!fDoLite) {
-                (void)rec.finishRecordingAsPicture();
-            }
+            (void)rec.finishRecordingAsPicture();
         }
     }
 };
-DEF_BENCH( return new ClipOverheadRecordingBench(true); )
-DEF_BENCH( return new ClipOverheadRecordingBench(false); )
+DEF_BENCH( return new ClipOverheadRecordingBench; )
diff --git a/bench/PicturePlaybackBench.cpp b/bench/PicturePlaybackBench.cpp
index 40dde4b..461cd8d 100644
--- a/bench/PicturePlaybackBench.cpp
+++ b/bench/PicturePlaybackBench.cpp
@@ -4,16 +4,16 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkColor.h"
-#include "SkPaint.h"
-#include "SkPicture.h"
-#include "SkPictureRecorder.h"
-#include "SkPoint.h"
-#include "SkRandom.h"
-#include "SkRect.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColor.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPicture.h"
+#include "include/core/SkPictureRecorder.h"
+#include "include/core/SkPoint.h"
+#include "include/core/SkRect.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
 
 // This is designed to emulate about 4 screens of textual content
 
diff --git a/bench/PolyUtilsBench.cpp b/bench/PolyUtilsBench.cpp
index 5cbff93..6e71a30 100644
--- a/bench/PolyUtilsBench.cpp
+++ b/bench/PolyUtilsBench.cpp
@@ -5,8 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkPolyUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkRect.h"
+#include "src/utils/SkPolyUtils.h"
 
 class PolyUtilsBench : public Benchmark {
 public:
@@ -70,9 +71,13 @@
             case Type::kOffsetSimple:
                 if (SkIsSimplePolygon(poly.begin(), poly.count())) {
                     SkTDArray<SkPoint> result;
+                    SkRect bounds;
+                    bounds.setBounds(poly.begin(), poly.count());
                     for (int i = 0; i < loops; i++) {
-                        (void)SkOffsetSimplePolygon(poly.begin(), poly.count(), 10, &result);
-                        (void)SkOffsetSimplePolygon(poly.begin(), poly.count(), -10, &result);
+                        (void)SkOffsetSimplePolygon(poly.begin(), poly.count(), bounds, 10,
+                                                    &result);
+                        (void)SkOffsetSimplePolygon(poly.begin(), poly.count(), bounds, -10,
+                                                    &result);
                     }
                 }
                 break;
diff --git a/bench/PremulAndUnpremulAlphaOpsBench.cpp b/bench/PremulAndUnpremulAlphaOpsBench.cpp
index 22467ec..b67098c 100644
--- a/bench/PremulAndUnpremulAlphaOpsBench.cpp
+++ b/bench/PremulAndUnpremulAlphaOpsBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkString.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkString.h"
+#include "tools/ToolUtils.h"
 
 class PremulAndUnpremulAlphaOpsBench : public Benchmark {
     enum {
diff --git a/bench/QuickRejectBench.cpp b/bench/QuickRejectBench.cpp
index 1feade4..daad4d4 100644
--- a/bench/QuickRejectBench.cpp
+++ b/bench/QuickRejectBench.cpp
@@ -5,9 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkRandom.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/utils/SkRandom.h"
 
 class QuickRejectBench : public Benchmark {
     enum { N = 1000000 };
diff --git a/bench/RTreeBench.cpp b/bench/RTreeBench.cpp
index e484050..95fd89d 100644
--- a/bench/RTreeBench.cpp
+++ b/bench/RTreeBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkRTree.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkRTree.h"
 
 // confine rectangles to a smallish area, so queries generally hit something, and overlap occurs:
 static const SkScalar GENERATE_EXTENTS = 1000.0f;
diff --git a/bench/ReadPixBench.cpp b/bench/ReadPixBench.cpp
index 35e536d..c940a9e 100644
--- a/bench/ReadPixBench.cpp
+++ b/bench/ReadPixBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorSpace.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorSpace.h"
 
 // Time variants of read-pixels
 //  [ colortype ][ alphatype ][ colorspace ]
@@ -35,7 +35,7 @@
 
         SkISize size = canvas->getBaseLayerSize();
 
-        auto info = SkImageInfo::Make(size.width(), size.height(), fCT, fAT, fCS);
+        auto info = SkImageInfo::Make(size, fCT, fAT, fCS);
         SkBitmap bitmap;
         bitmap.allocPixels(info);
 
@@ -62,8 +62,8 @@
 DEF_BENCH( return new ReadPixBench(kBGRA_8888_SkColorType, kUnpremul_SkAlphaType, SkColorSpace::MakeSRGB()); )
 
 ////////////////////////////////////////////////////////////////////////////////
-#include "SkBitmap.h"
-#include "SkPixmapPriv.h"
+#include "include/core/SkBitmap.h"
+#include "src/core/SkPixmapPriv.h"
 
 class PixmapOrientBench : public Benchmark {
 public:
@@ -74,7 +74,7 @@
         const SkImageInfo info = SkImageInfo::MakeN32Premul(2048, 1024);
         fSrc.allocPixels(info);
         fSrc.eraseColor(SK_ColorBLACK);
-        fDst.allocPixels(info.makeWH(info.height(), info.width()));
+        fDst.allocPixels(info.makeDimensions(info.dimensions()));
     }
 
     const char* onGetName() override {
diff --git a/bench/RecordingBench.cpp b/bench/RecordingBench.cpp
index 45a9128..a6ca117 100644
--- a/bench/RecordingBench.cpp
+++ b/bench/RecordingBench.cpp
@@ -5,11 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "RecordingBench.h"
-#include "SkBBHFactory.h"
-#include "SkLiteDL.h"
-#include "SkLiteRecorder.h"
-#include "SkPictureRecorder.h"
+#include "bench/RecordingBench.h"
+#include "include/core/SkBBHFactory.h"
+#include "include/core/SkPictureRecorder.h"
 
 PictureCentricBench::PictureCentricBench(const char* name, const SkPicture* pic) : fName(name) {
     // Flatten the source picture in case it's trivially nested (useless for timing).
@@ -34,40 +32,22 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-RecordingBench::RecordingBench(const char* name, const SkPicture* pic, bool useBBH, bool lite)
+RecordingBench::RecordingBench(const char* name, const SkPicture* pic, bool useBBH)
     : INHERITED(name, pic)
     , fUseBBH(useBBH)
-{
-    // If we're recording into an SkLiteDL, also record _from_ one.
-    if (lite) {
-        fDL.reset(new SkLiteDL());
-        SkLiteRecorder r;
-        r.reset(fDL.get(), fSrc->cullRect().roundOut());
-        fSrc->playback(&r);
-    }
-}
+{}
 
 void RecordingBench::onDraw(int loops, SkCanvas*) {
-    if (fDL) {
-        SkLiteRecorder rec;
-        while (loops --> 0) {
-            SkLiteDL dl;
-            rec.reset(&dl, fSrc->cullRect().roundOut());
-            fDL->draw(&rec);
-        }
-
-    } else {
-        SkRTreeFactory factory;
-        SkPictureRecorder recorder;
-        while (loops --> 0) {
-            fSrc->playback(recorder.beginRecording(fSrc->cullRect(), fUseBBH ? &factory : nullptr));
-            (void)recorder.finishRecordingAsPicture();
-        }
+    SkRTreeFactory factory;
+    SkPictureRecorder recorder;
+    while (loops --> 0) {
+        fSrc->playback(recorder.beginRecording(fSrc->cullRect(), fUseBBH ? &factory : nullptr));
+        (void)recorder.finishRecordingAsPicture();
     }
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-#include "SkSerialProcs.h"
+#include "include/core/SkSerialProcs.h"
 
 DeserializePictureBench::DeserializePictureBench(const char* name, sk_sp<SkData> data)
     : fName(name)
diff --git a/bench/RecordingBench.h b/bench/RecordingBench.h
index 56a08e5..6a61e66 100644
--- a/bench/RecordingBench.h
+++ b/bench/RecordingBench.h
@@ -8,9 +8,8 @@
 #ifndef RecordingBench_DEFINED
 #define RecordingBench_DEFINED
 
-#include "Benchmark.h"
-#include "SkPicture.h"
-#include "SkLiteDL.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkPicture.h"
 
 class PictureCentricBench : public Benchmark {
 public:
@@ -30,13 +29,12 @@
 
 class RecordingBench : public PictureCentricBench {
 public:
-    RecordingBench(const char* name, const SkPicture*, bool useBBH, bool lite);
+    RecordingBench(const char* name, const SkPicture*, bool useBBH);
 
 protected:
     void onDraw(int loops, SkCanvas*) override;
 
 private:
-    std::unique_ptr<SkLiteDL> fDL;
     bool fUseBBH;
 
     typedef PictureCentricBench INHERITED;
diff --git a/bench/RectBench.cpp b/bench/RectBench.cpp
index 0c30dc0..7f9e0ce 100644
--- a/bench/RectBench.cpp
+++ b/bench/RectBench.cpp
@@ -5,15 +5,15 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "CommandLineFlags.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkGradientShader.h"
+#include "include/utils/SkRandom.h"
+#include "tools/flags/CommandLineFlags.h"
 
 static DEFINE_double(strokeWidth, -1.0, "If set, use this stroke width in RectBench.");
 
@@ -72,8 +72,8 @@
             h >>= fShift;
             x -= w/2;
             y -= h/2;
-            fRects[i].set(SkIntToScalar(x), SkIntToScalar(y),
-                          SkIntToScalar(x+w), SkIntToScalar(y+h));
+            fRects[i].setXYWH(SkIntToScalar(x), SkIntToScalar(y),
+                              SkIntToScalar(w), SkIntToScalar(h));
             fRects[i].offset(offset, offset);
             fColors[i] = rand.nextU() | 0xFF808080;
         }
diff --git a/bench/RectanizerBench.cpp b/bench/RectanizerBench.cpp
index c5ec21d..224bd56 100644
--- a/bench/RectanizerBench.cpp
+++ b/bench/RectanizerBench.cpp
@@ -5,13 +5,13 @@
 * found in the LICENSE file.
 */
 
-#include "Benchmark.h"
-#include "SkRandom.h"
-#include "SkSize.h"
-#include "SkTDArray.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkSize.h"
+#include "include/private/SkTDArray.h"
+#include "include/utils/SkRandom.h"
 
-#include "GrRectanizer_pow2.h"
-#include "GrRectanizer_skyline.h"
+#include "src/gpu/GrRectanizer_pow2.h"
+#include "src/gpu/GrRectanizer_skyline.h"
 
 /**
  * This bench exercises Ganesh' GrRectanizer classes. It exercises the following
diff --git a/bench/RectoriBench.cpp b/bench/RectoriBench.cpp
deleted file mode 100644
index c0d2155..0000000
--- a/bench/RectoriBench.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2013 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkLayerDrawLooper.h"
-#include "SkMaskFilter.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-
-// This bench replicates a problematic use case of a draw looper used
-// to create an inner blurred rect
-class RectoriBench : public Benchmark {
-public:
-    RectoriBench() {}
-
-protected:
-
-    const char* onGetName() override {
-        return "rectori";
-    }
-
-    void onDraw(int loops, SkCanvas* canvas) override {
-        SkRandom Random;
-
-        for (int i = 0; i < loops; i++) {
-            SkScalar blurSigma = Random.nextRangeScalar(1.5f, 25.0f);
-            SkScalar size = Random.nextRangeScalar(20*blurSigma, 50*blurSigma);
-
-            SkScalar x = Random.nextRangeScalar(0.0f, W - size);
-            SkScalar y = Random.nextRangeScalar(0.0f, H - size);
-
-            SkRect inner = { x, y, x + size, y + size };
-
-            SkRect outer(inner);
-            // outer is always outset either 2x or 4x the blur radius (we go with 2x)
-            outer.outset(2*blurSigma, 2*blurSigma);
-
-            SkPath p;
-
-            p.addRect(outer);
-            p.addRect(inner);
-            p.setFillType(SkPath::kEvenOdd_FillType);
-
-            // This will be used to translate the normal draw outside the
-            // clip rect and translate the blurred version back inside
-            SkScalar translate = 2.0f * size;
-
-            SkPaint paint;
-            paint.setLooper(this->createLooper(-translate, blurSigma));
-            paint.setColor(0xff000000 | Random.nextU());
-            paint.setAntiAlias(true);
-
-            canvas->save();
-            // clip always equals inner rect so we get the inside blur
-            canvas->clipRect(inner);
-            canvas->translate(translate, 0);
-            canvas->drawPath(p, paint);
-            canvas->restore();
-        }
-    }
-
-private:
-    enum {
-        W = 640,
-        H = 480,
-    };
-
-    sk_sp<SkDrawLooper> createLooper(SkScalar xOff, SkScalar sigma) {
-        SkLayerDrawLooper::Builder looperBuilder;
-
-        //-----------------------------------------------
-        SkLayerDrawLooper::LayerInfo info;
-
-        // TODO: add a color filter to better match what is seen in the wild
-        info.fPaintBits = /* SkLayerDrawLooper::kColorFilter_Bit |*/
-                          SkLayerDrawLooper::kMaskFilter_Bit;
-        info.fColorMode = SkBlendMode::kDst;
-        info.fOffset.set(xOff, 0);
-        info.fPostTranslate = false;
-
-        SkPaint* paint = looperBuilder.addLayer(info);
-
-        paint->setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, sigma));
-
-        //-----------------------------------------------
-        info.fPaintBits = 0;
-        info.fOffset.set(0, 0);
-
-        paint = looperBuilder.addLayer(info);
-        return looperBuilder.detach();
-    }
-
-    typedef Benchmark INHERITED;
-};
-
-DEF_BENCH(return new RectoriBench();)
diff --git a/bench/RefCntBench.cpp b/bench/RefCntBench.cpp
index 39b3a73..af4822a 100644
--- a/bench/RefCntBench.cpp
+++ b/bench/RefCntBench.cpp
@@ -4,9 +4,9 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkRefCnt.h"
-#include "SkWeakRefCnt.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkRefCnt.h"
+#include "include/private/SkWeakRefCnt.h"
 #include <memory>
 #include <new>
 
diff --git a/bench/RegionBench.cpp b/bench/RegionBench.cpp
index f73a888..b6ad54b 100644
--- a/bench/RegionBench.cpp
+++ b/bench/RegionBench.cpp
@@ -4,10 +4,10 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkRandom.h"
-#include "SkRegion.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkRegion.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
 
 static bool union_proc(SkRegion& a, SkRegion& b) {
     SkRegion result;
diff --git a/bench/RegionContainBench.cpp b/bench/RegionContainBench.cpp
index 961cbe3..d825320 100644
--- a/bench/RegionContainBench.cpp
+++ b/bench/RegionContainBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkRandom.h"
-#include "SkRegion.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkRegion.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
 
 static bool sect_proc(SkRegion& a, SkRegion& b) {
     SkRegion result;
@@ -42,7 +42,7 @@
             fA.op(randrect(rand, i), SkRegion::kXOR_Op);
         }
 
-        fB.setRect(0, 0, H, W);
+        fB.setRect({0, 0, H, W});
     }
 
     bool isSuitableFor(Backend backend) override {
diff --git a/bench/RepeatTileBench.cpp b/bench/RepeatTileBench.cpp
index adec4f4..84c52b7 100644
--- a/bench/RepeatTileBench.cpp
+++ b/bench/RepeatTileBench.cpp
@@ -4,14 +4,14 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkColorPriv.h"
-#include "SkPaint.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "tools/ToolUtils.h"
 
 static void draw_into_bitmap(const SkBitmap& bm) {
     const int w = bm.width();
@@ -25,7 +25,7 @@
                       SkIntToScalar(SkMin32(w, h))*3/8, p);
 
     SkRect r;
-    r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
+    r.setWH(SkIntToScalar(w), SkIntToScalar(h));
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SkIntToScalar(4));
     p.setColor(SK_ColorBLUE);
diff --git a/bench/ResultsWriter.h b/bench/ResultsWriter.h
index 41f3ae3..bb8ff3d 100644
--- a/bench/ResultsWriter.h
+++ b/bench/ResultsWriter.h
@@ -10,9 +10,10 @@
 #ifndef SkResultsWriter_DEFINED
 #define SkResultsWriter_DEFINED
 
-#include "SkJSONWriter.h"
-#include "SkString.h"
-#include "SkTypes.h"
+#include "include/core/SkString.h"
+#include "include/core/SkTypes.h"
+#include "src/core/SkOSFile.h"
+#include "src/utils/SkJSONWriter.h"
 
 /**
  NanoJSONResultsWriter helps nanobench writes the test results out in the following format:
@@ -54,4 +55,60 @@
     }
 };
 
+/**
+ NanoFILEAppendAndCloseStream: re-open the file, append the data, then close on every write() call.
+
+ The purpose of this class is to not keep the file handle open between JSON flushes. SkJSONWriter
+ uses a 32k in-memory cache already, so it only flushes occasionally and is well equipped for a
+ steam like this.
+
+ See: https://b.corp.google.com/issues/143074513
+*/
+class NanoFILEAppendAndCloseStream : public SkWStream {
+public:
+    NanoFILEAppendAndCloseStream(const char* filePath) : fFilePath(filePath) {
+        // Open the file as "write" to ensure it exists and clear any contents before we begin
+        // appending.
+        FILE* file = sk_fopen(fFilePath.c_str(), kWrite_SkFILE_Flag);
+        if (!file) {
+            SkDebugf("Failed to open file %s for write.\n", fFilePath.c_str());
+            fFilePath.reset();
+            return;
+        }
+        sk_fclose(file);
+    }
+
+    size_t bytesWritten() const override { return fBytesWritten; }
+
+    bool write(const void* buffer, size_t size) override {
+        if (fFilePath.isEmpty()) {
+            return false;
+        }
+
+        FILE* file = sk_fopen(fFilePath.c_str(), kAppend_SkFILE_Flag);
+        if (!file) {
+            SkDebugf("Failed to open file %s for append.\n", fFilePath.c_str());
+            return false;
+        }
+
+        size_t bytesWritten = sk_fwrite(buffer, size, file);
+        fBytesWritten += bytesWritten;
+        sk_fclose(file);
+
+        if (bytesWritten != size) {
+            SkDebugf("NanoFILEAppendAndCloseStream failed writing %d bytes (wrote %d instead)\n",
+                     size, bytesWritten);
+            return false;
+        }
+
+        return true;
+    }
+
+    void flush() override {}
+
+private:
+    SkString fFilePath;
+    size_t fBytesWritten = 0;
+};
+
 #endif
diff --git a/bench/RotatedRectBench.cpp b/bench/RotatedRectBench.cpp
index db4a792..7d184e2 100644
--- a/bench/RotatedRectBench.cpp
+++ b/bench/RotatedRectBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBlendModePriv.h"
-#include "SkCanvas.h"
-#include "SkGradientShader.h"
-#include "SkPaint.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/effects/SkGradientShader.h"
+#include "src/core/SkBlendModePriv.h"
 
 #include <ctype.h>
 
@@ -40,7 +40,6 @@
             return SK_ColorWHITE;
     }
     SK_ABORT("Shouldn't reach here.");
-    return 0;
 }
 
 static inline SkColor advance_color(SkColor old, ColorType ct, int step) {
@@ -60,7 +59,6 @@
             SK_ABORT("Can't get here");
     }
     SK_ABORT("Shouldn't reach here.");
-    return 0;
 }
 
 static SkString to_lower(const char* str) {
diff --git a/bench/SKPAnimationBench.cpp b/bench/SKPAnimationBench.cpp
index efa2c76..ee25f19 100644
--- a/bench/SKPAnimationBench.cpp
+++ b/bench/SKPAnimationBench.cpp
@@ -5,15 +5,15 @@
  * found in the LICENSE file.
  */
 
-#include "SKPAnimationBench.h"
-#include "CommandLineFlags.h"
-#include "SkMultiPictureDraw.h"
-#include "SkSurface.h"
+#include "bench/SKPAnimationBench.h"
+#include "include/core/SkMultiPictureDraw.h"
+#include "include/core/SkSurface.h"
+#include "tools/flags/CommandLineFlags.h"
 
 SKPAnimationBench::SKPAnimationBench(const char* name, const SkPicture* pic, const SkIRect& clip,
-                                     Animation* animation, bool doLooping)
+                                     sk_sp<Animation> animation, bool doLooping)
     : INHERITED(name, pic, clip, 1.0, false, doLooping)
-    , fAnimation(SkRef(animation)) {
+    , fAnimation(std::move(animation)) {
     fUniqueName.printf("%s_%s", name, fAnimation->getTag());
 }
 
@@ -25,16 +25,13 @@
     INHERITED::onPerCanvasPreDraw(canvas);
     fDevBounds = canvas->getDeviceClipBounds();
     SkAssertResult(!fDevBounds.isEmpty());
-    fAnimationTimer.start();
 }
 
 void SKPAnimationBench::drawPicture() {
-    fAnimationTimer.end();
-
     for (int j = 0; j < this->tileRects().count(); ++j) {
         SkMatrix trans = SkMatrix::MakeTrans(-1.f * this->tileRects()[j].fLeft,
                                              -1.f * this->tileRects()[j].fTop);
-        fAnimation->preConcatFrameMatrix(fAnimationTimer.fWall, fDevBounds, &trans);
+        fAnimation->preConcatFrameMatrix(fAnimationTime.nextRangeF(0, 1000), fDevBounds, &trans);
         this->surfaces()[j]->getCanvas()->drawPicture(this->picture(), &trans, nullptr);
     }
 
@@ -70,7 +67,7 @@
     double   fZoomPeriodMs;
 };
 
-SKPAnimationBench::Animation* SKPAnimationBench::CreateZoomAnimation(SkScalar zoomMax,
-                                                                     double zoomPeriodMs) {
-    return new ZoomAnimation(zoomMax, zoomPeriodMs);
+sk_sp<SKPAnimationBench::Animation> SKPAnimationBench::MakeZoomAnimation(SkScalar zoomMax,
+                                                                         double zoomPeriodMs) {
+    return sk_make_sp<ZoomAnimation>(zoomMax, zoomPeriodMs);
 }
diff --git a/bench/SKPAnimationBench.h b/bench/SKPAnimationBench.h
index b7a4ae1..153f1fd 100644
--- a/bench/SKPAnimationBench.h
+++ b/bench/SKPAnimationBench.h
@@ -8,8 +8,9 @@
 #ifndef SKPAnimationBench_DEFINED
 #define SKPAnimationBench_DEFINED
 
-#include "SKPBench.h"
-#include "Timer.h"
+#include "bench/SKPBench.h"
+#include "include/utils/SkRandom.h"
+#include "tools/timer/Timer.h"
 
 /**
  * Runs an SkPicture as a benchmark by repeatedly drawing it, first centering the picture and
@@ -25,10 +26,10 @@
         virtual ~Animation() {}
     };
 
-    SKPAnimationBench(const char* name, const SkPicture*, const SkIRect& devClip, Animation*,
+    SKPAnimationBench(const char* name, const SkPicture*, const SkIRect& devClip, sk_sp<Animation>,
                       bool doLooping);
 
-    static Animation* CreateZoomAnimation(SkScalar zoomMax, double zoomPeriodMs);
+    static sk_sp<Animation> MakeZoomAnimation(SkScalar zoomMax, double zoomPeriodMs);
 
 protected:
     const char* onGetUniqueName() override;
@@ -41,7 +42,7 @@
 
 private:
     sk_sp<Animation> fAnimation;
-    WallTimer        fAnimationTimer;
+    SkRandom         fAnimationTime;
     SkString         fUniqueName;
     SkIRect          fDevBounds;
 
diff --git a/bench/SKPBench.cpp b/bench/SKPBench.cpp
index 7617fe3..8543174 100644
--- a/bench/SKPBench.cpp
+++ b/bench/SKPBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "SKPBench.h"
-#include "CommandLineFlags.h"
-#include "SkMultiPictureDraw.h"
-#include "SkSurface.h"
+#include "bench/SKPBench.h"
+#include "include/core/SkMultiPictureDraw.h"
+#include "include/core/SkSurface.h"
+#include "tools/flags/CommandLineFlags.h"
 
-#include "GrContext.h"
-#include "GrContextPriv.h"
+#include "include/gpu/GrContext.h"
+#include "src/gpu/GrContextPriv.h"
 
 // These CPU tile sizes are not good per se, but they are similar to what Chrome uses.
 static DEFINE_int(CPUbenchTileW, 256, "Tile width  used for CPU SKP playback.");
@@ -150,7 +150,7 @@
     }
 }
 
-#include "GrGpu.h"
+#include "src/gpu/GrGpu.h"
 static void draw_pic_for_stats(SkCanvas* canvas, GrContext* context, const SkPicture* picture,
                                SkTArray<SkString>* keys, SkTArray<double>* values) {
     context->priv().resetGpuStats();
diff --git a/bench/SKPBench.h b/bench/SKPBench.h
index 6756c60..db0c3b3 100644
--- a/bench/SKPBench.h
+++ b/bench/SKPBench.h
@@ -8,10 +8,10 @@
 #ifndef SKPBench_DEFINED
 #define SKPBench_DEFINED
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPicture.h"
-#include "SkTDArray.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPicture.h"
+#include "include/private/SkTDArray.h"
 
 class SkSurface;
 
diff --git a/bench/ScalarBench.cpp b/bench/ScalarBench.cpp
index 9d3b0ec..714eecc 100644
--- a/bench/ScalarBench.cpp
+++ b/bench/ScalarBench.cpp
@@ -4,11 +4,11 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkFloatBits.h"
-#include "SkRandom.h"
-#include "SkRect.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkRect.h"
+#include "include/core/SkString.h"
+#include "include/private/SkFloatBits.h"
+#include "include/utils/SkRandom.h"
 
 class ScalarBench : public Benchmark {
     SkString    fName;
@@ -152,7 +152,7 @@
         SkRect r;
         for (int i = 0; i < loops; ++i) {
             for (int i = 0; i < 1000; ++i) {
-                r.set(fPts, PTS);
+                r.setBounds(fPts, PTS);
             }
         }
     }
diff --git a/bench/ShaderMaskFilterBench.cpp b/bench/ShaderMaskFilterBench.cpp
index 164d5dd..0e12858 100644
--- a/bench/ShaderMaskFilterBench.cpp
+++ b/bench/ShaderMaskFilterBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkPictureRecorder.h"
-#include "SkPictureShader.h"
-#include "SkShaderMaskFilter.h"
-#include "SkSurface.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPictureRecorder.h"
+#include "include/core/SkSurface.h"
+#include "include/effects/SkShaderMaskFilter.h"
+#include "src/shaders/SkPictureShader.h"
 
 static sk_sp<SkShader> make_bitmap_shader() {
     SkPaint p;
diff --git a/bench/ShadowBench.cpp b/bench/ShadowBench.cpp
index 072af66..13c1050 100644
--- a/bench/ShadowBench.cpp
+++ b/bench/ShadowBench.cpp
@@ -4,12 +4,12 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file.
  */
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkDrawShadowInfo.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkShadowUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/utils/SkShadowUtils.h"
+#include "src/core/SkDrawShadowInfo.h"
 
 class ShadowBench : public Benchmark {
 // Draws a set of shadowed rrects filling the canvas, in various modes:
diff --git a/bench/ShaperBench.cpp b/bench/ShaperBench.cpp
new file mode 100644
index 0000000..df258a7
--- /dev/null
+++ b/bench/ShaperBench.cpp
@@ -0,0 +1,77 @@
+// Copyright 2019 Google LLC.
+// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+
+#include "bench/Benchmark.h"
+
+#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3)
+
+#include "modules/skshaper/include/SkShaper.h"
+#include "tools/Resources.h"
+
+#include <cfloat>
+
+namespace {
+struct ShaperBench : public Benchmark {
+    ShaperBench(const char* r, const char* n) : fResource(r), fName(n) {}
+    std::unique_ptr<SkShaper> fShaper;
+    sk_sp<SkData> fData;
+    const char* fResource;
+    const char* fName;
+    const char* onGetName() override { return fName; }
+    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
+    void onDelayedSetup() override {
+        fShaper = SkShaper::Make();
+        fData = GetResourceAsData(fResource);
+    }
+    void onDraw(int loops, SkCanvas*) override {
+        if (!fData || !fShaper) { return; }
+        SkFont font;
+        const char* text = (const char*)fData->data();
+        size_t len = fData->size();
+        while (loops-- > 0) {
+            SkTextBlobBuilderRunHandler rh(text, {0, 0});
+            fShaper->shape(text, len, font, true, FLT_MAX, &rh);
+            (void)rh.makeBlob();
+        }
+    }
+};
+}  // namespace
+
+#define SHAPER_BENCH(X) DEF_BENCH(return new ShaperBench("text/" #X ".txt", "shaper_" #X);)
+SHAPER_BENCH(arabic)
+SHAPER_BENCH(armenian)
+SHAPER_BENCH(balinese)
+SHAPER_BENCH(bengali)
+SHAPER_BENCH(buginese)
+SHAPER_BENCH(cherokee)
+SHAPER_BENCH(cyrillic)
+SHAPER_BENCH(devanagari)
+SHAPER_BENCH(emoji)
+SHAPER_BENCH(english)
+SHAPER_BENCH(ethiopic)
+SHAPER_BENCH(greek)
+SHAPER_BENCH(hangul)
+SHAPER_BENCH(han_simplified)
+SHAPER_BENCH(han_traditional)
+SHAPER_BENCH(hebrew)
+SHAPER_BENCH(javanese)
+SHAPER_BENCH(kana)
+SHAPER_BENCH(khmer)
+SHAPER_BENCH(lao)
+SHAPER_BENCH(mandaic)
+SHAPER_BENCH(myanmar)
+SHAPER_BENCH(newtailue)
+SHAPER_BENCH(nko)
+SHAPER_BENCH(sinhala)
+SHAPER_BENCH(sundanese)
+SHAPER_BENCH(syriac)
+SHAPER_BENCH(taitham)
+SHAPER_BENCH(tamil)
+SHAPER_BENCH(thaana)
+SHAPER_BENCH(thai)
+SHAPER_BENCH(tibetan)
+SHAPER_BENCH(tifnagh)
+SHAPER_BENCH(vai)
+#undef SHAPER_BENCH
+
+#endif  // !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && !defined(SK_BUILD_FOR_GOOGLE3)
diff --git a/bench/ShapesBench.cpp b/bench/ShapesBench.cpp
index 9c21f5c..9b4e99ff 100644
--- a/bench/ShapesBench.cpp
+++ b/bench/ShapesBench.cpp
@@ -5,13 +5,13 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "CommandLineFlags.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRRect.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkRRect.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "tools/flags/CommandLineFlags.h"
 
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/bench/Sk4fBench.cpp b/bench/Sk4fBench.cpp
index a932c29..7241259 100644
--- a/bench/Sk4fBench.cpp
+++ b/bench/Sk4fBench.cpp
@@ -5,9 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkColor.h"
-#include "SkNx.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkColor.h"
+#include "include/private/SkNx.h"
 
 // Writing into this array prevents the loops from being compiled away.
 static volatile float blackhole[4];
diff --git a/bench/SkGlyphCacheBench.cpp b/bench/SkGlyphCacheBench.cpp
index fca0381..725cedc 100644
--- a/bench/SkGlyphCacheBench.cpp
+++ b/bench/SkGlyphCacheBench.cpp
@@ -5,35 +5,37 @@
  * found in the LICENSE file.
  */
 
+#include "src/core/SkStrike.h"
 
-#include "SkStrike.h"
-
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkGraphics.h"
-#include "SkStrikeCache.h"
-#include "SkTaskGroup.h"
-#include "SkTypeface.h"
-#include "ToolUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkGraphics.h"
+#include "include/core/SkTypeface.h"
+#include "src/core/SkRemoteGlyphCache.h"
+#include "src/core/SkStrikeCache.h"
+#include "src/core/SkStrikeSpec.h"
+#include "src/core/SkTaskGroup.h"
+#include "src/core/SkTextBlobTrace.h"
+#include "tools/Resources.h"
+#include "tools/ToolUtils.h"
 
 static void do_font_stuff(SkFont* font) {
     SkPaint defaultPaint;
     for (SkScalar i = 8; i < 64; i++) {
         font->setSize(i);
-        auto cache = SkStrikeCache::FindOrCreateStrikeExclusive(
+        auto strikeSpec = SkStrikeSpec::MakeMask(
                 *font,  defaultPaint, SkSurfaceProps(0, kUnknown_SkPixelGeometry),
                 SkScalerContextFlags::kNone, SkMatrix::I());
-        uint16_t glyphs['z'];
+        SkPackedGlyphID glyphs['z'];
         for (int c = ' '; c < 'z'; c++) {
-            glyphs[c] = font->unicharToGlyph(c);
+            glyphs[c] = SkPackedGlyphID{font->unicharToGlyph(c)};
         }
+        constexpr size_t glyphCount = 'z' - ' ';
+        SkSpan<const SkPackedGlyphID> glyphIDs{&glyphs[SkTo<int>(' ')], glyphCount};
+        SkBulkGlyphMetricsAndImages images{strikeSpec};
         for (int lookups = 0; lookups < 10; lookups++) {
-            for (int c = ' '; c < 'z'; c++) {
-                const SkGlyph& g = cache->getGlyphIDMetrics(glyphs[c]);
-                cache->findImage(g);
-            }
+            (void)images.glyphs(glyphIDs);
         }
-
     }
 }
 
@@ -114,3 +116,140 @@
 DEF_BENCH( return new SkGlyphCacheBasic(32 * 1024 * 1024); )
 DEF_BENCH( return new SkGlyphCacheStressTest(256 * 1024); )
 DEF_BENCH( return new SkGlyphCacheStressTest(32 * 1024 * 1024); )
+
+namespace {
+class DiscardableManager : public SkStrikeServer::DiscardableHandleManager,
+                           public SkStrikeClient::DiscardableHandleManager {
+public:
+    DiscardableManager() { sk_bzero(&fCacheMissCount, sizeof(fCacheMissCount)); }
+    ~DiscardableManager() override = default;
+
+    // Server implementation.
+    SkDiscardableHandleId createHandle() override {
+        SkAutoMutexExclusive l(fMutex);
+
+        // Handles starts as locked.
+        fLockedHandles.add(++fNextHandleId);
+        return fNextHandleId;
+    }
+    bool lockHandle(SkDiscardableHandleId id) override {
+        SkAutoMutexExclusive l(fMutex);
+
+        if (id <= fLastDeletedHandleId) return false;
+        fLockedHandles.add(id);
+        return true;
+    }
+
+    // Client implementation.
+    bool deleteHandle(SkDiscardableHandleId id) override {
+        SkAutoMutexExclusive l(fMutex);
+
+        return id <= fLastDeletedHandleId;
+    }
+
+    void notifyCacheMiss(SkStrikeClient::CacheMissType type) override {
+        SkAutoMutexExclusive l(fMutex);
+
+        fCacheMissCount[type]++;
+    }
+    bool isHandleDeleted(SkDiscardableHandleId id) override {
+        SkAutoMutexExclusive l(fMutex);
+
+        return id <= fLastDeletedHandleId;
+    }
+
+    void unlockAll() {
+        SkAutoMutexExclusive l(fMutex);
+
+        fLockedHandles.reset();
+    }
+    void unlockAndDeleteAll() {
+        SkAutoMutexExclusive l(fMutex);
+
+        fLockedHandles.reset();
+        fLastDeletedHandleId = fNextHandleId;
+    }
+    const SkTHashSet<SkDiscardableHandleId>& lockedHandles() const {
+        SkAutoMutexExclusive l(fMutex);
+
+        return fLockedHandles;
+    }
+    SkDiscardableHandleId handleCount() {
+        SkAutoMutexExclusive l(fMutex);
+
+        return fNextHandleId;
+    }
+    int cacheMissCount(uint32_t type) {
+        SkAutoMutexExclusive l(fMutex);
+
+        return fCacheMissCount[type];
+    }
+    bool hasCacheMiss() const {
+        SkAutoMutexExclusive l(fMutex);
+
+        for (uint32_t i = 0; i <= SkStrikeClient::CacheMissType::kLast; ++i) {
+            if (fCacheMissCount[i] > 0) return true;
+        }
+        return false;
+    }
+    void resetCacheMissCounts() {
+        SkAutoMutexExclusive l(fMutex);
+        sk_bzero(&fCacheMissCount, sizeof(fCacheMissCount));
+    }
+
+private:
+    // The tests below run in parallel on multiple threads and use the same
+    // process global SkStrikeCache. So the implementation needs to be
+    // thread-safe.
+    mutable SkMutex fMutex;
+
+    SkDiscardableHandleId fNextHandleId = 0u;
+    SkDiscardableHandleId fLastDeletedHandleId = 0u;
+    SkTHashSet<SkDiscardableHandleId> fLockedHandles;
+    int fCacheMissCount[SkStrikeClient::CacheMissType::kLast + 1u];
+};
+
+class DiffCanvasBench : public Benchmark {
+    SkString fBenchName;
+    std::function<std::unique_ptr<SkStreamAsset>()> fDataProvider;
+    std::vector<SkTextBlobTrace::Record> fTrace;
+    sk_sp<DiscardableManager> fDiscardableManager;
+    SkTLazy<SkStrikeServer> fServer;
+
+    const char* onGetName() override { return fBenchName.c_str(); }
+
+    bool isSuitableFor(Backend b) override { return b == kNonRendering_Backend; }
+
+    void onDraw(int loops, SkCanvas*) override {
+        const SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType);
+        SkTextBlobCacheDiffCanvas canvas{1024, 1024, props, fServer.get()};
+        loops *= 100;
+        while (loops --> 0) {
+            for (const auto& record : fTrace) {
+                canvas.drawTextBlob(
+                        record.blob.get(), record.offset.x(), record.offset.y(),record.paint);
+            }
+        }
+    }
+
+    void onDelayedSetup() override {
+        auto stream = fDataProvider();
+        fDiscardableManager = sk_make_sp<DiscardableManager>();
+        fServer.init(fDiscardableManager.get());
+        fTrace = SkTextBlobTrace::CreateBlobTrace(stream.get());
+    }
+
+public:
+    DiffCanvasBench(SkString n, std::function<std::unique_ptr<SkStreamAsset>()> f)
+        : fBenchName(std::move(n)), fDataProvider(std::move(f)) {}
+};
+}  // namespace
+
+Benchmark* CreateDiffCanvasBench(
+        SkString name, std::function<std::unique_ptr<SkStreamAsset>()> dataSrc) {
+    return new DiffCanvasBench(std::move(name), std::move(dataSrc));
+}
+
+DEF_BENCH( return CreateDiffCanvasBench(
+        SkString("SkDiffBench-lorem_ipsum"),
+        [](){ return GetResourceAsStream("diff_canvas_traces/lorem_ipsum.trace"); }));
diff --git a/bench/SkGlyphCacheBench.h b/bench/SkGlyphCacheBench.h
new file mode 100644
index 0000000..623bdcc
--- /dev/null
+++ b/bench/SkGlyphCacheBench.h
@@ -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.
+#ifndef SkGlyphCacheBench_DEFINED
+#define SkGlyphCacheBench_DEFINED
+
+#include "bench/Benchmark.h"
+#include "include/core/SkStream.h"
+#include "include/core/SkString.h"
+
+#include <functional>
+#include <memory>
+
+Benchmark* CreateDiffCanvasBench(SkString name,
+                                 std::function<std::unique_ptr<SkStreamAsset>()> dataSrc);
+
+#endif  // SkGlyphCacheBench_DEFINED
diff --git a/bench/SkSLBench.cpp b/bench/SkSLBench.cpp
new file mode 100644
index 0000000..5061f7d
--- /dev/null
+++ b/bench/SkSLBench.cpp
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "bench/Benchmark.h"
+#include "src/sksl/SkSLCompiler.h"
+
+class SkSLBench : public Benchmark {
+public:
+    SkSLBench(SkSL::String name, const char* src)
+        : fName("sksl_" + name)
+        , fSrc(src) {}
+
+protected:
+    const char* onGetName() override {
+        return fName.c_str();
+    }
+
+    bool isSuitableFor(Backend backend) override {
+        return backend == kNonRendering_Backend;
+    }
+
+    void onDraw(int loops, SkCanvas*) override {
+        for (int i = 0; i < loops; i++) {
+            std::unique_ptr<SkSL::Program> program = fCompiler.convertProgram(
+                                                                      SkSL::Program::kFragment_Kind,
+                                                                      fSrc,
+                                                                      fSettings);
+            if (!fCompiler.errorCount()) {
+                fCompiler.optimize(*program);
+            } else {
+                printf("%s\n", fCompiler.errorText().c_str());
+                SK_ABORT("shader compilation failed");
+            }
+        }
+    }
+
+private:
+    SkSL::String fName;
+    SkSL::String fSrc;
+    SkSL::Compiler fCompiler;
+    SkSL::Program::Settings fSettings;
+
+    typedef Benchmark INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+DEF_BENCH(return new SkSLBench("tiny", "void main() { sk_FragColor = half4(1); }"); )
+DEF_BENCH(return new SkSLBench("huge", R"(
+    uniform half2 uDstTextureUpperLeft_Stage1;
+    uniform half2 uDstTextureCoordScale_Stage1;
+    uniform sampler2D uDstTextureSampler_Stage1;
+    noperspective in half4 vQuadEdge_Stage0;
+    noperspective in half4 vinColor_Stage0;
+    out half4 sk_FragColor;
+    half luminance_Stage1(half3 color) {
+        return dot(half3(0.3, 0.59, 0.11), color);
+    }
+
+    half3 set_luminance_Stage1(half3 hueSat, half alpha, half3 lumColor) {
+        half diff = luminance_Stage1(lumColor - hueSat);
+        half3 outColor = hueSat + diff;
+        half outLum = luminance_Stage1(outColor);
+        half minComp = min(min(outColor.r, outColor.g), outColor.b);
+        half maxComp = max(max(outColor.r, outColor.g), outColor.b);
+        if (minComp < 0.0 && outLum != minComp) {
+            outColor = outLum + ((outColor - half3(outLum, outLum, outLum)) * outLum) /
+                       (outLum - minComp);
+        }
+        if (maxComp > alpha && maxComp != outLum) {
+            outColor = outLum +((outColor - half3(outLum, outLum, outLum)) * (alpha - outLum)) /
+                       (maxComp - outLum);
+        }
+        return outColor;
+    }
+
+    void main() {
+        half4 outputColor_Stage0;
+        half4 outputCoverage_Stage0;
+        { // Stage 0, QuadEdge
+            outputColor_Stage0 = vinColor_Stage0;
+            half edgeAlpha;
+            half2 duvdx = half2(dFdx(vQuadEdge_Stage0.xy));
+            half2 duvdy = half2(dFdy(vQuadEdge_Stage0.xy));
+            if (vQuadEdge_Stage0.z > 0.0 && vQuadEdge_Stage0.w > 0.0) {
+                edgeAlpha = min(min(vQuadEdge_Stage0.z, vQuadEdge_Stage0.w) + 0.5, 1.0);
+            } else {
+                half2 gF = half2(2.0 * vQuadEdge_Stage0.x * duvdx.x - duvdx.y,
+                                 2.0 * vQuadEdge_Stage0.x * duvdy.x - duvdy.y);
+                edgeAlpha = (vQuadEdge_Stage0.x*vQuadEdge_Stage0.x - vQuadEdge_Stage0.y);
+                edgeAlpha = saturate(0.5 - edgeAlpha / length(gF));
+            }
+            outputCoverage_Stage0 = half4(edgeAlpha);
+        }
+        { // Xfer Processor: Custom Xfermode
+            if (all(lessThanEqual(outputCoverage_Stage0.rgb, half3(0)))) {
+                discard;
+            }
+            // Read color from copy of the destination.
+            half2 _dstTexCoord = (half2(sk_FragCoord.xy) - uDstTextureUpperLeft_Stage1) *
+                                  uDstTextureCoordScale_Stage1;
+            _dstTexCoord.y = 1.0 - _dstTexCoord.y;
+            half4 _dstColor = sample(uDstTextureSampler_Stage1, _dstTexCoord);
+            sk_FragColor.a = outputColor_Stage0.a + (1.0 - outputColor_Stage0.a) * _dstColor.a;
+            half4 srcDstAlpha = outputColor_Stage0 * _dstColor.a;
+            sk_FragColor.rgb = set_luminance_Stage1(_dstColor.rgb * outputColor_Stage0.a,
+                                                    srcDstAlpha.a, srcDstAlpha.rgb);
+            sk_FragColor.rgb += (1.0 - outputColor_Stage0.a) * _dstColor.rgb + (1.0 - _dstColor.a) *
+                                outputColor_Stage0.rgb;
+            sk_FragColor = outputCoverage_Stage0 * sk_FragColor +
+                           (half4(1.0) - outputCoverage_Stage0) * _dstColor;
+        }
+    }
+)"); )
diff --git a/bench/SkSLInterpreterBench.cpp b/bench/SkSLInterpreterBench.cpp
new file mode 100644
index 0000000..22afd28
--- /dev/null
+++ b/bench/SkSLInterpreterBench.cpp
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2019 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "bench/Benchmark.h"
+#include "include/utils/SkRandom.h"
+#include "src/sksl/SkSLByteCode.h"
+#include "src/sksl/SkSLCompiler.h"
+
+// Without this build flag, this bench isn't runnable.
+#if defined(SK_ENABLE_SKSL_INTERPRETER)
+
+// Benchmarks the interpreter with a function that has a color-filter style signature
+class SkSLInterpreterCFBench : public Benchmark {
+public:
+    SkSLInterpreterCFBench(SkSL::String name, int pixels, const char* src)
+        : fName(SkStringPrintf("sksl_interp_cf_%d_%s", pixels, name.c_str()))
+        , fSrc(src)
+        , fCount(pixels) {}
+
+protected:
+    const char* onGetName() override {
+        return fName.c_str();
+    }
+
+    bool isSuitableFor(Backend backend) override {
+        return backend == kNonRendering_Backend;
+    }
+
+    void onDelayedSetup() override {
+        SkSL::Compiler compiler;
+        SkSL::Program::Settings settings;
+        auto program = compiler.convertProgram(SkSL::Program::kGeneric_Kind, fSrc, settings);
+        SkASSERT(compiler.errorCount() == 0);
+        fByteCode = compiler.toByteCode(*program);
+        SkASSERT(compiler.errorCount() == 0);
+        fMain = fByteCode->getFunction("main");
+
+        SkRandom rnd;
+        fPixels.resize(fCount * 4);
+        for (float& c : fPixels) {
+            c = rnd.nextF();
+        }
+    }
+
+    void onDraw(int loops, SkCanvas*) override {
+        for (int i = 0; i < loops; i++) {
+            float* args[] = {
+                fPixels.data() + 0 * fCount,
+                fPixels.data() + 1 * fCount,
+                fPixels.data() + 2 * fCount,
+                fPixels.data() + 3 * fCount,
+            };
+
+            SkAssertResult(fByteCode->runStriped(fMain, fCount, args, 4, nullptr, 0, nullptr, 0));
+        }
+    }
+
+private:
+    SkString fName;
+    SkSL::String fSrc;
+    std::unique_ptr<SkSL::ByteCode> fByteCode;
+    const SkSL::ByteCodeFunction* fMain;
+
+    int fCount;
+    std::vector<float> fPixels;
+
+    typedef Benchmark INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+const char* kLumaToAlphaSrc = R"(
+    void main(inout float4 color) {
+        color.a = color.r*0.3 + color.g*0.6 + color.b*0.1;
+        color.r = 0;
+        color.g = 0;
+        color.b = 0;
+    }
+)";
+
+const char* kHighContrastFilterSrc = R"(
+    half ucontrast_Stage2;
+    half hue2rgb_Stage2(half p, half q, half t) {
+        if (t < 0)  t += 1;
+        if (t > 1)  t -= 1;
+        return (t < 1 / 6.) ? p + (q - p) * 6 * t
+             : (t < 1 / 2.) ? q
+             : (t < 2 / 3.) ? p + (q - p) * (2 / 3. - t) * 6
+             : p;
+    }
+    half max(half a, half b) { return a > b ? a : b; }
+    half min(half a, half b) { return a < b ? a : b; }
+    void main(inout half4 color) {
+        ucontrast_Stage2 = 0.2;
+
+        // HighContrastFilter
+        half nonZeroAlpha = max(color.a, 0.0001);
+        color = half4(color.rgb / nonZeroAlpha, nonZeroAlpha);
+        color.rgb = color.rgb * color.rgb;
+        half fmax = max(color.r, max(color.g, color.b));
+        half fmin = min(color.r, min(color.g, color.b));
+        half l = (fmax + fmin) / 2;
+        half h;
+        half s;
+        if (fmax == fmin) {
+            h = 0;
+            s = 0;
+        } else {
+            half d = fmax - fmin;
+            s = l > 0.5 ? d / (2 - fmax - fmin) : d / (fmax + fmin);
+            if (color.r >= color.g && color.r >= color.b) {
+                h = (color.g - color.b) / d + (color.g < color.b ? 6 : 0);
+            } else if (color.g >= color.b) {
+                h = (color.b - color.r) / d + 2;
+            } else {
+                h = (color.r - color.g) / d + 4;
+            }
+        }
+        h /= 6;
+        l = 1.0 - l;
+        if (s == 0) {
+            color = half4(l, l, l, 0);
+        } else {
+            half q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+            half p = 2 * l - q;
+            color.r = hue2rgb_Stage2(p, q, h + 1 / 3.);
+            color.g = hue2rgb_Stage2(p, q, h);
+            color.b = hue2rgb_Stage2(p, q, h - 1 / 3.);
+        }
+        if (ucontrast_Stage2 != 0) {
+            half m = (1 + ucontrast_Stage2) / (1 - ucontrast_Stage2);
+            half off = (-0.5 * m + 0.5);
+            color = m * color + off;
+        }
+        // color = saturate(color);
+        color.rgb = sqrt(color.rgb);
+        color.rgb *= color.a;
+    }
+)";
+
+DEF_BENCH(return new SkSLInterpreterCFBench("lumaToAlpha", 256, kLumaToAlphaSrc));
+DEF_BENCH(return new SkSLInterpreterCFBench("hcf", 256, kHighContrastFilterSrc));
+#endif // SK_ENABLE_SKSL_INTERPRETER
diff --git a/bench/SkVMBench.cpp b/bench/SkVMBench.cpp
new file mode 100644
index 0000000..3648c55
--- /dev/null
+++ b/bench/SkVMBench.cpp
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2019 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "bench/Benchmark.h"
+#include "src/core/SkOpts.h"
+#include "src/core/SkVM.h"
+#include "tools/SkVMBuilders.h"
+
+namespace {
+
+    enum Mode {Opts, RP, F32, I32_Naive, I32, I32_SWAR};
+    static const char* kMode_name[] = { "Opts", "RP","F32", "I32_Naive", "I32", "I32_SWAR" };
+
+}
+
+class SkVMBench : public Benchmark {
+public:
+    SkVMBench(int pixels, Mode mode)
+        : fPixels(pixels)
+        , fMode(mode)
+        , fName(SkStringPrintf("SkVM_%d_%s", pixels, kMode_name[mode]))
+    {}
+
+private:
+    const char* onGetName() override { return fName.c_str(); }
+    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
+
+    void onDelayedSetup() override {
+        this->setUnits(fPixels);
+        fSrc.resize(fPixels, 0x7f123456);  // Arbitrary non-opaque non-transparent value.
+        fDst.resize(fPixels, 0xff987654);  // Arbitrary value.
+
+        if (fMode == F32      ) { fProgram = SrcoverBuilder_F32      {}.done(); }
+        if (fMode == I32_Naive) { fProgram = SrcoverBuilder_I32_Naive{}.done(); }
+        if (fMode == I32      ) { fProgram = SrcoverBuilder_I32      {}.done(); }
+        if (fMode == I32_SWAR ) { fProgram = SrcoverBuilder_I32_SWAR {}.done(); }
+
+        if (fMode == RP) {
+            fSrcCtx = { fSrc.data(), 0 };
+            fDstCtx = { fDst.data(), 0 };
+            fPipeline.append(SkRasterPipeline::load_8888    , &fSrcCtx);
+            fPipeline.append(SkRasterPipeline::load_8888_dst, &fDstCtx);
+            fPipeline.append(SkRasterPipeline::srcover);
+            fPipeline.append(SkRasterPipeline::store_8888, &fDstCtx);
+        }
+
+        // Trigger one run now so we can do a quick correctness check.
+        this->draw(1,nullptr);
+        for (int i = 0; i < fPixels; i++) {
+            SkASSERTF(fDst[i] == 0xff5e6f80, "Want 0xff5e6f80, got %08x", fDst[i]);
+        }
+    }
+
+    void onDraw(int loops, SkCanvas*) override {
+        while (loops --> 0) {
+            if (fMode == Opts) {
+                SkOpts::blit_row_s32a_opaque(fDst.data(), fSrc.data(), fPixels, 0xff);
+            } else if (fMode == RP) {
+                fPipeline.run(0,0,fPixels,1);
+            } else {
+                fProgram.eval(fPixels, fSrc.data(), fDst.data());
+            }
+        }
+    }
+
+    int                   fPixels;
+    Mode                  fMode;
+    SkString              fName;
+    std::vector<uint32_t> fSrc,
+                          fDst;
+    skvm::Program         fProgram;
+
+    SkRasterPipeline_MemoryCtx fSrcCtx,
+                               fDstCtx;
+    SkRasterPipeline_<256>     fPipeline;
+};
+
+DEF_BENCH(return (new SkVMBench{   1, Opts});)
+DEF_BENCH(return (new SkVMBench{   4, Opts});)
+DEF_BENCH(return (new SkVMBench{  15, Opts});)
+DEF_BENCH(return (new SkVMBench{  63, Opts});)
+DEF_BENCH(return (new SkVMBench{ 256, Opts});)
+DEF_BENCH(return (new SkVMBench{1024, Opts});)
+DEF_BENCH(return (new SkVMBench{4096, Opts});)
+
+DEF_BENCH(return (new SkVMBench{   1, RP});)
+DEF_BENCH(return (new SkVMBench{   4, RP});)
+DEF_BENCH(return (new SkVMBench{  15, RP});)
+DEF_BENCH(return (new SkVMBench{  63, RP});)
+DEF_BENCH(return (new SkVMBench{ 256, RP});)
+DEF_BENCH(return (new SkVMBench{1024, RP});)
+DEF_BENCH(return (new SkVMBench{4096, RP});)
+
+DEF_BENCH(return (new SkVMBench{   1, F32});)
+DEF_BENCH(return (new SkVMBench{   4, F32});)
+DEF_BENCH(return (new SkVMBench{  15, F32});)
+DEF_BENCH(return (new SkVMBench{  63, F32});)
+DEF_BENCH(return (new SkVMBench{ 256, F32});)
+DEF_BENCH(return (new SkVMBench{1024, F32});)
+DEF_BENCH(return (new SkVMBench{4096, F32});)
+
+DEF_BENCH(return (new SkVMBench{   1, I32_Naive});)
+DEF_BENCH(return (new SkVMBench{   4, I32_Naive});)
+DEF_BENCH(return (new SkVMBench{  15, I32_Naive});)
+DEF_BENCH(return (new SkVMBench{  63, I32_Naive});)
+DEF_BENCH(return (new SkVMBench{ 256, I32_Naive});)
+DEF_BENCH(return (new SkVMBench{1024, I32_Naive});)
+DEF_BENCH(return (new SkVMBench{4096, I32_Naive});)
+
+DEF_BENCH(return (new SkVMBench{   1, I32});)
+DEF_BENCH(return (new SkVMBench{   4, I32});)
+DEF_BENCH(return (new SkVMBench{  15, I32});)
+DEF_BENCH(return (new SkVMBench{  63, I32});)
+DEF_BENCH(return (new SkVMBench{ 256, I32});)
+DEF_BENCH(return (new SkVMBench{1024, I32});)
+DEF_BENCH(return (new SkVMBench{4096, I32});)
+
+DEF_BENCH(return (new SkVMBench{   1, I32_SWAR});)
+DEF_BENCH(return (new SkVMBench{   4, I32_SWAR});)
+DEF_BENCH(return (new SkVMBench{  15, I32_SWAR});)
+DEF_BENCH(return (new SkVMBench{  63, I32_SWAR});)
+DEF_BENCH(return (new SkVMBench{ 256, I32_SWAR});)
+DEF_BENCH(return (new SkVMBench{1024, I32_SWAR});)
+DEF_BENCH(return (new SkVMBench{4096, I32_SWAR});)
+
+class SkVM_Overhead : public Benchmark {
+public:
+    explicit SkVM_Overhead(bool rp) : fRP(rp) {}
+
+private:
+    const char* onGetName() override { return fRP ? "SkVM_Overhead_RP" : "SkVM_Overhead_VM"; }
+    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
+
+    void onDraw(int loops, SkCanvas*) override {
+        float dummy;
+        if (fRP) {
+            while (loops --> 0) {
+                SkRasterPipeline_<256> rp;
+                SkRasterPipeline_MemoryCtx src = { &dummy, 0},
+                                           dst = { &dummy, 0};
+                rp.append_load    (SkColorType::kRGBA_F32_SkColorType, &src);
+                rp.append_load_dst(SkColorType::kRGBA_F32_SkColorType, &dst);
+                rp.append         (SkRasterPipeline::srcover);
+                rp.append_store   (SkColorType::kRGBA_F32_SkColorType, &dst);
+
+                (void)rp.compile();
+            }
+        } else {
+            while (loops --> 0) {
+                skvm::Program program = SrcoverBuilder_F32{}.done();
+                program.eval(0, &dummy, &dummy);
+            }
+        }
+    }
+
+    bool fRP;
+};
+DEF_BENCH(return new SkVM_Overhead{ true};)
+DEF_BENCH(return new SkVM_Overhead{false};)
diff --git a/bench/SortBench.cpp b/bench/SortBench.cpp
index e380c78..6933ee2 100644
--- a/bench/SortBench.cpp
+++ b/bench/SortBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkRandom.h"
-#include "SkString.h"
-#include "SkTSort.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkTSort.h"
 
 #include <algorithm>
 #include <stdlib.h>
diff --git a/bench/StreamBench.cpp b/bench/StreamBench.cpp
index e89b207..5288e17 100644
--- a/bench/StreamBench.cpp
+++ b/bench/StreamBench.cpp
@@ -5,8 +5,8 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkStream.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkStream.h"
 
 class StreamBench : public Benchmark {
     SkString    fName;
diff --git a/bench/StrokeBench.cpp b/bench/StrokeBench.cpp
index 63199d0..c543bf8 100644
--- a/bench/StrokeBench.cpp
+++ b/bench/StrokeBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkPaint.h"
-#include "SkPath.h"
-#include "SkRandom.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkPath.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
 
 class StrokeBench : public Benchmark {
 public:
diff --git a/bench/SwizzleBench.cpp b/bench/SwizzleBench.cpp
index c634547..ee6f220 100644
--- a/bench/SwizzleBench.cpp
+++ b/bench/SwizzleBench.cpp
@@ -5,8 +5,8 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkOpts.h"
+#include "bench/Benchmark.h"
+#include "src/core/SkOpts.h"
 
 class SwizzleBench : public Benchmark {
 public:
diff --git a/bench/TableBench.cpp b/bench/TableBench.cpp
index 346aba8..33654c0 100644
--- a/bench/TableBench.cpp
+++ b/bench/TableBench.cpp
@@ -5,9 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkRect.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkRect.h"
 
 static const SkScalar kCellWidth = SkIntToScalar(20);
 static const SkScalar kCellHeight = SkIntToScalar(10);
diff --git a/bench/TextBlobBench.cpp b/bench/TextBlobBench.cpp
index a52b09c..70ad449 100644
--- a/bench/TextBlobBench.cpp
+++ b/bench/TextBlobBench.cpp
@@ -5,19 +5,19 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "Resources.h"
-#include "SkCanvas.h"
-#include "SkFont.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkStream.h"
-#include "SkString.h"
-#include "SkTemplates.h"
-#include "SkTextBlob.h"
-#include "SkTypeface.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkFont.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkStream.h"
+#include "include/core/SkString.h"
+#include "include/core/SkTextBlob.h"
+#include "include/core/SkTypeface.h"
+#include "include/private/SkTemplates.h"
+#include "include/utils/SkRandom.h"
+#include "tools/Resources.h"
 
-#include "ToolUtils.h"
+#include "tools/ToolUtils.h"
 
 /*
  * A trivial test which benchmarks the performance of a textblob with a single run.
@@ -33,10 +33,10 @@
         // This text seems representative in both length and letter frequency.
         const char* text = "Keep your sentences short, but not overly so.";
 
-        fGlyphs.setCount(fFont.countText(text, strlen(text), kUTF8_SkTextEncoding));
+        fGlyphs.setCount(fFont.countText(text, strlen(text), SkTextEncoding::kUTF8));
         fXPos.setCount(fGlyphs.count());
 
-        fFont.textToGlyphs(text, strlen(text), kUTF8_SkTextEncoding, fGlyphs.begin(), fGlyphs.count());
+        fFont.textToGlyphs(text, strlen(text), SkTextEncoding::kUTF8, fGlyphs.begin(), fGlyphs.count());
         fFont.getXPos(&fGlyphs[0], fGlyphs.count(), fXPos.begin());
     }
 
diff --git a/bench/TileBench.cpp b/bench/TileBench.cpp
index 0679587..0a944dd 100644
--- a/bench/TileBench.cpp
+++ b/bench/TileBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkShader.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
 
 static void create_gradient(SkBitmap* bm) {
     SkASSERT(1 == bm->width());
diff --git a/bench/TileImageFilterBench.cpp b/bench/TileImageFilterBench.cpp
index b9b38ed..c1e3773 100644
--- a/bench/TileImageFilterBench.cpp
+++ b/bench/TileImageFilterBench.cpp
@@ -5,11 +5,11 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkTileImageFilter.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkString.h"
+#include "include/effects/SkImageFilters.h"
 
 #define WIDTH 512
 #define HEIGHT 512
@@ -37,9 +37,8 @@
 
     void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
-        paint.setImageFilter(SkTileImageFilter::Make(SkRect::MakeWH(50, 50),
-                                                     SkRect::MakeWH(WIDTH, HEIGHT),
-                                                     nullptr));
+        paint.setImageFilter(SkImageFilters::Tile(
+                SkRect::MakeWH(50, 50), SkRect::MakeWH(WIDTH, HEIGHT), nullptr));
 
         for (int i = 0; i < loops; i++) {
             if (fTileSize > 0) {
diff --git a/bench/TopoSortBench.cpp b/bench/TopoSortBench.cpp
index d0b6202..712d37f 100644
--- a/bench/TopoSortBench.cpp
+++ b/bench/TopoSortBench.cpp
@@ -5,12 +5,12 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkRandom.h"
-#include "SkString.h"
-#include "SkTTopoSort.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkString.h"
+#include "include/utils/SkRandom.h"
+#include "src/core/SkTTopoSort.h"
 
-#include "ToolUtils.h"
+#include "tools/ToolUtils.h"
 
 class TopoSortBench : public Benchmark {
 public:
diff --git a/bench/TypefaceBench.cpp b/bench/TypefaceBench.cpp
index cce5cdb..711bb6a 100644
--- a/bench/TypefaceBench.cpp
+++ b/bench/TypefaceBench.cpp
@@ -7,12 +7,12 @@
 
 #include <vector>
 
-#include "Benchmark.h"
-#include "SkFontTypes.h"
-#include "SkMakeUnique.h"
-#include "SkTypeface.h"
-#include "SkUTF.h"
-#include "SkUtils.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkFont.h"
+#include "include/core/SkTypeface.h"
+#include "src/core/SkMakeUnique.h"
+#include "src/core/SkUtils.h"
+#include "src/utils/SkUTF.h"
 
 // From Project Guttenberg. This is UTF-8 text.
 static const char* atext[] = {
@@ -238,12 +238,12 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
+        SkFont font(fTypeface);
         // Do more loops to reduce variance.
         for (int i = 0; i < loops * 3; ++i) {
             for (auto& line : fLines) {
-                fTypeface->charsToGlyphs(line->utf.data(),
-                                  (SkTypeface::Encoding)fEncoding, fGlyphIds.data(),
-                                  line->glyphCount);
+                font.textToGlyphs(line->utf.data(), line->utf.size(), fEncoding,
+                                  fGlyphIds.data(), line->glyphCount);
             }
         }
     }
diff --git a/bench/VertBench.cpp b/bench/VertBench.cpp
index a49d3a8..2056036 100644
--- a/bench/VertBench.cpp
+++ b/bench/VertBench.cpp
@@ -5,33 +5,36 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkPaint.h"
-#include "SkRandom.h"
-#include "SkShader.h"
-#include "SkString.h"
-#include "SkVertices.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkShader.h"
+#include "include/core/SkString.h"
+#include "include/core/SkVertices.h"
+#include "include/utils/SkRandom.h"
+#include "tools/Resources.h"
 
 enum VertFlags {
-    kColors_VertFlag,
-    kTexture_VertFlag,
+    kColors_VertFlag  = 1 << 0,
+    kTexture_VertFlag = 1 << 1,
 };
 
 class VertBench : public Benchmark {
     SkString fName;
     enum {
-        W = 640,
-        H = 480,
+        W = 64*2,
+        H = 48*2,
         ROW = 20,
         COL = 20,
         PTS = (ROW + 1) * (COL + 1),
         IDX = ROW * COL * 6,
     };
 
+    sk_sp<SkShader> fShader;
     SkPoint fPts[PTS];
     SkColor fColors[PTS];
     uint16_t fIdx[IDX];
+    unsigned fFlags;
 
     static void load_2_tris(uint16_t idx[], int x, int y, int rb) {
         int n = y * rb + x;
@@ -39,8 +42,15 @@
         idx[3] = n; idx[4] = rb + n + 1; idx[5] = n + rb;
     }
 
+    void onDelayedSetup() override {
+        auto img = GetResourceAsImage("images/mandrill_256.png");
+        if (img) {
+            fShader = img->makeShader();
+        }
+    }
+
 public:
-    VertBench() {
+    VertBench(unsigned flags) : fFlags(flags) {
         const SkScalar dx = SkIntToScalar(W) / COL;
         const SkScalar dy = SkIntToScalar(H) / COL;
 
@@ -74,6 +84,12 @@
         }
 
         fName.set("verts");
+        if (fFlags & kTexture_VertFlag) {
+            fName.append("_textures");
+        }
+        if (fFlags & kColors_VertFlag) {
+            fName.append("_colors");
+        }
     }
 
 protected:
@@ -81,9 +97,12 @@
     void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
         this->setupPaint(&paint);
+        paint.setShader(fShader);
 
+        const SkPoint* texs = (fFlags & kTexture_VertFlag) ? fPts    : nullptr;
+        const SkColor* cols = (fFlags & kColors_VertFlag)  ? fColors : nullptr;
         auto verts = SkVertices::MakeCopy(SkVertices::kTriangles_VertexMode, PTS,
-                                          fPts, nullptr, fColors, IDX, fIdx);
+                                          fPts, texs, cols, IDX, fIdx);
         for (int i = 0; i < loops; i++) {
             canvas->drawVertices(verts, SkBlendMode::kModulate, paint);
         }
@@ -91,17 +110,19 @@
 private:
     typedef Benchmark INHERITED;
 };
-DEF_BENCH(return new VertBench();)
+DEF_BENCH(return new VertBench(kTexture_VertFlag);)
+DEF_BENCH(return new VertBench(kColors_VertFlag);)
+DEF_BENCH(return new VertBench(kColors_VertFlag | kTexture_VertFlag);)
 
 /////////////////////////////////////////////////////////////////////////////////////////////////
 
-#include "Resources.h"
-#include "SkRandom.h"
-#include "SkRSXform.h"
+#include "include/core/SkRSXform.h"
+#include "include/utils/SkRandom.h"
+#include "tools/Resources.h"
 
 enum AtlasFlags {
     kColors_Flag = 1 << 0,
-    kVerts_Flag  = 1 << 1,
+    kRotate_Flag = 1 << 1,
 };
 
 class AtlasBench : public Benchmark {
@@ -120,7 +141,13 @@
 
 public:
     AtlasBench(unsigned flags) : fFlags(flags) {
-        fName.printf("drawAtlas_%d", flags);
+        fName.printf("drawAtlas");
+        if (flags & kColors_Flag) {
+            fName.append("_colors");
+        }
+        if (flags & kRotate_Flag) {
+            fName.append("_rotated");
+        }
     }
     ~AtlasBench() override {}
 
@@ -134,28 +161,30 @@
 
         const SkScalar imageW = fAtlas->width();
         const SkScalar imageH = fAtlas->height();
+        SkScalar scos = 1;
+        SkScalar ssin = 0;
+        if (fFlags & kRotate_Flag) {
+            scos = 0.866025403784439f;  // sqrt(3)/2
+            ssin = 0.5f;
+        }
 
         SkRandom rand;
         for (int i = 0; i < N; ++i) {
             fRects[i] = SkRect::MakeXYWH(rand.nextF() * (imageW - 8),
                                          rand.nextF() * (imageH - 8), 8, 8);
-            fColors[i] = rand.nextU();
-            fXforms[i] = SkRSXform::Make(1, 0, rand.nextF() * W, rand.nextF() * H);
+            fColors[i] = rand.nextU() | 0xFF000000;
+            fXforms[i] = SkRSXform::Make(scos, ssin, rand.nextF() * W, rand.nextF() * H);
         }
     }
     void onDraw(int loops, SkCanvas* canvas) override {
         const SkRect* cullRect = nullptr;
         const SkPaint* paintPtr = nullptr;
         const SkColor* colors = nullptr;
-        const SkImage* atlas = nullptr;
         if (fFlags & kColors_Flag) {
             colors = fColors;
         }
-        if (fFlags & kVerts_Flag) {
-            atlas = fAtlas.get();
-        }
         for (int i = 0; i < loops; i++) {
-            canvas->drawAtlas(atlas, fXforms, fRects, colors, N, SkBlendMode::kSrcOver,
+            canvas->drawAtlas(fAtlas, fXforms, fRects, colors, N, SkBlendMode::kModulate,
                               cullRect, paintPtr);
         }
     }
@@ -164,6 +193,8 @@
 };
 //DEF_BENCH(return new AtlasBench(0);)
 //DEF_BENCH(return new AtlasBench(kColors_Flag);)
-DEF_BENCH(return new AtlasBench(kVerts_Flag);)
-DEF_BENCH(return new AtlasBench(kVerts_Flag | kColors_Flag);)
+DEF_BENCH(return new AtlasBench(0);)
+DEF_BENCH(return new AtlasBench(kRotate_Flag);)
+DEF_BENCH(return new AtlasBench(kColors_Flag);)
+DEF_BENCH(return new AtlasBench(kColors_Flag | kRotate_Flag);)
 
diff --git a/bench/VertexColorSpaceBench.cpp b/bench/VertexColorSpaceBench.cpp
index b203d2f..1dde32e 100644
--- a/bench/VertexColorSpaceBench.cpp
+++ b/bench/VertexColorSpaceBench.cpp
@@ -5,24 +5,24 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
+#include "bench/Benchmark.h"
 
-#include "GrContext.h"
-#include "GrContextPriv.h"
-#include "GrGeometryProcessor.h"
-#include "GrMemoryPool.h"
-#include "GrRenderTargetContext.h"
-#include "GrRenderTargetContextPriv.h"
-#include "SkColorSpacePriv.h"
-#include "SkGr.h"
-#include "SkHalf.h"
-#include "SkString.h"
-#include "glsl/GrGLSLColorSpaceXformHelper.h"
-#include "glsl/GrGLSLFragmentShaderBuilder.h"
-#include "glsl/GrGLSLGeometryProcessor.h"
-#include "glsl/GrGLSLVarying.h"
-#include "glsl/GrGLSLVertexGeoBuilder.h"
-#include "ops/GrMeshDrawOp.h"
+#include "include/core/SkString.h"
+#include "include/gpu/GrContext.h"
+#include "include/private/SkHalf.h"
+#include "src/core/SkColorSpacePriv.h"
+#include "src/gpu/GrContextPriv.h"
+#include "src/gpu/GrGeometryProcessor.h"
+#include "src/gpu/GrMemoryPool.h"
+#include "src/gpu/GrRenderTargetContext.h"
+#include "src/gpu/GrRenderTargetContextPriv.h"
+#include "src/gpu/SkGr.h"
+#include "src/gpu/glsl/GrGLSLColorSpaceXformHelper.h"
+#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
+#include "src/gpu/glsl/GrGLSLGeometryProcessor.h"
+#include "src/gpu/glsl/GrGLSLVarying.h"
+#include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h"
+#include "src/gpu/ops/GrMeshDrawOp.h"
 
 namespace {
 
@@ -128,7 +128,7 @@
             : INHERITED(ClassID())
             , fMode(kBaseline_Mode)
             , fColor(color) {
-        this->setBounds(SkRect::MakeWH(100.f, 100.f), HasAABloat::kNo, IsZeroArea::kNo);
+        this->setBounds(SkRect::MakeWH(100.f, 100.f), HasAABloat::kNo, IsHairline::kNo);
     }
 
     Op(const SkColor4f& color4f, Mode mode)
@@ -136,7 +136,7 @@
             , fMode(mode)
             , fColor4f(color4f) {
         SkASSERT(kFloat_Mode == fMode || kHalf_Mode == mode);
-        this->setBounds(SkRect::MakeWH(100.f, 100.f), HasAABloat::kNo, IsZeroArea::kNo);
+        this->setBounds(SkRect::MakeWH(100.f, 100.f), HasAABloat::kNo, IsHairline::kNo);
     }
 
     Op(GrColor color, sk_sp<GrColorSpaceXform> colorSpaceXform)
@@ -144,15 +144,15 @@
             , fMode(kShader_Mode)
             , fColor(color)
             , fColorSpaceXform(std::move(colorSpaceXform)) {
-        this->setBounds(SkRect::MakeWH(100.f, 100.f), HasAABloat::kNo, IsZeroArea::kNo);
+        this->setBounds(SkRect::MakeWH(100.f, 100.f), HasAABloat::kNo, IsHairline::kNo);
     }
 
     FixedFunctionFlags fixedFunctionFlags() const override {
         return FixedFunctionFlags::kNone;
     }
 
-    GrProcessorSet::Analysis finalize(
-            const GrCaps&, const GrAppliedClip*, GrFSAAType, GrClampType) override {
+    GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*,
+                                      bool hasMixedSampledCoverage, GrClampType) override {
         return GrProcessorSet::EmptySetAnalysis();
     }
 
@@ -269,12 +269,9 @@
         SkRandom r;
         const int kDrawsPerLoop = 32;
 
-        const GrBackendFormat format =
-            context->priv().caps()->getBackendFormatFromColorType(kRGBA_8888_SkColorType);
         for (int i = 0; i < loops; ++i) {
-            sk_sp<GrRenderTargetContext> rtc(
-                    context->priv().makeDeferredRenderTargetContext(
-                            format, SkBackingFit::kApprox, 100, 100, kRGBA_8888_GrPixelConfig, p3));
+            auto rtc = context->priv().makeDeferredRenderTargetContext(
+                    SkBackingFit::kApprox, 100, 100, GrColorType::kRGBA_8888, p3);
             SkASSERT(rtc);
 
             for (int j = 0; j < kDrawsPerLoop; ++j) {
diff --git a/bench/WritePixelsBench.cpp b/bench/WritePixelsBench.cpp
index 39ceb1f..3f3baaf 100644
--- a/bench/WritePixelsBench.cpp
+++ b/bench/WritePixelsBench.cpp
@@ -5,10 +5,10 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkBitmap.h"
-#include "SkCanvas.h"
-#include "SkString.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkString.h"
 
 // Time variants of write-pixels
 //  [ colortype ][ alphatype ][ colorspace ]
@@ -35,8 +35,7 @@
     void onDraw(int loops, SkCanvas* canvas) override {
         SkISize size = canvas->getBaseLayerSize();
 
-        SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), fColorType, fAlphaType,
-                                             fCS);
+        SkImageInfo info = SkImageInfo::Make(size, fColorType, fAlphaType, fCS);
         SkBitmap bmp;
         bmp.allocPixels(info);
         bmp.eraseColor(SK_ColorBLACK);
diff --git a/bench/WriterBench.cpp b/bench/WriterBench.cpp
index 78c5d8b..40cc1a8 100644
--- a/bench/WriterBench.cpp
+++ b/bench/WriterBench.cpp
@@ -5,9 +5,9 @@
  * found in the LICENSE file.
  */
 
-#include "Benchmark.h"
-#include "SkCanvas.h"
-#include "SkWriter32.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkCanvas.h"
+#include "src/core/SkWriter32.h"
 
 class WriterBench : public Benchmark {
 public:
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index bd61d34..db22c9d 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -7,47 +7,50 @@
 
 #include <ctype.h>
 
-#include "nanobench.h"
+#include "bench/nanobench.h"
 
-#include "AndroidCodecBench.h"
-#include "Benchmark.h"
-#include "BitmapRegionDecoderBench.h"
-#include "CodecBench.h"
-#include "CodecBenchPriv.h"
-#include "CommonFlags.h"
-#include "CommonFlagsConfig.h"
-#include "CrashHandler.h"
-#include "EventTracingPriv.h"
-#include "GMBench.h"
-#include "ProcStats.h"
-#include "RecordingBench.h"
-#include "ResultsWriter.h"
-#include "SKPAnimationBench.h"
-#include "SKPBench.h"
-#include "SkAndroidCodec.h"
-#include "SkAutoMalloc.h"
-#include "SkBBoxHierarchy.h"
-#include "SkBitmapRegionDecoder.h"
-#include "SkCanvas.h"
-#include "SkCodec.h"
-#include "SkColorSpacePriv.h"
-#include "SkData.h"
-#include "SkDebugfTracer.h"
-#include "SkGraphics.h"
-#include "SkJSONWriter.h"
-#include "SkLeanWindows.h"
-#include "SkOSFile.h"
-#include "SkOSPath.h"
-#include "SkPictureRecorder.h"
-#include "SkString.h"
-#include "SkSurface.h"
-#include "SkTaskGroup.h"
-#include "SkTraceEvent.h"
-#include "Stats.h"
-#include "ios_utils.h"
+#include "bench/AndroidCodecBench.h"
+#include "bench/Benchmark.h"
+#include "bench/BitmapRegionDecoderBench.h"
+#include "bench/CodecBench.h"
+#include "bench/CodecBenchPriv.h"
+#include "bench/GMBench.h"
+#include "bench/RecordingBench.h"
+#include "bench/ResultsWriter.h"
+#include "bench/SKPAnimationBench.h"
+#include "bench/SKPBench.h"
+#include "bench/SkGlyphCacheBench.h"
+#include "include/android/SkBitmapRegionDecoder.h"
+#include "include/codec/SkAndroidCodec.h"
+#include "include/codec/SkCodec.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkData.h"
+#include "include/core/SkGraphics.h"
+#include "include/core/SkPictureRecorder.h"
+#include "include/core/SkString.h"
+#include "include/core/SkSurface.h"
+#include "include/core/SkTime.h"
+#include "src/core/SkAutoMalloc.h"
+#include "src/core/SkBBoxHierarchy.h"
+#include "src/core/SkColorSpacePriv.h"
+#include "src/core/SkLeanWindows.h"
+#include "src/core/SkOSFile.h"
+#include "src/core/SkTaskGroup.h"
+#include "src/core/SkTraceEvent.h"
+#include "src/utils/SkJSONWriter.h"
+#include "src/utils/SkOSPath.h"
+#include "tools/AutoreleasePool.h"
+#include "tools/CrashHandler.h"
+#include "tools/ProcStats.h"
+#include "tools/Stats.h"
+#include "tools/flags/CommonFlags.h"
+#include "tools/flags/CommonFlagsConfig.h"
+#include "tools/ios_utils.h"
+#include "tools/trace/EventTracingPriv.h"
+#include "tools/trace/SkDebugfTracer.h"
 
 #ifdef SK_XML
-#include "SkSVGDOM.h"
+#include "experimental/svg/model/SkSVGDOM.h"
 #endif  // SK_XML
 
 #include <stdlib.h>
@@ -60,13 +63,13 @@
 
 #endif
 
-#include "GrCaps.h"
-#include "GrContextFactory.h"
-#include "GrContextPriv.h"
-#include "SkGr.h"
-#include "gl/GrGLDefines.h"
-#include "gl/GrGLGpu.h"
-#include "gl/GrGLUtil.h"
+#include "src/gpu/GrCaps.h"
+#include "src/gpu/GrContextPriv.h"
+#include "src/gpu/SkGr.h"
+#include "src/gpu/gl/GrGLDefines.h"
+#include "src/gpu/gl/GrGLGpu.h"
+#include "src/gpu/gl/GrGLUtil.h"
+#include "tools/gpu/GrContextFactory.h"
 
 using sk_gpu_test::ContextInfo;
 using sk_gpu_test::GrContextFactory;
@@ -76,17 +79,6 @@
 
 static const int kAutoTuneLoops = 0;
 
-#if !defined(__has_feature)
-    #define  __has_feature(x) 0
-#endif
-
-static const int kDefaultLoops =
-#if defined(SK_DEBUG) || __has_feature(address_sanitizer)
-    1;
-#else
-    kAutoTuneLoops;
-#endif
-
 static SkString loops_help_txt() {
     SkString help;
     help.printf("Number of times to run each bench. Set this to %d to auto-"
@@ -101,7 +93,7 @@
     return str;
 }
 
-static DEFINE_int(loops, kDefaultLoops, loops_help_txt().c_str());
+static DEFINE_int(loops, kAutoTuneLoops, loops_help_txt().c_str());
 
 static DEFINE_int(samples, 10, "Number of samples to measure for each bench.");
 static DEFINE_int(ms, 0, "If >0, run each bench for this many ms instead of obeying --samples.");
@@ -122,7 +114,6 @@
                      "Comma-separated zoomMax,zoomPeriodMs factors for a periodic SKP zoom "
                      "function that ping-pongs between 1.0 and zoomMax.");
 static DEFINE_bool(bbh, true, "Build a BBH for SKPs?");
-static DEFINE_bool(lite, false, "Use SkLiteRecorder in recording benchmarks?");
 static DEFINE_bool(mpd, true, "Use MultiPictureDraw for the SKPs?");
 static DEFINE_bool(loopSKP, true, "Loop SKPs like we do for micro benches?");
 static DEFINE_int(flushEvery, 10, "Flush --outResultsFile every Nth run.");
@@ -167,6 +158,7 @@
 
 static DEFINE_string(skps, "skps", "Directory to read skps from.");
 static DEFINE_string(svgs, "", "Directory to read SVGs from, or a single SVG file.");
+static DEFINE_string(texttraces, "", "Directory to read TextBlobTrace files from.");
 
 static DEFINE_int_2(threads, j, -1,
                "Run threadsafe tests on a threadpool with this many extra threads, "
@@ -469,9 +461,9 @@
 
         GrContextFactory factory(grContextOpts);
         if (const GrContext* ctx = factory.get(ctxType, ctxOverrides)) {
-            GrPixelConfig grPixConfig = SkColorType2GrPixelConfig(colorType);
+            GrBackendFormat format = ctx->defaultBackendFormat(colorType, GrRenderable::kYes);
             int supportedSampleCount =
-                    ctx->priv().caps()->getRenderTargetSampleCount(sampleCount, grPixConfig);
+                    ctx->priv().caps()->getRenderTargetSampleCount(sampleCount, format);
             if (sampleCount != supportedSampleCount) {
                 SkDebugf("Configuration '%s' sample count %d is not a supported sample count.\n",
                          config->getTag().c_str(), sampleCount);
@@ -636,23 +628,10 @@
 class BenchmarkStream {
 public:
     BenchmarkStream() : fBenches(BenchRegistry::Head())
-                      , fGMs(skiagm::GMRegistry::Head())
-                      , fCurrentRecording(0)
-                      , fCurrentDeserialPicture(0)
-                      , fCurrentScale(0)
-                      , fCurrentSKP(0)
-                      , fCurrentSVG(0)
-                      , fCurrentUseMPD(0)
-                      , fCurrentCodec(0)
-                      , fCurrentAndroidCodec(0)
-                      , fCurrentBRDImage(0)
-                      , fCurrentColorType(0)
-                      , fCurrentAlphaType(0)
-                      , fCurrentSubsetType(0)
-                      , fCurrentSampleSize(0)
-                      , fCurrentAnimSKP(0) {
+                      , fGMs(skiagm::GMRegistry::Head()) {
         collect_files(FLAGS_skps, ".skp", &fSKPs);
         collect_files(FLAGS_svgs, ".svg", &fSVGs);
+        collect_files(FLAGS_texttraces, ".trace", &fTextBlobTraces);
 
         if (4 != sscanf(FLAGS_clip[0], "%d,%d,%d,%d",
                         &fClip.fLeft, &fClip.fTop, &fClip.fRight, &fClip.fBottom)) {
@@ -759,15 +738,29 @@
         }
 
         while (fGMs) {
-            std::unique_ptr<skiagm::GM> gm(fGMs->get()(nullptr));
+            std::unique_ptr<skiagm::GM> gm = fGMs->get()();
             fGMs = fGMs->next();
             if (gm->runAsBench()) {
                 fSourceType = "gm";
                 fBenchType  = "micro";
-                return new GMBench(gm.release());
+                return new GMBench(std::move(gm));
             }
         }
 
+        while (fCurrentTextBlobTrace < fTextBlobTraces.count()) {
+            SkString path = fTextBlobTraces[fCurrentTextBlobTrace++];
+            SkString basename = SkOSPath::Basename(path.c_str());
+            static constexpr char kEnding[] = ".trace";
+            if (basename.endsWith(kEnding)) {
+                basename.remove(basename.size() - strlen(kEnding), strlen(kEnding));
+            }
+            fSourceType = "texttrace";
+            fBenchType  = "micro";
+            return CreateDiffCanvasBench(
+                    SkStringPrintf("SkDiffBench-%s", basename.c_str()),
+                    [path](){ return SkStream::MakeFromFile(path.c_str()); });
+        }
+
         // First add all .skps as RecordingBenches.
         while (fCurrentRecording < fSKPs.count()) {
             const SkString& path = fSKPs[fCurrentRecording++];
@@ -780,7 +773,7 @@
             fBenchType  = "recording";
             fSKPBytes = static_cast<double>(pic->approximateBytesUsed());
             fSKPOps   = pic->approximateOpCount();
-            return new RecordingBench(name.c_str(), pic.get(), FLAGS_bbh, FLAGS_lite);
+            return new RecordingBench(name.c_str(), pic.get(), FLAGS_bbh);
         }
 
         // Add all .skps as DeserializePictureBenchs.
@@ -856,9 +849,9 @@
 
                 fCurrentAnimSKP++;
                 SkString name = SkOSPath::Basename(path.c_str());
-                sk_sp<SKPAnimationBench::Animation> animation(
-                    SKPAnimationBench::CreateZoomAnimation(fZoomMax, fZoomPeriodMs));
-                return new SKPAnimationBench(name.c_str(), pic.get(), fClip, animation.get(),
+                sk_sp<SKPAnimationBench::Animation> animation =
+                    SKPAnimationBench::MakeZoomAnimation(fZoomMax, fZoomPeriodMs);
+                return new SKPAnimationBench(name.c_str(), pic.get(), fClip, std::move(animation),
                                              FLAGS_loopSKP);
             }
         }
@@ -1101,6 +1094,7 @@
     SkTArray<SkScalar> fScales;
     SkTArray<SkString> fSKPs;
     SkTArray<SkString> fSVGs;
+    SkTArray<SkString> fTextBlobTraces;
     SkTArray<bool>     fUseMPDs;
     SkTArray<SkString> fImages;
     SkTArray<SkColorType, true> fColorTypes;
@@ -1111,20 +1105,21 @@
 
     const char* fSourceType;  // What we're benching: bench, GM, SKP, ...
     const char* fBenchType;   // How we bench it: micro, recording, playback, ...
-    int fCurrentRecording;
-    int fCurrentDeserialPicture;
-    int fCurrentScale;
-    int fCurrentSKP;
-    int fCurrentSVG;
-    int fCurrentUseMPD;
-    int fCurrentCodec;
-    int fCurrentAndroidCodec;
-    int fCurrentBRDImage;
-    int fCurrentColorType;
-    int fCurrentAlphaType;
-    int fCurrentSubsetType;
-    int fCurrentSampleSize;
-    int fCurrentAnimSKP;
+    int fCurrentRecording = 0;
+    int fCurrentDeserialPicture = 0;
+    int fCurrentScale = 0;
+    int fCurrentSKP = 0;
+    int fCurrentSVG = 0;
+    int fCurrentTextBlobTrace = 0;
+    int fCurrentUseMPD = 0;
+    int fCurrentCodec = 0;
+    int fCurrentAndroidCodec = 0;
+    int fCurrentBRDImage = 0;
+    int fCurrentColorType = 0;
+    int fCurrentAlphaType = 0;
+    int fCurrentSubsetType = 0;
+    int fCurrentSampleSize = 0;
+    int fCurrentAnimSKP = 0;
 };
 
 // Some runs (mostly, Valgrind) are so slow that the bot framework thinks we've hung.
@@ -1174,7 +1169,9 @@
     std::unique_ptr<SkWStream> logStream(new SkNullWStream);
     if (!FLAGS_outResultsFile.isEmpty()) {
 #if defined(SK_RELEASE)
-        logStream.reset(new SkFILEWStream(FLAGS_outResultsFile[0]));
+        // SkJSONWriter uses a 32k in-memory cache, so it only flushes occasionally and is well
+        // equipped for a stream that re-opens, appends, and closes the file on every write.
+        logStream.reset(new NanoFILEAppendAndCloseStream(FLAGS_outResultsFile[0]));
 #else
         SkDebugf("I'm ignoring --outResultsFile because this is a Debug build.");
         return 1;
@@ -1236,6 +1233,7 @@
     int runs = 0;
     BenchmarkStream benchStream;
     log.beginObject("results");
+    AutoreleasePool pool;
     while (Benchmark* b = benchStream.next()) {
         std::unique_ptr<Benchmark> bench(b);
         if (CommandLineFlags::ShouldSkip(FLAGS_match, bench->getUniqueName())) {
@@ -1308,6 +1306,11 @@
                 }
             }
 
+            // Scale each result to the benchmark's own units, time/unit.
+            for (double& sample : samples) {
+                sample *= (1.0 / bench->getUnits());
+            }
+
             SkTArray<SkString> keys;
             SkTArray<double> values;
             bool gpuStatsDump = FLAGS_gpuStatsDump && Benchmark::kGPU_Backend == configs[i].backend;
@@ -1422,6 +1425,7 @@
                 SkDebugf("%s\n", bench->getUniqueName());
             }
             cleanup_run(target);
+            pool.drain();
         }
         if (!configs.empty()) {
             log.endBench();
diff --git a/bench/nanobench.h b/bench/nanobench.h
index fe63e04..73bcd3c 100644
--- a/bench/nanobench.h
+++ b/bench/nanobench.h
@@ -8,11 +8,11 @@
 #ifndef nanobench_DEFINED
 #define nanobench_DEFINED
 
-#include "Benchmark.h"
-#include "GrContextFactory.h"
-#include "SkImageInfo.h"
-#include "SkSurface.h"
-#include "SkTypes.h"
+#include "bench/Benchmark.h"
+#include "include/core/SkImageInfo.h"
+#include "include/core/SkSurface.h"
+#include "include/core/SkTypes.h"
+#include "tools/gpu/GrContextFactory.h"
 
 class SkBitmap;
 class SkCanvas;
diff --git a/bin/fetch-gn b/bin/fetch-gn
index d5e94a2..5d03fd3 100755
--- a/bin/fetch-gn
+++ b/bin/fetch-gn
@@ -16,9 +16,9 @@
 
 dst = 'bin/gn.exe' if 'win32' in sys.platform else 'bin/gn'
 
-sha1 = '2f27ff0b6118e5886df976da5effa6003d19d1ce' if 'linux'  in sys.platform else \
-       '9be792dd9010ce303a9c3a497a67bcc5ac8c7666' if 'darwin' in sys.platform else \
-       'eb69be2d984b4df60a8c21f598135991f0ad1742'  # Windows
+sha1 = '3523d50538357829725d4ed74b777a572ce0ac74' if 'linux'  in sys.platform else \
+       'd43122f6140d0711518aa909980cb009c4fbce3d' if 'darwin' in sys.platform else \
+       'e20768d93a6b4400de0d03bb8ceb46facdbe3883'  # Windows
 
 def sha1_of_file(path):
   h = hashlib.sha1()
diff --git a/bin/list-skia-bots b/bin/list-skia-bots
old mode 100644
new mode 100755
diff --git a/bin/sysopen b/bin/sysopen
index f104ab9..84100c2 100755
--- a/bin/sysopen
+++ b/bin/sysopen
@@ -7,14 +7,18 @@
 import subprocess
 import sys
 
+def spawn(cmd):
+  with open(os.devnull, 'w') as o:
+    subprocess.Popen(cmd, stdout=o, stderr=o)
+
 def sysopen(arg):
   plat = sys.platform
   if plat.startswith('darwin'):
-    subprocess.call(["open", arg])
+    spawn(["open", arg])
   elif plat.startswith('win'):
     os.startfile(arg)
   else:
-    subprocess.call(["xdg-open", arg])
+    spawn(["xdg-open", arg])
 
 if __name__ == '__main__':
   for a in sys.argv[1:]:
diff --git a/bin/try-clients b/bin/try-clients
new file mode 100755
index 0000000..8d9f9b4
--- /dev/null
+++ b/bin/try-clients
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+
+# Copyright 2019 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+base_dir=$(dirname "$0")
+
+python "$base_dir/try.py" "mac_chromium_compile_dbg|G3_Framework|Android_Framework|Build-.*-Flutter"
diff --git a/build_overrides/dawn.gni b/build_overrides/dawn.gni
new file mode 100644
index 0000000..771ef09
--- /dev/null
+++ b/build_overrides/dawn.gni
@@ -0,0 +1,18 @@
+# Copyright 2019 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# These are variables that are overridable by projects that include Dawn.
+
+# The paths to Dawn's dependencies. For now, we leave these unset to
+# use Dawn's DEPS. Eventually, we'll move to Skia's copies of as
+# many of these as possible. This will require updating Skia's
+# SPIRV-Tools and Shaderc at a minimum.
+
+# dawn_jinja2_dir = "//third_party/jinja2"
+# dawn_glfw_dir = "//third_party/glfw"
+# dawn_googletest_dir = "//third_party/googletest"
+# dawn_shaderc_dir = "//third_party/shaderc"
+# dawn_spirv_tools_dir = "//third_party/SPIRV-Tools"
+# dawn_spirv_cross_dir = "//third_party/spirv-cross"
diff --git a/dm/DM.cpp b/dm/DM.cpp
index 3658912..5c0fcac 100644
--- a/dm/DM.cpp
+++ b/dm/DM.cpp
@@ -5,39 +5,39 @@
  * found in the LICENSE file.
  */
 
-#include "ChromeTracingTracer.h"
-#include "CommonFlags.h"
-#include "CommonFlagsConfig.h"
-#include "DMJsonWriter.h"
-#include "DMSrcSink.h"
-#include "EventTracingPriv.h"
-#include "HashAndEncode.h"
-#include "ProcStats.h"
-#include "Resources.h"
-#include "SkBBHFactory.h"
-#include "SkChecksum.h"
-#include "SkCodec.h"
-#include "SkColorPriv.h"
-#include "SkColorSpace.h"
-#include "SkColorSpacePriv.h"
-#include "SkData.h"
-#include "SkDebugfTracer.h"
-#include "SkDocument.h"
-#include "SkFontMgr.h"
-#include "SkGraphics.h"
-#include "SkHalf.h"
-#include "SkLeanWindows.h"
-#include "SkMD5.h"
-#include "SkMutex.h"
-#include "SkOSFile.h"
-#include "SkOSPath.h"
-#include "SkSpinlock.h"
-#include "SkTHash.h"
-#include "SkTaskGroup.h"
-#include "SkTypeface_win.h"
-#include "Test.h"
-#include "ToolUtils.h"
-#include "ios_utils.h"
+#include "dm/DMJsonWriter.h"
+#include "dm/DMSrcSink.h"
+#include "include/codec/SkCodec.h"
+#include "include/core/SkBBHFactory.h"
+#include "include/core/SkColorPriv.h"
+#include "include/core/SkColorSpace.h"
+#include "include/core/SkData.h"
+#include "include/core/SkDocument.h"
+#include "include/core/SkFontMgr.h"
+#include "include/core/SkGraphics.h"
+#include "include/ports/SkTypeface_win.h"
+#include "include/private/SkChecksum.h"
+#include "include/private/SkHalf.h"
+#include "include/private/SkSpinlock.h"
+#include "include/private/SkTHash.h"
+#include "src/core/SkColorSpacePriv.h"
+#include "src/core/SkLeanWindows.h"
+#include "src/core/SkMD5.h"
+#include "src/core/SkOSFile.h"
+#include "src/core/SkTaskGroup.h"
+#include "src/utils/SkOSPath.h"
+#include "tests/Test.h"
+#include "tools/AutoreleasePool.h"
+#include "tools/HashAndEncode.h"
+#include "tools/ProcStats.h"
+#include "tools/Resources.h"
+#include "tools/ToolUtils.h"
+#include "tools/flags/CommonFlags.h"
+#include "tools/flags/CommonFlagsConfig.h"
+#include "tools/ios_utils.h"
+#include "tools/trace/ChromeTracingTracer.h"
+#include "tools/trace/EventTracingPriv.h"
+#include "tools/trace/SkDebugfTracer.h"
 
 #include <vector>
 
@@ -61,7 +61,6 @@
 static DEFINE_string(matrix, "1 0 0 1",
                     "2x2 scale+skew matrix to apply or upright when using "
                     "'matrix' or 'upright' in config.");
-static DEFINE_bool(gpu_threading, false, "Allow GPU work to run on multiple threads?");
 
 static DEFINE_string(blacklist, "",
         "Space-separated config/src/srcOptions/name quadruples to blacklist. "
@@ -145,6 +144,21 @@
                      "Space-separated key/value pairs to add to JSON identifying this run.");
 
 
+#if defined(__MSVC_RUNTIME_CHECKS)
+#include <rtcapi.h>
+int RuntimeCheckErrorFunc(int errorType, const char* filename, int linenumber,
+                          const char* moduleName, const char* fmt, ...) {
+    va_list args;
+    va_start(args, fmt);
+    vfprintf(stderr, fmt, args);
+    va_end(args);
+
+    SkDebugf("Line #%d\nFile: %s\nModule: %s\n",
+             linenumber, filename ? filename : "Unknown", moduleName ? moduleName : "Unknwon");
+    return 1;
+}
+#endif
+
 using namespace DM;
 using sk_gpu_test::GrContextFactory;
 using sk_gpu_test::GLTestContext;
@@ -152,11 +166,8 @@
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
-static constexpr skcms_TransferFunction k2020_TF =
-    {2.22222f, 0.909672f, 0.0903276f, 0.222222f, 0.0812429f, 0, 0};
-
 static sk_sp<SkColorSpace> rec2020() {
-    return SkColorSpace::MakeRGB(k2020_TF, SkNamedGamut::kRec2020);
+    return SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, SkNamedGamut::kRec2020);
 }
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
@@ -184,11 +195,11 @@
     }
 }
 
-SK_DECLARE_STATIC_MUTEX(gFailuresMutex);
 static SkTArray<SkString> gFailures;
 
 static void fail(const SkString& err) {
-    SkAutoMutexAcquire lock(gFailuresMutex);
+    static SkSpinlock mutex;
+    SkAutoSpinlock lock(mutex);
     SkDebugf("\n\nFAILURE: %s\n\n", err.c_str());
     gFailures.push_back(err);
 }
@@ -218,7 +229,7 @@
     vlog("done  %s\n", id.c_str());
     int pending;
     {
-        SkAutoMutexAcquire lock(gMutex);
+        SkAutoSpinlock lock(gMutex);
         for (int i = 0; i < gRunning.count(); i++) {
             if (gRunning[i].id == id) {
                 gRunning.removeShuffle(i);
@@ -236,7 +247,7 @@
         int curr = sk_tools::getCurrResidentSetSizeMB(),
             peak = sk_tools::getMaxResidentSetSizeMB();
 
-        SkAutoMutexAcquire lock(gMutex);
+        SkAutoSpinlock lock(gMutex);
         info("\n%dMB RAM, %dMB peak, %d queued, %d active:\n",
              curr, peak, gPending - gRunning.count(), gRunning.count());
         for (auto& task : gRunning) {
@@ -248,7 +259,7 @@
 static void start(const char* config, const char* src, const char* srcOptions, const char* name) {
     SkString id = SkStringPrintf("%s %s %s %s", config, src, srcOptions, name);
     vlog("start %s\n", id.c_str());
-    SkAutoMutexAcquire lock(gMutex);
+    SkAutoSpinlock lock(gMutex);
     gRunning.push_back({id,SkGetThreadID()});
 }
 
@@ -278,7 +289,7 @@
         #undef _
         };
 
-        SkAutoMutexAcquire lock(gMutex);
+        SkAutoSpinlock lock(gMutex);
 
         const DWORD code = e->ExceptionRecord->ExceptionCode;
         info("\nCaught exception %u", code);
@@ -317,7 +328,7 @@
     static void (*previous_handler[max_of(SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGSEGV,SIGTERM)+1])(int);
 
     static void crash_handler(int sig) {
-        SkAutoMutexAcquire lock(gMutex);
+        SkAutoSpinlock lock(gMutex);
 
         info("\nCaught signal %d [%s] (%dMB RAM, peak %dMB), was running:\n",
              sig, strsignal(sig),
@@ -909,34 +920,21 @@
 static Sink* create_sink(const GrContextOptions& grCtxOptions, const SkCommandLineConfig* config) {
     if (FLAGS_gpu) {
         if (const SkCommandLineConfigGpu* gpuConfig = config->asConfigGpu()) {
-            GrContextFactory::ContextType contextType = gpuConfig->getContextType();
-            GrContextFactory::ContextOverrides contextOverrides = gpuConfig->getContextOverrides();
             GrContextFactory testFactory(grCtxOptions);
-            if (!testFactory.get(contextType, contextOverrides)) {
+            if (!testFactory.get(gpuConfig->getContextType(), gpuConfig->getContextOverrides())) {
                 info("WARNING: can not create GPU context for config '%s'. "
                      "GM tests will be skipped.\n", gpuConfig->getTag().c_str());
                 return nullptr;
             }
             if (gpuConfig->getTestThreading()) {
                 SkASSERT(!gpuConfig->getTestPersistentCache());
-                return new GPUThreadTestingSink(
-                        contextType, contextOverrides, gpuConfig->getSurfType(),
-                        gpuConfig->getSamples(), gpuConfig->getUseDIText(),
-                        gpuConfig->getColorType(), gpuConfig->getAlphaType(),
-                        sk_ref_sp(gpuConfig->getColorSpace()), FLAGS_gpu_threading, grCtxOptions);
+                return new GPUThreadTestingSink(gpuConfig, grCtxOptions);
             } else if (gpuConfig->getTestPersistentCache()) {
-                return new GPUPersistentCacheTestingSink(
-                        contextType, contextOverrides, gpuConfig->getSurfType(),
-                        gpuConfig->getSamples(), gpuConfig->getUseDIText(),
-                        gpuConfig->getColorType(), gpuConfig->getAlphaType(),
-                        sk_ref_sp(gpuConfig->getColorSpace()), FLAGS_gpu_threading, grCtxOptions,
-                        gpuConfig->getTestPersistentCache());
+                return new GPUPersistentCacheTestingSink(gpuConfig, grCtxOptions);
+            } else if (gpuConfig->getTestPrecompile()) {
+                return new GPUPrecompileTestingSink(gpuConfig, grCtxOptions);
             } else {
-                return new GPUSink(contextType, contextOverrides, gpuConfig->getSurfType(),
-                                   gpuConfig->getSamples(), gpuConfig->getUseDIText(),
-                                   gpuConfig->getColorType(), gpuConfig->getAlphaType(),
-                                   sk_ref_sp(gpuConfig->getColorSpace()), FLAGS_gpu_threading,
-                                   grCtxOptions);
+                return new GPUSink(gpuConfig, grCtxOptions);
             }
         }
     }
@@ -995,7 +993,6 @@
 
 static Sink* create_via(const SkString& tag, Sink* wrapped) {
 #define VIA(t, via, ...) if (tag.equals(t)) return new via(__VA_ARGS__)
-    VIA("lite",      ViaLite,              wrapped);
 #ifdef TEST_VIA_SVG
     VIA("svg",       ViaSVG,               wrapped);
 #endif
@@ -1025,6 +1022,7 @@
 static bool gather_sinks(const GrContextOptions& grCtxOptions, bool defaultConfigs) {
     SkCommandLineConfigArray configs;
     ParseConfigs(FLAGS_config, &configs);
+    AutoreleasePool pool;
     for (int i = 0; i < configs.count(); i++) {
         const SkCommandLineConfig& config = *configs[i];
         Sink* sink = create_sink(grCtxOptions, &config);
@@ -1098,6 +1096,7 @@
     const TaggedSink& sink;
 
     static void Run(const Task& task) {
+        AutoreleasePool pool;
         SkString name = task.src->name();
 
         SkString log;
@@ -1227,25 +1226,40 @@
             return SkString("untagged");
         }
 
-        skcms_TransferFunction tf;
-        if (cs->isNumericalTransferFn(&tf)) {
-            auto eq = [](skcms_TransferFunction x, skcms_TransferFunction y) {
-                return x.g == y.g
-                    && x.a == y.a
-                    && x.b == y.b
-                    && x.c == y.c
-                    && x.d == y.d
-                    && x.e == y.e
-                    && x.f == y.f;
-            };
+        auto eq = [](skcms_TransferFunction x, skcms_TransferFunction y) {
+            return x.g == y.g
+                && x.a == y.a
+                && x.b == y.b
+                && x.c == y.c
+                && x.d == y.d
+                && x.e == y.e
+                && x.f == y.f;
+        };
 
-            if (tf.a == 1 && tf.b == 0 && tf.c == 0 && tf.d == 0 && tf.e == 0 && tf.f == 0) {
-                return SkStringPrintf("gamma %.3g", tf.g);
-            }
-            if (eq(tf, SkNamedTransferFn::kSRGB)) { return SkString("sRGB"); }
-            if (eq(tf, k2020_TF                )) { return SkString("2020"); }
-            return SkStringPrintf("%.3g %.3g %.3g %.3g %.3g %.3g %.3g",
-                                  tf.g, tf.a, tf.b, tf.c, tf.d, tf.e, tf.f);
+        skcms_TransferFunction tf;
+        cs->transferFn(&tf.g);
+        switch (classify_transfer_fn(tf)) {
+            case sRGBish_TF:
+                if (tf.a == 1 && tf.b == 0 && tf.c == 0 && tf.d == 0 && tf.e == 0 && tf.f == 0) {
+                    return SkStringPrintf("gamma %.3g", tf.g);
+                }
+                if (eq(tf, SkNamedTransferFn::kSRGB)) { return SkString("sRGB"); }
+                if (eq(tf, SkNamedTransferFn::kRec2020)) { return SkString("2020"); }
+                return SkStringPrintf("%.3g %.3g %.3g %.3g %.3g %.3g %.3g",
+                                        tf.g, tf.a, tf.b, tf.c, tf.d, tf.e, tf.f);
+
+            case PQish_TF:
+                if (eq(tf, SkNamedTransferFn::kPQ)) { return SkString("PQ"); }
+                return SkStringPrintf("PQish %.3g %.3g %.3g %.3g %.3g %.3g",
+                                      tf.a, tf.b, tf.c, tf.d, tf.e, tf.f);
+
+            case HLGish_TF:
+                if (eq(tf, SkNamedTransferFn::kHLG)) { return SkString("HLG"); }
+                return SkStringPrintf("HLGish %.3g %.3g %.3g %.3g %.3g",
+                                      tf.a, tf.b, tf.c, tf.d, tf.e);
+
+            case HLGinvish_TF: break;
+            case Bad_TF: break;
         }
         return SkString("non-numeric");
     }
@@ -1349,7 +1363,7 @@
             continue;
         }
         if (test.needsGpu && FLAGS_gpu) {
-            (FLAGS_gpu_threading ? gParallelTests : gSerialTests).push_back(test);
+            gSerialTests.push_back(test);
         } else if (!test.needsGpu && FLAGS_cpu) {
             gParallelTests.push_back(test);
         }
@@ -1368,6 +1382,7 @@
     } reporter;
 
     if (!FLAGS_dryRun && !is_blacklisted("_", "tests", "_", test.name)) {
+        AutoreleasePool pool;
         GrContextOptions options = grCtxOptions;
         test.modifyGrContextOptions(&options);
 
@@ -1381,6 +1396,9 @@
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
 int main(int argc, char** argv) {
+#if defined(__MSVC_RUNTIME_CHECKS)
+    _RTC_SetErrorFunc(RuntimeCheckErrorFunc);
+#endif
 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) && defined(SK_HAS_HEIF_LIBRARY)
     android::ProcessState::self()->startThreadPool();
 #endif
@@ -1453,7 +1471,7 @@
         if (src->veto(sink->flags()) ||
             is_blacklisted(sink.tag.c_str(), src.tag.c_str(),
                            src.options.c_str(), src->name().c_str())) {
-            SkAutoMutexAcquire lock(gMutex);
+            SkAutoSpinlock lock(gMutex);
             gPending--;
             continue;
         }
diff --git a/dm/DMGpuTestProcs.cpp b/dm/DMGpuTestProcs.cpp
index 2be645a..70c4799 100644
--- a/dm/DMGpuTestProcs.cpp
+++ b/dm/DMGpuTestProcs.cpp
@@ -5,7 +5,7 @@
  * found in the LICENSE file.
  */
 
-#include "Test.h"
+#include "tests/Test.h"
 
 using sk_gpu_test::GrContextFactory;
 using sk_gpu_test::GLTestContext;
@@ -25,6 +25,10 @@
 bool IsRenderingGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
     return IsGLContextType(type) && GrContextFactory::IsRenderingContext(type);
 }
+bool IsRenderingGLOrMetalContextType(sk_gpu_test::GrContextFactory::ContextType type) {
+    return (IsGLContextType(type) || IsMetalContextType(type)) &&
+           GrContextFactory::IsRenderingContext(type);
+}
 bool IsMockContextType(sk_gpu_test::GrContextFactory::ContextType type) {
     return type == GrContextFactory::kMock_ContextType;
 }
@@ -52,8 +56,7 @@
         // also tracks which of its contexts is current above that API and gets tripped up if the
         // native windowing API is used directly outside of the command buffer code.
         GrContextFactory factory(options);
-        ContextInfo ctxInfo = factory.getContextInfo(
-                contextType, GrContextFactory::ContextOverrides::kDisableNVPR);
+        ContextInfo ctxInfo = factory.getContextInfo(contextType);
         if (contextTypeFilter && !(*contextTypeFilter)(contextType)) {
             continue;
         }
@@ -63,12 +66,6 @@
             (*test)(reporter, ctxInfo);
             ctxInfo.grContext()->flush();
         }
-        ctxInfo = factory.getContextInfo(contextType,
-                                         GrContextFactory::ContextOverrides::kRequireNVPRSupport);
-        if (ctxInfo.grContext()) {
-            (*test)(reporter, ctxInfo);
-            ctxInfo.grContext()->flush();
-        }
     }
 }
 } // namespace skiatest
diff --git a/dm/DMJsonWriter.cpp b/dm/DMJsonWriter.cpp
index 1879666..f0d6a8d 100644
--- a/dm/DMJsonWriter.cpp
+++ b/dm/DMJsonWriter.cpp
@@ -5,25 +5,29 @@
  * found in the LICENSE file.
  */
 
-#include "DMJsonWriter.h"
+#include "dm/DMJsonWriter.h"
 
-#include "ProcStats.h"
-#include "SkData.h"
-#include "SkJSON.h"
-#include "SkJSONWriter.h"
-#include "SkMutex.h"
-#include "SkOSFile.h"
-#include "SkOSPath.h"
-#include "SkStream.h"
-#include "SkTArray.h"
+#include "include/core/SkData.h"
+#include "include/core/SkStream.h"
+#include "include/private/SkMutex.h"
+#include "include/private/SkTArray.h"
+#include "src/core/SkOSFile.h"
+#include "src/utils/SkJSON.h"
+#include "src/utils/SkJSONWriter.h"
+#include "src/utils/SkOSPath.h"
+#include "tools/ProcStats.h"
 
 namespace DM {
 
 SkTArray<JsonWriter::BitmapResult> gBitmapResults;
-SK_DECLARE_STATIC_MUTEX(gBitmapResultLock);
+static SkMutex& bitmap_result_mutex() {
+    static SkMutex& mutex = *(new SkMutex);
+    return mutex;
+}
+
 
 void JsonWriter::AddBitmapResult(const BitmapResult& result) {
-    SkAutoMutexAcquire lock(&gBitmapResultLock);
+    SkAutoMutexExclusive lock(bitmap_result_mutex());
     gBitmapResults.push_back(result);
 }
 
@@ -57,7 +61,7 @@
     }
 
     {
-        SkAutoMutexAcquire lock(&gBitmapResultLock);
+        SkAutoMutexExclusive lock(bitmap_result_mutex());
         writer.beginArray("results");
         for (int i = 0; i < gBitmapResults.count(); i++) {
             writer.beginObject();
diff --git a/dm/DMJsonWriter.h b/dm/DMJsonWriter.h
index c8cd3fc..acf8a3f 100644
--- a/dm/DMJsonWriter.h
+++ b/dm/DMJsonWriter.h
@@ -8,8 +8,8 @@
 #ifndef DMJsonWriter_DEFINED
 #define DMJsonWriter_DEFINED
 
-#include "CommandLineFlags.h"
-#include "SkString.h"
+#include "include/core/SkString.h"
+#include "tools/flags/CommandLineFlags.h"
 
 namespace DM {
 
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 86a51ef..b72c830 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -5,77 +5,74 @@
  * found in the LICENSE file.
  */
 
-#include "DMSrcSink.h"
-#include "DDLPromiseImageHelper.h"
-#include "DDLTileHelper.h"
-#include "DebugCanvas.h"
-#include "GrBackendSurface.h"
-#include "GrContextPriv.h"
-#include "GrGpu.h"
-#include "MemoryCache.h"
-#include "Resources.h"
-#include "SkAndroidCodec.h"
-#include "SkAutoMalloc.h"
-#include "SkAutoPixmapStorage.h"
-#include "SkCodec.h"
-#include "SkCodecImageGenerator.h"
-#include "SkColorSpace.h"
-#include "SkData.h"
-#include "SkDeferredDisplayListRecorder.h"
-#include "SkDocument.h"
-#include "SkExecutor.h"
-#include "SkImageGenerator.h"
-#include "SkImageGeneratorCG.h"
-#include "SkImageGeneratorWIC.h"
-#include "SkImageInfoPriv.h"
-#include "SkLiteDL.h"
-#include "SkLiteRecorder.h"
-#include "SkMakeUnique.h"
-#include "SkMallocPixelRef.h"
-#include "SkMultiPictureDocumentPriv.h"
-#include "SkMultiPictureDraw.h"
-#include "SkNullCanvas.h"
-#include "SkOSFile.h"
-#include "SkOSPath.h"
-#include "SkOpts.h"
-#include "SkPDFDocument.h"
-#include "SkPictureCommon.h"
-#include "SkPictureData.h"
-#include "SkPictureRecorder.h"
-#include "SkRandom.h"
-#include "SkRecordDraw.h"
-#include "SkRecorder.h"
-#include "SkStream.h"
-#include "SkSurface.h"
-#include "SkSurfaceCharacterization.h"
-#include "SkSwizzler.h"
-#include "SkTLogic.h"
-#include "SkTaskGroup.h"
+#include "dm/DMSrcSink.h"
+#include "include/codec/SkAndroidCodec.h"
+#include "include/codec/SkCodec.h"
+#include "include/core/SkColorSpace.h"
+#include "include/core/SkData.h"
+#include "include/core/SkDeferredDisplayListRecorder.h"
+#include "include/core/SkDocument.h"
+#include "include/core/SkExecutor.h"
+#include "include/core/SkImageGenerator.h"
+#include "include/core/SkMallocPixelRef.h"
+#include "include/core/SkMultiPictureDraw.h"
+#include "include/core/SkPictureRecorder.h"
+#include "include/core/SkStream.h"
+#include "include/core/SkSurface.h"
+#include "include/core/SkSurfaceCharacterization.h"
+#include "include/docs/SkPDFDocument.h"
+#include "include/gpu/GrBackendSurface.h"
+#include "include/ports/SkImageGeneratorCG.h"
+#include "include/ports/SkImageGeneratorWIC.h"
+#include "include/private/SkImageInfoPriv.h"
+#include "include/private/SkTLogic.h"
+#include "include/third_party/skcms/skcms.h"
+#include "include/utils/SkNullCanvas.h"
+#include "include/utils/SkRandom.h"
+#include "src/codec/SkCodecImageGenerator.h"
+#include "src/codec/SkSwizzler.h"
+#include "src/core/SkAutoMalloc.h"
+#include "src/core/SkAutoPixmapStorage.h"
+#include "src/core/SkMakeUnique.h"
+#include "src/core/SkOSFile.h"
+#include "src/core/SkOpts.h"
+#include "src/core/SkPictureCommon.h"
+#include "src/core/SkPictureData.h"
+#include "src/core/SkRecordDraw.h"
+#include "src/core/SkRecorder.h"
+#include "src/core/SkTaskGroup.h"
+#include "src/gpu/GrContextPriv.h"
+#include "src/gpu/GrGpu.h"
+#include "src/utils/SkMultiPictureDocumentPriv.h"
+#include "src/utils/SkOSPath.h"
+#include "tools/DDLPromiseImageHelper.h"
+#include "tools/DDLTileHelper.h"
+#include "tools/Resources.h"
+#include "tools/debugger/DebugCanvas.h"
+#include "tools/gpu/MemoryCache.h"
 #if defined(SK_BUILD_FOR_WIN)
-    #include "SkAutoCoInitialize.h"
-    #include "SkHRESULT.h"
-    #include "SkTScopedComPtr.h"
-    #include "SkXPSDocument.h"
+    #include "include/docs/SkXPSDocument.h"
+    #include "src/utils/win/SkAutoCoInitialize.h"
+    #include "src/utils/win/SkHRESULT.h"
+    #include "src/utils/win/SkTScopedComPtr.h"
     #include <XpsObjectModel.h>
 #endif
 
 #if defined(SK_ENABLE_SKOTTIE)
-    #include "Skottie.h"
-    #include "SkottieUtils.h"
+    #include "modules/skottie/include/Skottie.h"
+    #include "modules/skottie/utils/SkottieUtils.h"
 #endif
 
 #if defined(SK_XML)
-    #include "SkSVGCanvas.h"
-    #include "SkSVGDOM.h"
-    #include "SkXMLWriter.h"
+    #include "experimental/svg/model/SkSVGDOM.h"
+    #include "include/svg/SkSVGCanvas.h"
+    #include "src/xml/SkXMLWriter.h"
 #endif
-#include "TestUtils.h"
+#include "tests/TestUtils.h"
 
 #include <cmath>
 #include <functional>
 
-#include "../third_party/skcms/skcms.h"
-
 static DEFINE_bool(multiPage, false,
                    "For document-type backends, render the source into multiple pages");
 static DEFINE_bool(RAW_threading, true, "Allow RAW decodes to run on multiple threads?");
@@ -89,7 +86,7 @@
 GMSrc::GMSrc(skiagm::GMFactory factory) : fFactory(factory) {}
 
 Error GMSrc::draw(SkCanvas* canvas) const {
-    std::unique_ptr<skiagm::GM> gm(fFactory(nullptr));
+    std::unique_ptr<skiagm::GM> gm(fFactory());
     SkString errorMsg;
     skiagm::DrawResult drawResult = gm->draw(canvas, &errorMsg);
     if (skiagm::DrawResult::kSkip == drawResult) {
@@ -99,17 +96,17 @@
 }
 
 SkISize GMSrc::size() const {
-    std::unique_ptr<skiagm::GM> gm(fFactory(nullptr));
+    std::unique_ptr<skiagm::GM> gm(fFactory());
     return gm->getISize();
 }
 
 Name GMSrc::name() const {
-    std::unique_ptr<skiagm::GM> gm(fFactory(nullptr));
+    std::unique_ptr<skiagm::GM> gm(fFactory());
     return gm->getName();
 }
 
 void GMSrc::modifyGrContextOptions(GrContextOptions* options) const {
-    std::unique_ptr<skiagm::GM> gm(fFactory(nullptr));
+    std::unique_ptr<skiagm::GM> gm(fFactory());
     gm->modifyGrContextOptions(options);
 }
 
@@ -416,7 +413,7 @@
     if ((size.width() <= 10 || size.height() <= 10) && 1.0f != fScale) {
         return Error::Nonfatal("Scaling very small images is uninteresting.");
     }
-    decodeInfo = decodeInfo.makeWH(size.width(), size.height());
+    decodeInfo = decodeInfo.makeDimensions(size);
 
     const int bpp = decodeInfo.bytesPerPixel();
     const size_t rowBytes = size.width() * bpp;
@@ -797,7 +794,7 @@
     if ((size.width() <= 10 || size.height() <= 10) && 1 != fSampleSize) {
         return Error::Nonfatal("Scaling very small images is uninteresting.");
     }
-    decodeInfo = decodeInfo.makeWH(size.width(), size.height());
+    decodeInfo = decodeInfo.makeDimensions(size);
 
     int bpp = decodeInfo.bytesPerPixel();
     size_t rowBytes = size.width() * bpp;
@@ -979,8 +976,7 @@
 
     SkImageInfo info = codec->getInfo();
     if (fDecodeToDst) {
-        info = canvas->imageInfo().makeWH(info.width(),
-                                          info.height());
+        info = canvas->imageInfo().makeDimensions(info.dimensions());
     }
 
     SkBitmap bitmap;
@@ -1121,7 +1117,10 @@
 Error SkottieSrc::draw(SkCanvas* canvas) const {
     auto animation = skottie::Animation::Builder()
         .setResourceProvider(
-                skottie_utils::FileResourceProvider::Make(SkOSPath::Dirname(fPath.c_str())))
+                skottie_utils::DataURIResourceProviderProxy::Make(
+                    skottie_utils::FileResourceProvider::Make(SkOSPath::Dirname(fPath.c_str()),
+                                                              /*predecode=*/true),
+                    /*predecode=*/true))
         .makeFromFile(fPath.c_str());
     if (!animation) {
         return SkStringPrintf("Unable to parse file: %s", fPath.c_str());
@@ -1304,14 +1303,14 @@
     if (0 != memcmp(reference.getPixels(), bitmap.getPixels(), reference.computeByteSize())) {
         SkString encoded;
         SkString errString("Pixels don't match reference");
-        if (bitmap_to_base64_data_uri(reference, &encoded)) {
+        if (BipmapToBase64DataURI(reference, &encoded)) {
             errString.append("\nExpected: ");
             errString.append(encoded);
         } else {
             errString.append("\nExpected image failed to encode: ");
             errString.append(encoded);
         }
-        if (bitmap_to_base64_data_uri(bitmap, &encoded)) {
+        if (BipmapToBase64DataURI(bitmap, &encoded)) {
             errString.append("\nActual: ");
             errString.append(encoded);
         } else {
@@ -1334,34 +1333,31 @@
                    "Test releasing all gpu resources and abandoning the GrContext "
                    "after running each test");
 static DEFINE_bool(drawOpClip, false, "Clip each GrDrawOp to its device bounds for testing.");
+static DEFINE_bool(programBinaryCache, true, "Use in-memory program binary cache");
 
-GPUSink::GPUSink(GrContextFactory::ContextType ct,
-                 GrContextFactory::ContextOverrides overrides,
-                 SkCommandLineConfigGpu::SurfType surfType,
-                 int samples,
-                 bool diText,
-                 SkColorType colorType,
-                 SkAlphaType alphaType,
-                 sk_sp<SkColorSpace> colorSpace,
-                 bool threaded,
+GPUSink::GPUSink(const SkCommandLineConfigGpu* config,
                  const GrContextOptions& grCtxOptions)
-        : fContextType(ct)
-        , fContextOverrides(overrides)
-        , fSurfType(surfType)
-        , fSampleCount(samples)
-        , fUseDIText(diText)
-        , fColorType(colorType)
-        , fAlphaType(alphaType)
-        , fColorSpace(std::move(colorSpace))
-        , fThreaded(threaded)
-        , fBaseContextOptions(grCtxOptions) {}
+        : fContextType(config->getContextType())
+        , fContextOverrides(config->getContextOverrides())
+        , fSurfType(config->getSurfType())
+        , fSampleCount(config->getSamples())
+        , fUseDIText(config->getUseDIText())
+        , fColorType(config->getColorType())
+        , fAlphaType(config->getAlphaType())
+        , fColorSpace(sk_ref_sp(config->getColorSpace()))
+        , fBaseContextOptions(grCtxOptions) {
+    if (FLAGS_programBinaryCache) {
+        fBaseContextOptions.fPersistentCache = &fMemoryCache;
+    }
+}
 
 Error GPUSink::draw(const Src& src, SkBitmap* dst, SkWStream* dstStream, SkString* log) const {
     return this->onDraw(src, dst, dstStream, log, fBaseContextOptions);
 }
 
 Error GPUSink::onDraw(const Src& src, SkBitmap* dst, SkWStream*, SkString* log,
-                      const GrContextOptions& baseOptions) const {
+                      const GrContextOptions& baseOptions,
+                      std::function<void(GrContext*)> initContext) const {
     GrContextOptions grOptions = baseOptions;
 
     // We don't expect the src to mess with the persistent cache or the executor.
@@ -1373,10 +1369,12 @@
 
     GrContextFactory factory(grOptions);
     const SkISize size = src.size();
-    SkImageInfo info =
-            SkImageInfo::Make(size.width(), size.height(), fColorType, fAlphaType, fColorSpace);
+    SkImageInfo info = SkImageInfo::Make(size, fColorType, fAlphaType, fColorSpace);
     sk_sp<SkSurface> surface;
     GrContext* context = factory.getContextInfo(fContextType, fContextOverrides).grContext();
+    if (initContext) {
+        initContext(context);
+    }
     const int maxDimension = context->priv().caps()->maxTextureSize();
     if (maxDimension < SkTMax(size.width(), size.height())) {
         return Error::Nonfatal("Src too large to create a texture.\n");
@@ -1391,8 +1389,9 @@
                                                   &props);
             break;
         case SkCommandLineConfigGpu::SurfType::kBackendTexture:
-            backendTexture = context->priv().getGpu()->createTestingOnlyBackendTexture(
-                    nullptr, info.width(), info.height(), info.colorType(), true, GrMipMapped::kNo);
+            backendTexture = context->createBackendTexture(
+                    info.width(), info.height(), info.colorType(), SkColors::kTransparent,
+                    GrMipMapped::kNo, GrRenderable::kYes, GrProtected::kNo);
             surface = SkSurface::MakeFromBackendTexture(context, backendTexture,
                                                         kTopLeft_GrSurfaceOrigin, fSampleCount,
                                                         fColorType, info.refColorSpace(), &props);
@@ -1429,8 +1428,7 @@
         info.colorType() == kRGB_888x_SkColorType) {
         // We don't currently support readbacks into these formats on the GPU backend. Convert to
         // 32 bit.
-        info = SkImageInfo::Make(size.width(), size.height(), kRGBA_8888_SkColorType,
-                                 kPremul_SkAlphaType, fColorSpace);
+        info = SkImageInfo::Make(size, kRGBA_8888_SkColorType, kPremul_SkAlphaType, fColorSpace);
     }
     dst->allocPixels(info);
     canvas->readPixels(*dst, 0, 0);
@@ -1442,7 +1440,7 @@
     if (!context->abandoned()) {
         surface.reset();
         if (backendTexture.isValid()) {
-            context->priv().getGpu()->deleteTestingOnlyBackendTexture(backendTexture);
+            context->deleteBackendTexture(backendTexture);
         }
         if (backendRT.isValid()) {
             context->priv().getGpu()->deleteTestingOnlyBackendRenderTarget(backendRT);
@@ -1456,18 +1454,9 @@
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
-GPUThreadTestingSink::GPUThreadTestingSink(GrContextFactory::ContextType ct,
-                                           GrContextFactory::ContextOverrides overrides,
-                                           SkCommandLineConfigGpu::SurfType surfType,
-                                           int samples,
-                                           bool diText,
-                                           SkColorType colorType,
-                                           SkAlphaType alphaType,
-                                           sk_sp<SkColorSpace> colorSpace,
-                                           bool threaded,
+GPUThreadTestingSink::GPUThreadTestingSink(const SkCommandLineConfigGpu* config,
                                            const GrContextOptions& grCtxOptions)
-        : INHERITED(ct, overrides, surfType, samples, diText, colorType, alphaType,
-                    std::move(colorSpace), threaded, grCtxOptions)
+        : INHERITED(config, grCtxOptions)
         , fExecutor(SkExecutor::MakeFIFOThreadPool(FLAGS_gpuThreads)) {
     SkASSERT(fExecutor);
 }
@@ -1500,21 +1489,10 @@
 
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
-GPUPersistentCacheTestingSink::GPUPersistentCacheTestingSink(
-        GrContextFactory::ContextType ct,
-        GrContextFactory::ContextOverrides overrides,
-        SkCommandLineConfigGpu::SurfType surfType,
-        int samples,
-        bool diText,
-        SkColorType colorType,
-        SkAlphaType alphaType,
-        sk_sp<SkColorSpace> colorSpace,
-        bool threaded,
-        const GrContextOptions& grCtxOptions,
-        int cacheType)
-        : INHERITED(ct, overrides, surfType, samples, diText, colorType, alphaType,
-                    std::move(colorSpace), threaded, grCtxOptions)
-        , fCacheType(cacheType) {}
+GPUPersistentCacheTestingSink::GPUPersistentCacheTestingSink(const SkCommandLineConfigGpu* config,
+                                                             const GrContextOptions& grCtxOptions)
+    : INHERITED(config, grCtxOptions)
+    , fCacheType(config->getTestPersistentCache()) {}
 
 Error GPUPersistentCacheTestingSink::draw(const Src& src, SkBitmap* dst, SkWStream* wStream,
                                           SkString* log) const {
@@ -1523,7 +1501,12 @@
     sk_gpu_test::MemoryCache memoryCache;
     GrContextOptions contextOptions = this->baseContextOptions();
     contextOptions.fPersistentCache = &memoryCache;
-    contextOptions.fDisallowGLSLBinaryCaching = (fCacheType == 2);
+    if (fCacheType == 2) {
+        contextOptions.fShaderCacheStrategy = GrContextOptions::ShaderCacheStrategy::kBackendSource;
+    }
+    // anglebug.com/3619
+    contextOptions.fGpuPathRenderers =
+            contextOptions.fGpuPathRenderers & ~GpuPathRenderers::kStencilAndCover;
 
     Error err = this->onDraw(src, dst, wStream, log, contextOptions);
     if (!err.isEmpty() || !dst) {
@@ -1543,6 +1526,61 @@
     return compare_bitmaps(reference, *dst);
 }
 
+
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
+
+GPUPrecompileTestingSink::GPUPrecompileTestingSink(const SkCommandLineConfigGpu* config,
+                                                   const GrContextOptions& grCtxOptions)
+    : INHERITED(config, grCtxOptions) {}
+
+Error GPUPrecompileTestingSink::draw(const Src& src, SkBitmap* dst, SkWStream* wStream,
+                                     SkString* log) const {
+    // Three step process:
+    // 1) Draw once with an SkSL cache, and store off the shader blobs.
+    // 2) For the second context, pre-compile the shaders to warm the cache.
+    // 3) Draw with the second context, ensuring that we get the same result, and no cache misses.
+    sk_gpu_test::MemoryCache memoryCache;
+    GrContextOptions contextOptions = this->baseContextOptions();
+    contextOptions.fPersistentCache = &memoryCache;
+    contextOptions.fShaderCacheStrategy = GrContextOptions::ShaderCacheStrategy::kSkSL;
+    // anglebug.com/3619 means that we don't cache shaders when we're using NVPR. That prevents
+    // the precompile from working, so we'll trigger the assert at the end of this test.
+    contextOptions.fGpuPathRenderers =
+            contextOptions.fGpuPathRenderers & ~GpuPathRenderers::kStencilAndCover;
+
+    Error err = this->onDraw(src, dst, wStream, log, contextOptions);
+    if (!err.isEmpty() || !dst) {
+        return err;
+    }
+
+    auto precompileShaders = [&memoryCache](GrContext* context) {
+        memoryCache.foreach([context](sk_sp<const SkData> key, sk_sp<SkData> data, int /*count*/) {
+            SkAssertResult(context->precompileShader(*key, *data));
+        });
+    };
+
+    sk_gpu_test::MemoryCache replayCache;
+    GrContextOptions replayOptions = this->baseContextOptions();
+    // Ensure that the runtime cache is large enough to hold all of the shaders we pre-compile
+    replayOptions.fRuntimeProgramCacheSize = memoryCache.numCacheMisses();
+    replayOptions.fPersistentCache = &replayCache;
+    // anglebug.com/3619
+    replayOptions.fGpuPathRenderers =
+            replayOptions.fGpuPathRenderers & ~GpuPathRenderers::kStencilAndCover;
+
+    SkBitmap reference;
+    SkString refLog;
+    SkDynamicMemoryWStream refStream;
+    Error refErr = this->onDraw(src, &reference, &refStream, &refLog, replayOptions,
+                                precompileShaders);
+    if (!refErr.isEmpty()) {
+        return refErr;
+    }
+    SkASSERT(!replayCache.numCacheMisses());
+
+    return compare_bitmaps(reference, *dst);
+}
+
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 static Error draw_skdocument(const Src& src, SkDocument* doc, SkWStream* dst) {
     if (src.size().isEmpty()) {
@@ -1691,8 +1729,7 @@
     SkAlphaType alphaType = kPremul_SkAlphaType;
     (void)SkColorTypeValidateAlphaType(fColorType, alphaType, &alphaType);
 
-    dst->allocPixelsFlags(SkImageInfo::Make(size.width(), size.height(),
-                                            fColorType, alphaType, fColorSpace),
+    dst->allocPixelsFlags(SkImageInfo::Make(size, fColorType, alphaType, fColorSpace),
                           SkBitmap::kZeroPixels_AllocFlag);
 
     SkCanvas canvas(*dst);
@@ -1786,7 +1823,7 @@
 
     SkBitmap uprighted;
     SkISize size = auto_compute_translate(&upright, bitmap->width(), bitmap->height());
-    uprighted.allocPixels(bitmap->info().makeWH(size.width(), size.height()));
+    uprighted.allocPixels(bitmap->info().makeDimensions(size));
 
     SkCanvas canvas(uprighted);
     canvas.concat(upright);
@@ -1976,9 +2013,9 @@
 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 
 #ifdef TEST_VIA_SVG
-#include "SkXMLWriter.h"
-#include "SkSVGCanvas.h"
-#include "SkSVGDOM.h"
+#include "experimental/svg/model/SkSVGDOM.h"
+#include "include/svg/SkSVGCanvas.h"
+#include "src/xml/SkXMLWriter.h"
 
 Error ViaSVG::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const {
     auto size = src.size();
@@ -2000,28 +2037,4 @@
 }
 #endif
 
-/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
-
-Error ViaLite::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const {
-    auto size = src.size();
-    SkIRect bounds = {0,0, size.width(), size.height()};
-    Error err = draw_to_canvas(fSink.get(), bitmap, stream, log, size, [&](SkCanvas* canvas) {
-        SkLiteDL dl;
-        SkLiteRecorder rec;
-        rec.reset(&dl, bounds);
-
-        Error err = src.draw(&rec);
-        if (!err.isEmpty()) {
-            return err;
-        }
-        dl.draw(canvas);
-        return err;
-    });
-    if (!err.isEmpty()) {
-        return err;
-    }
-
-    return check_against_reference(bitmap, src, fSink.get());
-}
-
 }  // namespace DM
diff --git a/dm/DMSrcSink.h b/dm/DMSrcSink.h
index 54f7c4d..5b7338b 100644
--- a/dm/DMSrcSink.h
+++ b/dm/DMSrcSink.h
@@ -8,16 +8,19 @@
 #ifndef DMSrcSink_DEFINED
 #define DMSrcSink_DEFINED
 
-#include "CommonFlagsConfig.h"
-#include "SkBBHFactory.h"
-#include "SkBBoxHierarchy.h"
-#include "SkBitmap.h"
-#include "SkBitmapRegionDecoder.h"
-#include "SkCanvas.h"
-#include "SkData.h"
-#include "SkMultiPictureDocument.h"
-#include "SkPicture.h"
-#include "gm.h"
+#include "gm/gm.h"
+#include "include/android/SkBitmapRegionDecoder.h"
+#include "include/core/SkBBHFactory.h"
+#include "include/core/SkBitmap.h"
+#include "include/core/SkCanvas.h"
+#include "include/core/SkData.h"
+#include "include/core/SkPicture.h"
+#include "src/core/SkBBoxHierarchy.h"
+#include "src/utils/SkMultiPictureDocument.h"
+#include "tools/flags/CommonFlagsConfig.h"
+#include "tools/gpu/MemoryCache.h"
+
+#include <functional>
 
 //#define TEST_VIA_SVG
 
@@ -327,15 +330,12 @@
 
 class GPUSink : public Sink {
 public:
-    GPUSink(sk_gpu_test::GrContextFactory::ContextType,
-            sk_gpu_test::GrContextFactory::ContextOverrides,
-            SkCommandLineConfigGpu::SurfType surfType, int samples, bool diText,
-            SkColorType colorType, SkAlphaType alphaType, sk_sp<SkColorSpace> colorSpace,
-            bool threaded, const GrContextOptions& grCtxOptions);
+    GPUSink(const SkCommandLineConfigGpu*, const GrContextOptions&);
 
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
     Error onDraw(const Src&, SkBitmap*, SkWStream*, SkString*,
-                 const GrContextOptions& baseOptions) const;
+                 const GrContextOptions& baseOptions,
+                 std::function<void(GrContext*)> initContext = nullptr) const;
 
     sk_gpu_test::GrContextFactory::ContextType contextType() const { return fContextType; }
     const sk_gpu_test::GrContextFactory::ContextOverrides& contextOverrides() {
@@ -343,7 +343,7 @@
     }
     SkCommandLineConfigGpu::SurfType surfType() const { return fSurfType; }
     bool useDIText() const { return fUseDIText; }
-    bool serial() const override { return !fThreaded; }
+    bool serial() const override { return true; }
     const char* fileExtension() const override { return "png"; }
     SinkFlags flags() const override {
         SinkFlags::Multisampled ms = fSampleCount > 1 ? SinkFlags::kMultisampled
@@ -361,18 +361,13 @@
     SkColorType                                       fColorType;
     SkAlphaType                                       fAlphaType;
     sk_sp<SkColorSpace>                               fColorSpace;
-    bool                                              fThreaded;
     GrContextOptions                                  fBaseContextOptions;
+    sk_gpu_test::MemoryCache                          fMemoryCache;
 };
 
 class GPUThreadTestingSink : public GPUSink {
 public:
-    GPUThreadTestingSink(sk_gpu_test::GrContextFactory::ContextType,
-                         sk_gpu_test::GrContextFactory::ContextOverrides,
-                         SkCommandLineConfigGpu::SurfType surfType, int samples, bool diText,
-                         SkColorType colorType, SkAlphaType alphaType,
-                         sk_sp<SkColorSpace> colorSpace, bool threaded,
-                         const GrContextOptions& grCtxOptions);
+    GPUThreadTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&);
 
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
 
@@ -389,13 +384,7 @@
 
 class GPUPersistentCacheTestingSink : public GPUSink {
 public:
-    GPUPersistentCacheTestingSink(sk_gpu_test::GrContextFactory::ContextType,
-                                  sk_gpu_test::GrContextFactory::ContextOverrides,
-                                  SkCommandLineConfigGpu::SurfType surfType, int samples,
-                                  bool diText, SkColorType colorType, SkAlphaType alphaType,
-                                  sk_sp<SkColorSpace> colorSpace, bool threaded,
-                                  const GrContextOptions& grCtxOptions,
-                                  int cacheType);
+    GPUPersistentCacheTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&);
 
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
 
@@ -410,6 +399,21 @@
     typedef GPUSink INHERITED;
 };
 
+class GPUPrecompileTestingSink : public GPUSink {
+public:
+    GPUPrecompileTestingSink(const SkCommandLineConfigGpu*, const GrContextOptions&);
+
+    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
+
+    const char* fileExtension() const override {
+        // Suppress writing out results from this config - we just want to do our matching test
+        return nullptr;
+    }
+
+private:
+    typedef GPUSink INHERITED;
+};
+
 class PDFSink : public Sink {
 public:
     PDFSink(bool pdfa, SkScalar rasterDpi) : fPDFA(pdfa), fRasterDpi(rasterDpi) {}
@@ -545,12 +549,6 @@
     Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
 };
 
-class ViaLite : public Via {
-public:
-    explicit ViaLite(Sink* sink) : Via(sink) {}
-    Error draw(const Src&, SkBitmap*, SkWStream*, SkString*) const override;
-};
-
 }  // namespace DM
 
 #endif//DMSrcSink_DEFINED
diff --git a/docker/Makefile b/docker/Makefile
new file mode 100644
index 0000000..37270b9
--- /dev/null
+++ b/docker/Makefile
@@ -0,0 +1,6 @@
+# Build gcr.io/skia-public/skia-build-tools:latest, the image used to compile
+# Skia in Google Cloud Build.
+push-skia-build-tools:
+	docker build -t skia-build-tools ./skia-build-tools
+	docker tag skia-build-tools gcr.io/skia-public/skia-build-tools:latest
+	docker push gcr.io/skia-public/skia-build-tools:latest
\ No newline at end of file
diff --git a/docker/README.md b/docker/README.md
index aa310d5..eddac2b 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -1,10 +1,8 @@
-Docker
-======
+# Docker
 
 Docker files for building different Skia targets.
 
-skia-release
-------
+## skia-release
 
 This image is used to build Skia at TOT with SwiftShader.
 
@@ -15,8 +13,7 @@
     docker tag skia-release gcr.io/skia-public/skia-release:prod
     docker push gcr.io/skia-public/skia-release:prod
 
-skia-wasm-release
-------
+## skia-wasm-release
 
 This image is used to build the Web Assembly (WASM) libraries of Skia
 at TOT.
@@ -29,8 +26,7 @@
     docker push gcr.io/skia-public/skia-wasm-release:prod
 
 
-skia-with-swift-shader-base
-------
+## skia-with-swift-shader-base
 
 This image is used to build a local checkout of Skia with SwiftShader and run the built
 executables without requiring the SwiftShader be installed on the host.
@@ -49,8 +45,7 @@
     docker tag skia-with-swift-shader-base gcr.io/skia-public/skia-with-swift-shader-base:prod
     docker push gcr.io/skia-public/skia-with-swift-shader-base:prod
 
-cmake-release
-------
+## cmake-release
 
 This image is used to build Skia using CMake.
 
@@ -70,8 +65,7 @@
     # Compile Skia in a local checkout with the local image
     docker run -v $SKIA_ROOT:/SRC -v /tmp/output:/OUT cmake-release /SRC/infra/docker/cmake/build_skia.sh
 
-binary-size
-------
+## binary-size
 
 This image is used to build code size tree-maps of Skia
 
@@ -89,4 +83,12 @@
     # installed and configured.
     docker run -it binary-size /bin/sh
     # analyze exe "skottie_tool" in build directory out/Release
-    docker run -v $SKIA_ROOT/out/Release:/IN -v /tmp/output:/OUT binary-size /opt/binary_size/src/run_binary_size_analysis.py --library /IN/skottie_tool --destdir /OUT
\ No newline at end of file
+    docker run -v $SKIA_ROOT/out/Release:/IN -v /tmp/output:/OUT binary-size /opt/binary_size/src/run_binary_size_analysis.py --library /IN/skottie_tool --destdir /OUT
+
+## skia-build-tools
+
+This image contains all the tools needed to build Skia.
+
+To push a new version run:
+
+    make push-skia-build-tools
\ No newline at end of file
diff --git a/docker/cloudbuild.yaml b/docker/cloudbuild.yaml
index 448f30a..22677d8 100644
--- a/docker/cloudbuild.yaml
+++ b/docker/cloudbuild.yaml
@@ -2,7 +2,9 @@
 # Builder: https://cloud.google.com/container-builder/docs/
 #
 steps:
-  # To test locally, first uncomment the last two lines of this comment block, then submit with:
+  # To test locally, first uncomment the last 8 lines of this comment block,
+  # update the /refs/changes/... value to reflect the CL you are testing and
+  # then run:
   #
   #    gcloud builds submit --config cloudbuild.yaml --no-source --substitutions=COMMIT_SHA=b2acf0a93927a57cc1fa9323839e788379ae3366
   #
@@ -10,9 +12,18 @@
   #
   #- name: 'gcr.io/cloud-builders/git'
   #  args: ['clone', 'https://github.com/google/skia.git', '.']
+  #
+  #- name: 'gcr.io/cloud-builders/git'
+  #  args: ['fetch', 'https://skia.googlesource.com/skia','refs/changes/56/248556/18']
+  #
+  #- name: 'gcr.io/cloud-builders/git'
+  #  args: ['checkout', 'FETCH_HEAD']
 
   - name: 'debian:testing-slim'
-    args: ['mkdir', '-p', '--mode=777', '/workspace/__doxygen_staging']
+    args: ['mkdir', '-p', '--mode=0777', './__doxygen_staging']
+
+  - name: 'debian:testing-slim'
+    args: ['ls', '-al', '/']
 
   - name: 'gcr.io/skia-public/doxygen:testing-slim'
     dir: './tools/doxygen'
@@ -44,6 +55,14 @@
     timeout: 600s
 
   - name: 'gcr.io/skia-public/infra:prod'
+    dir: '/home/skia/golib/src/go.skia.org/infra/debugger-assets'
+    env:
+      - 'ROOT=/workspace/__debugger_assets_staging'
+      - 'SKIP_BUILD=1'
+    args: ['make', 'release_ci']
+    timeout: 600s
+
+  - name: 'gcr.io/skia-public/infra:prod'
     dir: '/home/skia/golib/src/go.skia.org/infra/api'
     env:
       - 'ROOT=/workspace/__api_staging'
@@ -109,6 +128,10 @@
     timeout: 600s
 
   - name: 'gcr.io/cloud-builders/docker'
+    args: ['build', '-t', 'gcr.io/$PROJECT_ID/debugger-assets:$COMMIT_SHA', '/workspace/__debugger_assets_staging']
+    timeout: 600s
+
+  - name: 'gcr.io/cloud-builders/docker'
     args: ['build', '-t', 'gcr.io/$PROJECT_ID/jsfiddle:$COMMIT_SHA', '/workspace/__jsfiddle_staging']
     timeout: 600s
 
@@ -120,10 +143,11 @@
   - 'gcr.io/$PROJECT_ID/skottie:$COMMIT_SHA'
   - 'gcr.io/$PROJECT_ID/particles:$COMMIT_SHA'
   - 'gcr.io/$PROJECT_ID/debugger:$COMMIT_SHA'
+  - 'gcr.io/$PROJECT_ID/debugger-assets:$COMMIT_SHA'
   - 'gcr.io/$PROJECT_ID/jsfiddle:$COMMIT_SHA'
   - 'gcr.io/$PROJECT_ID/api:$COMMIT_SHA'
   - 'gcr.io/$PROJECT_ID/skia-release:prod'
   - 'gcr.io/$PROJECT_ID/skia-wasm-release:prod'
 timeout: 7200s
 options:
-  machineType: 'N1_HIGHCPU_32'
+  machineType: 'N1_HIGHCPU_32'
\ No newline at end of file
diff --git a/docker/cmake-release/Dockerfile b/docker/cmake-release/Dockerfile
index 40f8fa5..d2ba78c 100644
--- a/docker/cmake-release/Dockerfile
+++ b/docker/cmake-release/Dockerfile
@@ -10,7 +10,7 @@
   libglu1-mesa-dev \
   libxi-dev \
   && groupadd -g 2000 skia \
-  && useradd -u 2000 -g 2000 skia
+  && useradd -u 2000 -g 2000 --home /workspace/__cache skia
 
 RUN curl -s "https://cmake.org/files/v3.13/cmake-3.13.1-Linux-x86_64.tar.gz" | tar --strip-components=1 -xz -C /usr/local
 
diff --git a/docker/skia-build-tools/Dockerfile b/docker/skia-build-tools/Dockerfile
new file mode 100644
index 0000000..085095a
--- /dev/null
+++ b/docker/skia-build-tools/Dockerfile
@@ -0,0 +1,20 @@
+# Dockerfile for building an image with all the tools needed to checkout and build Skia.
+FROM launcher.gcr.io/google/clang-debian9 AS build
+RUN apt-get update && apt-get upgrade -y && apt-get install -y \
+  git \
+  python \
+  curl \
+  build-essential \
+  libfontconfig-dev \
+  libgl1-mesa-dev \
+  libglu1-mesa-dev \
+  && groupadd -g 2000 skia \
+  && useradd -u 2000 -g 2000 skia
+
+RUN cd /tmp \
+  && git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git'
+
+ENV PATH=${PATH}:/tmp/depot_tools
+
+ADD --chown=skia:skia https://storage.googleapis.com/swiftshader-binaries/OpenGL_ES/Latest/Linux/libGLESv2.so /usr/local/lib/libGLESv2.so
+ADD --chown=skia:skia  https://storage.googleapis.com/swiftshader-binaries/OpenGL_ES/Latest/Linux/libEGL.so /usr/local/lib/libEGL.so
\ No newline at end of file
diff --git a/docker/skia-release/Dockerfile b/docker/skia-release/Dockerfile
index dd09d80..41049a2 100644
--- a/docker/skia-release/Dockerfile
+++ b/docker/skia-release/Dockerfile
@@ -1,28 +1,18 @@
 # Dockerfile for building Skia in release mode, using 3rd party libs from DEPS, with SwiftShader.
-FROM launcher.gcr.io/google/clang-debian9 AS build
-RUN apt-get update && apt-get upgrade -y && apt-get install -y \
-  git \
-  python \
-  curl \
-  build-essential \
-  libfontconfig-dev \
-  libgl1-mesa-dev \
-  libglu1-mesa-dev \
-  && groupadd -g 2000 skia \
-  && useradd -u 2000 -g 2000 skia
+FROM gcr.io/skia-public/skia-build-tools:latest
 
-USER skia
-
-ADD --chown=skia:skia https://storage.googleapis.com/swiftshader-binaries/OpenGL_ES/Latest/Linux/libGLESv2.so /usr/local/lib/libGLESv2.so
-ADD --chown=skia:skia  https://storage.googleapis.com/swiftshader-binaries/OpenGL_ES/Latest/Linux/libEGL.so /usr/local/lib/libEGL.so
 RUN cd /tmp \
-  && git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git' \
-  && git clone https://swiftshader.googlesource.com/SwiftShader swiftshader \
-  && mkdir -p /tmp/skia \
-  && cd /tmp/skia \
-  && /tmp/depot_tools/fetch skia \
-  && cd skia
+  && git clone https://swiftshader.googlesource.com/SwiftShader swiftshader
 
+# Checkout Skia.
+RUN mkdir -p /tmp/skia \
+  && cd /tmp/skia \
+  && fetch skia \
+  && cd skia \
+  && gclient sync \
+  && ./bin/fetch-gn
+
+# Write args.gn.
 RUN mkdir -p /tmp/skia/skia/out/Static
 RUN echo '  \n\
 cc = "clang"  \n\
@@ -41,12 +31,12 @@
   "-Wl,/usr/local/lib"  \n\
 ] ' > /tmp/skia/skia/out/Static/args.gn
 
+# Build Skia.
 RUN cd /tmp/skia/skia \
-  && python tools/git-sync-deps \
-  && ./bin/fetch-gn \
   && ./bin/gn gen out/Static \
   && git rev-parse HEAD > VERSION \
-  && /tmp/depot_tools/ninja -C out/Static
+  && /tmp/depot_tools/ninja -C out/Static \
+  && chown -R skia:skia .
 
 # Uncomment the lines below and update the ref to patch in a CL.
 #
diff --git a/docker/skia-wasm-release/Dockerfile b/docker/skia-wasm-release/Dockerfile
index cd133e1..53125d5 100644
--- a/docker/skia-wasm-release/Dockerfile
+++ b/docker/skia-wasm-release/Dockerfile
@@ -1,14 +1,12 @@
 # Dockerfile for building the WASM libraries used by jsfiddle.skia.org and debugger.skia.org
-FROM gcr.io/skia-public/emsdk-release:prod as builder
+FROM gcr.io/skia-public/emsdk-base:prod as builder
 
-RUN cd /tmp \
-  && git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git' \
-  && mkdir -p /tmp/skia \
+# Checkout Skia.
+RUN mkdir -p /tmp/skia \
   && cd /tmp/skia \
-  && /tmp/depot_tools/fetch skia
-
-RUN cd /tmp/skia/skia \
-  && python tools/git-sync-deps \
+  && fetch skia \
+  && cd skia \
+  && gclient sync \
   && ./bin/fetch-gn
 
 # PathKit should be in /tmp/skia/skia/out/pathkit/
diff --git a/docs/examples/Alpha_Constants_a.cpp b/docs/examples/Alpha_Constants_a.cpp
index 8988038..aa2c7a3 100644
--- a/docs/examples/Alpha_Constants_a.cpp
+++ b/docs/examples/Alpha_Constants_a.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=bc9c7ea424d10bbcd1e5a88770d4794e
 REG_FIDDLE(Alpha_Constants_a, 256, 128, false, 1) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Alpha_Constants_b.cpp b/docs/examples/Alpha_Constants_b.cpp
index 8de18c3..34068d3 100644
--- a/docs/examples/Alpha_Constants_b.cpp
+++ b/docs/examples/Alpha_Constants_b.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=0424f67ebc2858e8fd04ae3367b115ff
 REG_FIDDLE(Alpha_Constants_b, 256, 128, false, 1) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Alpha_Type_Opaque.cpp b/docs/examples/Alpha_Type_Opaque.cpp
index 92fb99f..bae82bd 100644
--- a/docs/examples/Alpha_Type_Opaque.cpp
+++ b/docs/examples/Alpha_Type_Opaque.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=79146a1a41d58d22582fdc567c6ffe4e
 REG_FIDDLE(Alpha_Type_Opaque, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Alpha_Type_Premul.cpp b/docs/examples/Alpha_Type_Premul.cpp
index ae3bb5f..f67f3bd 100644
--- a/docs/examples/Alpha_Type_Premul.cpp
+++ b/docs/examples/Alpha_Type_Premul.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ad696b39c915803d566e96896ec3a36c
 REG_FIDDLE(Alpha_Type_Premul, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Alpha_Type_Unpremul.cpp b/docs/examples/Alpha_Type_Unpremul.cpp
index 37a4f60..79016eb 100644
--- a/docs/examples/Alpha_Type_Unpremul.cpp
+++ b/docs/examples/Alpha_Type_Unpremul.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=b8216a9e5ff5bc61a0e46eba7d36307b
 REG_FIDDLE(Alpha_Type_Unpremul, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Anti_Alias.cpp b/docs/examples/Anti_Alias.cpp
index 16387d9..120ac60 100644
--- a/docs/examples/Anti_Alias.cpp
+++ b/docs/examples/Anti_Alias.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a6575a49467ce8d28bb01cc7638fa04d
 REG_FIDDLE(Anti_Alias, 512, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Arc.cpp b/docs/examples/Arc.cpp
index 16c077d..7b6daaf 100644
--- a/docs/examples/Arc.cpp
+++ b/docs/examples/Arc.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=5acc77eba0cb4d00bbf3a8f4db0c0aee
 REG_FIDDLE(Arc, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/AutoCanvasRestore_SkCanvas_star.cpp b/docs/examples/AutoCanvasRestore_SkCanvas_star.cpp
index a810cd7..1620529 100644
--- a/docs/examples/AutoCanvasRestore_SkCanvas_star.cpp
+++ b/docs/examples/AutoCanvasRestore_SkCanvas_star.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=466ef576b88e29d7252422db7adeed1c
 REG_FIDDLE(AutoCanvasRestore_SkCanvas_star, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/AutoCanvasRestore_restore.cpp b/docs/examples/AutoCanvasRestore_restore.cpp
index 216d8f4..88516e4 100644
--- a/docs/examples/AutoCanvasRestore_restore.cpp
+++ b/docs/examples/AutoCanvasRestore_restore.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9f459b218ec079c1ada23f4412968f9a
 REG_FIDDLE(AutoCanvasRestore_restore, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_012.cpp b/docs/examples/Bitmap_012.cpp
index d45b507..a0d76ca 100644
--- a/docs/examples/Bitmap_012.cpp
+++ b/docs/examples/Bitmap_012.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=070b1a60232be499eb10c6ea62371804
 REG_FIDDLE(Bitmap_012, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_ComputeIsOpaque.cpp b/docs/examples/Bitmap_ComputeIsOpaque.cpp
index d92fba1..32255ea 100644
--- a/docs/examples/Bitmap_ComputeIsOpaque.cpp
+++ b/docs/examples/Bitmap_ComputeIsOpaque.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9df1baa17658fbd0c419780f26fd854f
 REG_FIDDLE(Bitmap_ComputeIsOpaque, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_HeapAllocator_allocPixelRef.cpp b/docs/examples/Bitmap_HeapAllocator_allocPixelRef.cpp
index 4f3a110..e0eda4c 100644
--- a/docs/examples/Bitmap_HeapAllocator_allocPixelRef.cpp
+++ b/docs/examples/Bitmap_HeapAllocator_allocPixelRef.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=fe79a9c1ec350264eb9c7b2509dd3638
 REG_FIDDLE(Bitmap_HeapAllocator_allocPixelRef, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_allocN32Pixels.cpp b/docs/examples/Bitmap_allocN32Pixels.cpp
index f569401..bf89e68 100644
--- a/docs/examples/Bitmap_allocN32Pixels.cpp
+++ b/docs/examples/Bitmap_allocN32Pixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c717491f9251604724c9cbde7088ec20
 REG_FIDDLE(Bitmap_allocN32Pixels, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_allocPixels.cpp b/docs/examples/Bitmap_allocPixels.cpp
index 806edd7..d1c585c 100644
--- a/docs/examples/Bitmap_allocPixels.cpp
+++ b/docs/examples/Bitmap_allocPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=555c0f62f96602a9dcd459badcd005e0
 REG_FIDDLE(Bitmap_allocPixels, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_allocPixelsFlags.cpp b/docs/examples/Bitmap_allocPixelsFlags.cpp
index 1cdc39b..78ffb99 100644
--- a/docs/examples/Bitmap_allocPixelsFlags.cpp
+++ b/docs/examples/Bitmap_allocPixelsFlags.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=737e721c7d9e0f367d25521a1b823b9d
 REG_FIDDLE(Bitmap_allocPixelsFlags, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_allocPixels_2.cpp b/docs/examples/Bitmap_allocPixels_2.cpp
index 947774a..5c425ef 100644
--- a/docs/examples/Bitmap_allocPixels_2.cpp
+++ b/docs/examples/Bitmap_allocPixels_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=91f474a11a2112cd5c88c40a9015048d
 REG_FIDDLE(Bitmap_allocPixels_2, 256, 256, false, 4) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_allocPixels_3.cpp b/docs/examples/Bitmap_allocPixels_3.cpp
index eae1055..20607a4 100644
--- a/docs/examples/Bitmap_allocPixels_3.cpp
+++ b/docs/examples/Bitmap_allocPixels_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1219b38c788bf270fb20f8cd2d78cff8
 REG_FIDDLE(Bitmap_allocPixels_3, 256, 50, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_allocPixels_4.cpp b/docs/examples/Bitmap_allocPixels_4.cpp
index 8ac116c..e12e68e 100644
--- a/docs/examples/Bitmap_allocPixels_4.cpp
+++ b/docs/examples/Bitmap_allocPixels_4.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1b2800d23c9ea249b45c2c21a34b6d14
 REG_FIDDLE(Bitmap_allocPixels_4, 256, 32, false, 0) {
 class TinyAllocator : public SkBitmap::Allocator {
diff --git a/docs/examples/Bitmap_bounds.cpp b/docs/examples/Bitmap_bounds.cpp
index 9b66dde..221b733 100644
--- a/docs/examples/Bitmap_bounds.cpp
+++ b/docs/examples/Bitmap_bounds.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3e9126152ff1cc592aef6facbcb5fc96
 REG_FIDDLE(Bitmap_bounds, 256, 64, false, 4) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_bytesPerPixel.cpp b/docs/examples/Bitmap_bytesPerPixel.cpp
index a3663b1..a0e92a1 100644
--- a/docs/examples/Bitmap_bytesPerPixel.cpp
+++ b/docs/examples/Bitmap_bytesPerPixel.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=2a688e6f0a516c0d44a826381e9d637f
 REG_FIDDLE(Bitmap_bytesPerPixel, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_colorSpace.cpp b/docs/examples/Bitmap_colorSpace.cpp
index 632e50d..7ff927b 100644
--- a/docs/examples/Bitmap_colorSpace.cpp
+++ b/docs/examples/Bitmap_colorSpace.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=817f95879fadba44baf87ea60e9b595a
 REG_FIDDLE(Bitmap_colorSpace, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_colorType.cpp b/docs/examples/Bitmap_colorType.cpp
index cbc225f..5fad0ea 100644
--- a/docs/examples/Bitmap_colorType.cpp
+++ b/docs/examples/Bitmap_colorType.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ceb77fab7326b57822a147b04aa0960e
 REG_FIDDLE(Bitmap_colorType, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_computeByteSize.cpp b/docs/examples/Bitmap_computeByteSize.cpp
index 84850bc..a43ffdd 100644
--- a/docs/examples/Bitmap_computeByteSize.cpp
+++ b/docs/examples/Bitmap_computeByteSize.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=165c8f208829fc0908e8a50da60c0076
 REG_FIDDLE(Bitmap_computeByteSize, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_copy_const_SkBitmap.cpp b/docs/examples/Bitmap_copy_const_SkBitmap.cpp
index 77350dc..8c2aede 100644
--- a/docs/examples/Bitmap_copy_const_SkBitmap.cpp
+++ b/docs/examples/Bitmap_copy_const_SkBitmap.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=bbbae7a181bfd128a4484e8e9f454db1
 REG_FIDDLE(Bitmap_copy_const_SkBitmap, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_copy_operator.cpp b/docs/examples/Bitmap_copy_operator.cpp
index c998dad..4a8725e 100644
--- a/docs/examples/Bitmap_copy_operator.cpp
+++ b/docs/examples/Bitmap_copy_operator.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=45279c519ae808f78bd30e9d84bdfdde
 REG_FIDDLE(Bitmap_copy_operator, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_dimensions.cpp b/docs/examples/Bitmap_dimensions.cpp
index 2027a8d..4a39f35 100644
--- a/docs/examples/Bitmap_dimensions.cpp
+++ b/docs/examples/Bitmap_dimensions.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=647056bcc12c27fb4413f212f33a2898
 REG_FIDDLE(Bitmap_dimensions, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_drawsNothing.cpp b/docs/examples/Bitmap_drawsNothing.cpp
index c113dcf..e283678 100644
--- a/docs/examples/Bitmap_drawsNothing.cpp
+++ b/docs/examples/Bitmap_drawsNothing.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=daacf43394ce4045a362a48b5774deed
 REG_FIDDLE(Bitmap_drawsNothing, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_empty.cpp b/docs/examples/Bitmap_empty.cpp
index 6964d1d..52ed59b 100644
--- a/docs/examples/Bitmap_empty.cpp
+++ b/docs/examples/Bitmap_empty.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a3762c2722b56ba55e42689c527f146c
 REG_FIDDLE(Bitmap_empty, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_empty_constructor.cpp b/docs/examples/Bitmap_empty_constructor.cpp
index c7a5c8c..9d72ecd 100644
--- a/docs/examples/Bitmap_empty_constructor.cpp
+++ b/docs/examples/Bitmap_empty_constructor.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=6739d14ec0d6a373f2fcadc6b3077fd4
 REG_FIDDLE(Bitmap_empty_constructor, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_erase.cpp b/docs/examples/Bitmap_erase.cpp
index 28a0abc2..6af379e 100644
--- a/docs/examples/Bitmap_erase.cpp
+++ b/docs/examples/Bitmap_erase.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=2c5c4230ccd2861a5d15b7cd2764ab6e
 REG_FIDDLE(Bitmap_erase, 256, 70, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_eraseARGB.cpp b/docs/examples/Bitmap_eraseARGB.cpp
index ac46cd4..4351c4a 100644
--- a/docs/examples/Bitmap_eraseARGB.cpp
+++ b/docs/examples/Bitmap_eraseARGB.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=67277b0a1003f340473a35982533561c
 REG_FIDDLE(Bitmap_eraseARGB, 256, 80, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_eraseColor.cpp b/docs/examples/Bitmap_eraseColor.cpp
index 3d1462a..3f46b1b 100644
--- a/docs/examples/Bitmap_eraseColor.cpp
+++ b/docs/examples/Bitmap_eraseColor.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=418928dbfffa9eb00c8225530f44baf5
 REG_FIDDLE(Bitmap_eraseColor, 256, 20, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_extractAlpha.cpp b/docs/examples/Bitmap_extractAlpha.cpp
index 805540a..c5e7ecd 100644
--- a/docs/examples/Bitmap_extractAlpha.cpp
+++ b/docs/examples/Bitmap_extractAlpha.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ab6577df079e6c70511cf2bfc6447b44
 REG_FIDDLE(Bitmap_extractAlpha, 256, 100, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_extractAlpha_2.cpp b/docs/examples/Bitmap_extractAlpha_2.cpp
index d4a0459..1f8a228 100644
--- a/docs/examples/Bitmap_extractAlpha_2.cpp
+++ b/docs/examples/Bitmap_extractAlpha_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=092739b4cd5d732a27c07ced8ef45f01
 REG_FIDDLE(Bitmap_extractAlpha_2, 256, 160, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_extractAlpha_3.cpp b/docs/examples/Bitmap_extractAlpha_3.cpp
index c6b1b61..676334d 100644
--- a/docs/examples/Bitmap_extractAlpha_3.cpp
+++ b/docs/examples/Bitmap_extractAlpha_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=cd7543fa8c9f3cede46dc2d72eb8c4bd
 REG_FIDDLE(Bitmap_extractAlpha_3, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_extractSubset.cpp b/docs/examples/Bitmap_extractSubset.cpp
index 70dd398..e658de5 100644
--- a/docs/examples/Bitmap_extractSubset.cpp
+++ b/docs/examples/Bitmap_extractSubset.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=304148c50c91490bfd58e9222342419c
 REG_FIDDLE(Bitmap_extractSubset, 256, 256, true, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getAddr.cpp b/docs/examples/Bitmap_getAddr.cpp
index 1443209..d5b5622 100644
--- a/docs/examples/Bitmap_getAddr.cpp
+++ b/docs/examples/Bitmap_getAddr.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ffcefb2344cd38c3b99f69cfe6d64a17
 REG_FIDDLE(Bitmap_getAddr, 256, 256, true, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getAddr16.cpp b/docs/examples/Bitmap_getAddr16.cpp
index 207d0a1..5993c28 100644
--- a/docs/examples/Bitmap_getAddr16.cpp
+++ b/docs/examples/Bitmap_getAddr16.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=53e00899ef2e00e2096daf7a07d9b059
 REG_FIDDLE(Bitmap_getAddr16, 256, 256, true, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getAddr32.cpp b/docs/examples/Bitmap_getAddr32.cpp
index 77d64dc..66bbac4 100644
--- a/docs/examples/Bitmap_getAddr32.cpp
+++ b/docs/examples/Bitmap_getAddr32.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=837a2bcc9fb9ce617a3420956cefc64a
 REG_FIDDLE(Bitmap_getAddr32, 256, 256, true, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getAddr8.cpp b/docs/examples/Bitmap_getAddr8.cpp
index c1b188c..c94d905 100644
--- a/docs/examples/Bitmap_getAddr8.cpp
+++ b/docs/examples/Bitmap_getAddr8.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=cb9a08e8ff779b6a1cf8bb54f3883aaf
 REG_FIDDLE(Bitmap_getAddr8, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getBounds.cpp b/docs/examples/Bitmap_getBounds.cpp
index 4f37db7..11a5b33 100644
--- a/docs/examples/Bitmap_getBounds.cpp
+++ b/docs/examples/Bitmap_getBounds.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=2431ebc7e7d1e91e6d9daafd0f7a478f
 REG_FIDDLE(Bitmap_getBounds, 256, 160, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getBounds_2.cpp b/docs/examples/Bitmap_getBounds_2.cpp
index e66603d..7b969ca 100644
--- a/docs/examples/Bitmap_getBounds_2.cpp
+++ b/docs/examples/Bitmap_getBounds_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=0c45da35172bc0a529b2faecddae62a2
 REG_FIDDLE(Bitmap_getBounds_2, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getColor.cpp b/docs/examples/Bitmap_getColor.cpp
index 2ae727b..85ab323 100644
--- a/docs/examples/Bitmap_getColor.cpp
+++ b/docs/examples/Bitmap_getColor.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=193d1f6d8a43b7a8e9f27ba21de38617
 REG_FIDDLE(Bitmap_getColor, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getGenerationID.cpp b/docs/examples/Bitmap_getGenerationID.cpp
index 674a352..c199ae8 100644
--- a/docs/examples/Bitmap_getGenerationID.cpp
+++ b/docs/examples/Bitmap_getGenerationID.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=db9dd91e0207c3941c09538555817b4b
 REG_FIDDLE(Bitmap_getGenerationID, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getPixels.cpp b/docs/examples/Bitmap_getPixels.cpp
index 25c041b..c95311b 100644
--- a/docs/examples/Bitmap_getPixels.cpp
+++ b/docs/examples/Bitmap_getPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e006bb05cf74ec8d2b3d6adeb5dba11b
 REG_FIDDLE(Bitmap_getPixels, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_getSubset.cpp b/docs/examples/Bitmap_getSubset.cpp
index 18a69b1..fb9beaa 100644
--- a/docs/examples/Bitmap_getSubset.cpp
+++ b/docs/examples/Bitmap_getSubset.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d6dd0b425aa550f21b938a18c2e1a981
 REG_FIDDLE(Bitmap_getSubset, 256, 256, true, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_height.cpp b/docs/examples/Bitmap_height.cpp
index 69aef2f..5429370 100644
--- a/docs/examples/Bitmap_height.cpp
+++ b/docs/examples/Bitmap_height.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c79a196278c58b34cd5f551b0124ecc9
 REG_FIDDLE(Bitmap_height, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_info.cpp b/docs/examples/Bitmap_info.cpp
index b792f16..2ce2652 100644
--- a/docs/examples/Bitmap_info.cpp
+++ b/docs/examples/Bitmap_info.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ec47c4dc23e2925ad565eaba55a91553
 REG_FIDDLE(Bitmap_info, 256, 256, true, 4) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_installPixels.cpp b/docs/examples/Bitmap_installPixels.cpp
index 2cb5bca..2691fbe 100644
--- a/docs/examples/Bitmap_installPixels.cpp
+++ b/docs/examples/Bitmap_installPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8c4f7bf73fffa1a812ee8e88e44e639c
 REG_FIDDLE(Bitmap_installPixels, 256, 256, true, 0) {
 static void releaseProc(void* addr, void* ) {
diff --git a/docs/examples/Bitmap_installPixels_2.cpp b/docs/examples/Bitmap_installPixels_2.cpp
index 21e3d53..1c113e0 100644
--- a/docs/examples/Bitmap_installPixels_2.cpp
+++ b/docs/examples/Bitmap_installPixels_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a7e04447b2081010c50d7920e80a6bb2
 REG_FIDDLE(Bitmap_installPixels_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_installPixels_3.cpp b/docs/examples/Bitmap_installPixels_3.cpp
index 6ae41d0..30e3003 100644
--- a/docs/examples/Bitmap_installPixels_3.cpp
+++ b/docs/examples/Bitmap_installPixels_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=6e2a8c9358b34aebd2ec586815fe9d3a
 REG_FIDDLE(Bitmap_installPixels_3, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_isImmutable.cpp b/docs/examples/Bitmap_isImmutable.cpp
index 2b238c9..6c39a15 100644
--- a/docs/examples/Bitmap_isImmutable.cpp
+++ b/docs/examples/Bitmap_isImmutable.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=db61fdcd382342ee88ea1b4f27c27b95
 REG_FIDDLE(Bitmap_isImmutable, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_isNull.cpp b/docs/examples/Bitmap_isNull.cpp
index 9d6c3eb..6553a61 100644
--- a/docs/examples/Bitmap_isNull.cpp
+++ b/docs/examples/Bitmap_isNull.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=211ec89418011aa6e54aa2cc9567e003
 REG_FIDDLE(Bitmap_isNull, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_isOpaque.cpp b/docs/examples/Bitmap_isOpaque.cpp
index 796937f..c00a081 100644
--- a/docs/examples/Bitmap_isOpaque.cpp
+++ b/docs/examples/Bitmap_isOpaque.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=5e76b68bb46d54315eb0c12d83bd6949
 REG_FIDDLE(Bitmap_isOpaque, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_isVolatile.cpp b/docs/examples/Bitmap_isVolatile.cpp
index 7f2a2ed..41ab4f6 100644
--- a/docs/examples/Bitmap_isVolatile.cpp
+++ b/docs/examples/Bitmap_isVolatile.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=23c4543ac6cdd0e8fe762816a0dc2e03
 REG_FIDDLE(Bitmap_isVolatile, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_move_SkBitmap.cpp b/docs/examples/Bitmap_move_SkBitmap.cpp
index 2362eef..48c57ca 100644
--- a/docs/examples/Bitmap_move_SkBitmap.cpp
+++ b/docs/examples/Bitmap_move_SkBitmap.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=40afd4f1fa69e02d69d92b38252088ef
 REG_FIDDLE(Bitmap_move_SkBitmap, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_move_operator.cpp b/docs/examples/Bitmap_move_operator.cpp
index 0a12712..abfb6bd 100644
--- a/docs/examples/Bitmap_move_operator.cpp
+++ b/docs/examples/Bitmap_move_operator.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=35ea3fed27d8db22dc00f48670de64de
 REG_FIDDLE(Bitmap_move_operator, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_notifyPixelsChanged.cpp b/docs/examples/Bitmap_notifyPixelsChanged.cpp
index c70a567..b3e6ea5 100644
--- a/docs/examples/Bitmap_notifyPixelsChanged.cpp
+++ b/docs/examples/Bitmap_notifyPixelsChanged.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8f463ed17b0ed4fb9c503a0ec71706f9
 REG_FIDDLE(Bitmap_notifyPixelsChanged, 256, 20, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_peekPixels.cpp b/docs/examples/Bitmap_peekPixels.cpp
index 957e9b9..2a7050c 100644
--- a/docs/examples/Bitmap_peekPixels.cpp
+++ b/docs/examples/Bitmap_peekPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=0cc2c6a0dffa61a88711534bd3d43b40
 REG_FIDDLE(Bitmap_peekPixels, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_pixelRef.cpp b/docs/examples/Bitmap_pixelRef.cpp
index cdf53a3..9415775 100644
--- a/docs/examples/Bitmap_pixelRef.cpp
+++ b/docs/examples/Bitmap_pixelRef.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=5db2d30870a7cc45f28e22578d1880c3
 REG_FIDDLE(Bitmap_pixelRef, 256, 256, true, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_pixelRefOrigin.cpp b/docs/examples/Bitmap_pixelRefOrigin.cpp
index ff0d154..66c3fdb 100644
--- a/docs/examples/Bitmap_pixelRefOrigin.cpp
+++ b/docs/examples/Bitmap_pixelRefOrigin.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=6d31686c6c0829c70f284ae716526d6a
 REG_FIDDLE(Bitmap_pixelRefOrigin, 256, 256, true, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_pixmap.cpp b/docs/examples/Bitmap_pixmap.cpp
index b9e113c..4265c6e 100644
--- a/docs/examples/Bitmap_pixmap.cpp
+++ b/docs/examples/Bitmap_pixmap.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7f972d742dd78d2500034d8867e9ef2f
 REG_FIDDLE(Bitmap_pixmap, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_readPixels.cpp b/docs/examples/Bitmap_readPixels.cpp
index 98dd888..e13df72 100644
--- a/docs/examples/Bitmap_readPixels.cpp
+++ b/docs/examples/Bitmap_readPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=b2cbbbbcffb618865d8aae3bc04b2a62
 REG_FIDDLE(Bitmap_readPixels, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_readPixels_2.cpp b/docs/examples/Bitmap_readPixels_2.cpp
index b40ce0d..72dc28b 100644
--- a/docs/examples/Bitmap_readPixels_2.cpp
+++ b/docs/examples/Bitmap_readPixels_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e9f70cbc9827097449a386ec7a8a8188
 REG_FIDDLE(Bitmap_readPixels_2, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_readPixels_3.cpp b/docs/examples/Bitmap_readPixels_3.cpp
index a284926..85d1ecb 100644
--- a/docs/examples/Bitmap_readPixels_3.cpp
+++ b/docs/examples/Bitmap_readPixels_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=4590fbf052659d6e629fbfd827081ae5
 REG_FIDDLE(Bitmap_readPixels_3, 256, 128, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_readyToDraw.cpp b/docs/examples/Bitmap_readyToDraw.cpp
index 04277d0..e9337f0 100644
--- a/docs/examples/Bitmap_readyToDraw.cpp
+++ b/docs/examples/Bitmap_readyToDraw.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e89c78ca992e2e789ed50944fe68f920
 REG_FIDDLE(Bitmap_readyToDraw, 256, 160, false, 5) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_refColorSpace.cpp b/docs/examples/Bitmap_refColorSpace.cpp
index 930dd48..5c15476 100644
--- a/docs/examples/Bitmap_refColorSpace.cpp
+++ b/docs/examples/Bitmap_refColorSpace.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=cb028b7931da85b949ad0953b9711f9f
 REG_FIDDLE(Bitmap_refColorSpace, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_reset.cpp b/docs/examples/Bitmap_reset.cpp
index 623cd26..49c2991 100644
--- a/docs/examples/Bitmap_reset.cpp
+++ b/docs/examples/Bitmap_reset.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=52ccaeda67924373c5b55a2b89fe314d
 REG_FIDDLE(Bitmap_reset, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_rowBytes.cpp b/docs/examples/Bitmap_rowBytes.cpp
index 2ac1b5c..ee6468a 100644
--- a/docs/examples/Bitmap_rowBytes.cpp
+++ b/docs/examples/Bitmap_rowBytes.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a654fd0b73f424859ae6c95e03f55099
 REG_FIDDLE(Bitmap_rowBytes, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_rowBytesAsPixels.cpp b/docs/examples/Bitmap_rowBytesAsPixels.cpp
index 1c78217..d2d7e79 100644
--- a/docs/examples/Bitmap_rowBytesAsPixels.cpp
+++ b/docs/examples/Bitmap_rowBytesAsPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=03a9e08082a23a98de17c3e24871d61a
 REG_FIDDLE(Bitmap_rowBytesAsPixels, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_setAlphaType.cpp b/docs/examples/Bitmap_setAlphaType.cpp
index ff2b142..74d1c02 100644
--- a/docs/examples/Bitmap_setAlphaType.cpp
+++ b/docs/examples/Bitmap_setAlphaType.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=af3adcbea7b58bf90298ca5e0ea93030
 REG_FIDDLE(Bitmap_setAlphaType, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_setImmutable.cpp b/docs/examples/Bitmap_setImmutable.cpp
index 4bf741f..7ce2376 100644
--- a/docs/examples/Bitmap_setImmutable.cpp
+++ b/docs/examples/Bitmap_setImmutable.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9210060d1f4ca46e1375496237902ef3
 REG_FIDDLE(Bitmap_setImmutable, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_setInfo.cpp b/docs/examples/Bitmap_setInfo.cpp
index 8ebae8f..1578cf1 100644
--- a/docs/examples/Bitmap_setInfo.cpp
+++ b/docs/examples/Bitmap_setInfo.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=599ab64d0aea005498176249bbfb64eb
 REG_FIDDLE(Bitmap_setInfo, 256, 96, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_setIsVolatile.cpp b/docs/examples/Bitmap_setIsVolatile.cpp
index 0a9b9f6..4cdd681 100644
--- a/docs/examples/Bitmap_setIsVolatile.cpp
+++ b/docs/examples/Bitmap_setIsVolatile.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e8627a4df659b896402f89a91326618f
 REG_FIDDLE(Bitmap_setIsVolatile, 256, 20, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_setPixelRef.cpp b/docs/examples/Bitmap_setPixelRef.cpp
index a8fb7c6..af88e4b 100644
--- a/docs/examples/Bitmap_setPixelRef.cpp
+++ b/docs/examples/Bitmap_setPixelRef.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=f98cc0451c6e77a8833d261c9a484c5f
 REG_FIDDLE(Bitmap_setPixelRef, 256, 140, false, 5) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_setPixels.cpp b/docs/examples/Bitmap_setPixels.cpp
index 5f72c28..450b112 100644
--- a/docs/examples/Bitmap_setPixels.cpp
+++ b/docs/examples/Bitmap_setPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=f0db16e06c9a1436917c8179f8c1718f
 REG_FIDDLE(Bitmap_setPixels, 256, 50, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_shiftPerPixel.cpp b/docs/examples/Bitmap_shiftPerPixel.cpp
index 8c10e1b..7232211 100644
--- a/docs/examples/Bitmap_shiftPerPixel.cpp
+++ b/docs/examples/Bitmap_shiftPerPixel.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=56ede4b7d45c15d5936f81ac3d74f070
 REG_FIDDLE(Bitmap_shiftPerPixel, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_swap.cpp b/docs/examples/Bitmap_swap.cpp
index 5ae88f2..1460039 100644
--- a/docs/examples/Bitmap_swap.cpp
+++ b/docs/examples/Bitmap_swap.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=de9be45255e48fae445c916a41063abc
 REG_FIDDLE(Bitmap_swap, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_tryAllocN32Pixels.cpp b/docs/examples/Bitmap_tryAllocN32Pixels.cpp
index af93741..6885333 100644
--- a/docs/examples/Bitmap_tryAllocN32Pixels.cpp
+++ b/docs/examples/Bitmap_tryAllocN32Pixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a2b1e0910f37066f15ae56368775a6d8
 REG_FIDDLE(Bitmap_tryAllocN32Pixels, 256, 160, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_tryAllocPixels.cpp b/docs/examples/Bitmap_tryAllocPixels.cpp
index c831d89..81113a5 100644
--- a/docs/examples/Bitmap_tryAllocPixels.cpp
+++ b/docs/examples/Bitmap_tryAllocPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=34479d5aa23ce9f5e334b0786c9edb22
 REG_FIDDLE(Bitmap_tryAllocPixels, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_tryAllocPixelsFlags.cpp b/docs/examples/Bitmap_tryAllocPixelsFlags.cpp
index 4cc5e9c..d557aaa 100644
--- a/docs/examples/Bitmap_tryAllocPixelsFlags.cpp
+++ b/docs/examples/Bitmap_tryAllocPixelsFlags.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=f1d1880d38e0aea4cefd3e11745e8a09
 REG_FIDDLE(Bitmap_tryAllocPixelsFlags, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_tryAllocPixels_2.cpp b/docs/examples/Bitmap_tryAllocPixels_2.cpp
index 0732ba4..ad3d107 100644
--- a/docs/examples/Bitmap_tryAllocPixels_2.cpp
+++ b/docs/examples/Bitmap_tryAllocPixels_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7ef3d043c4c5885649e591dd7dca92ff
 REG_FIDDLE(Bitmap_tryAllocPixels_2, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_tryAllocPixels_3.cpp b/docs/examples/Bitmap_tryAllocPixels_3.cpp
index 85d22e2..d8fefe8 100644
--- a/docs/examples/Bitmap_tryAllocPixels_3.cpp
+++ b/docs/examples/Bitmap_tryAllocPixels_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=720e4c053fae9e929ab6518b47e49370
 REG_FIDDLE(Bitmap_tryAllocPixels_3, 256, 50, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_tryAllocPixels_4.cpp b/docs/examples/Bitmap_tryAllocPixels_4.cpp
index e8155ba..ec7f31e 100644
--- a/docs/examples/Bitmap_tryAllocPixels_4.cpp
+++ b/docs/examples/Bitmap_tryAllocPixels_4.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=eb6f861ca1839146d26e40d56c2a001c
 REG_FIDDLE(Bitmap_tryAllocPixels_4, 256, 100, false, 0) {
 class LargePixelRef : public SkPixelRef {
diff --git a/docs/examples/Bitmap_width.cpp b/docs/examples/Bitmap_width.cpp
index c8330be..60ab78c 100644
--- a/docs/examples/Bitmap_width.cpp
+++ b/docs/examples/Bitmap_width.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d06880c42f8bb3b4c3b67bd988046049
 REG_FIDDLE(Bitmap_width, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_writePixels.cpp b/docs/examples/Bitmap_writePixels.cpp
index 0caa52b..19c31c2 100644
--- a/docs/examples/Bitmap_writePixels.cpp
+++ b/docs/examples/Bitmap_writePixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9b3133a6673d2514d166398adbe1f9f4
 REG_FIDDLE(Bitmap_writePixels, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Bitmap_writePixels_2.cpp b/docs/examples/Bitmap_writePixels_2.cpp
index 29fcf94..fde7ef6 100644
--- a/docs/examples/Bitmap_writePixels_2.cpp
+++ b/docs/examples/Bitmap_writePixels_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=faa5dfa466f6e16c07c124d971f32679
 REG_FIDDLE(Bitmap_writePixels_2, 256, 80, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/BlendMode_Name.cpp b/docs/examples/BlendMode_Name.cpp
index a12dd83..94e0541 100644
--- a/docs/examples/BlendMode_Name.cpp
+++ b/docs/examples/BlendMode_Name.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3996f4994bf4e90b4cd86524c1f9f1a6
 REG_FIDDLE(BlendMode_Name, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Blend_Mode_Methods.cpp b/docs/examples/Blend_Mode_Methods.cpp
index a0ba2ce..00dbde8 100644
--- a/docs/examples/Blend_Mode_Methods.cpp
+++ b/docs/examples/Blend_Mode_Methods.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=73092d4d06faecea3c204d852a4dd8a8
 REG_FIDDLE(Blend_Mode_Methods, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_129.cpp b/docs/examples/Canvas_129.cpp
index ba9c70a..f5a64cd 100644
--- a/docs/examples/Canvas_129.cpp
+++ b/docs/examples/Canvas_129.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=00b430bd80d740e19c6d020a940f56d5
 REG_FIDDLE(Canvas_129, 256, 1, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_MakeRasterDirect.cpp b/docs/examples/Canvas_MakeRasterDirect.cpp
index 8b4dbd3..49f83f3 100644
--- a/docs/examples/Canvas_MakeRasterDirect.cpp
+++ b/docs/examples/Canvas_MakeRasterDirect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=525285073aae7e53eb8f454a398f880c
 REG_FIDDLE(Canvas_MakeRasterDirect, 256, 256, true, 0) {
 void draw(SkCanvas* ) {
diff --git a/docs/examples/Canvas_MakeRasterDirectN32.cpp b/docs/examples/Canvas_MakeRasterDirectN32.cpp
index 27313fe..7023236 100644
--- a/docs/examples/Canvas_MakeRasterDirectN32.cpp
+++ b/docs/examples/Canvas_MakeRasterDirectN32.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=87f55e62ec4c3535e1a5d0f1415b20c6
 REG_FIDDLE(Canvas_MakeRasterDirectN32, 256, 256, true, 0) {
 void draw(SkCanvas* ) {
diff --git a/docs/examples/Canvas_PointMode.cpp b/docs/examples/Canvas_PointMode.cpp
index 398fafa..bb43c7d 100644
--- a/docs/examples/Canvas_PointMode.cpp
+++ b/docs/examples/Canvas_PointMode.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=292b4b2008961b6f612434d3121fc4ce
 REG_FIDDLE(Canvas_PointMode, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_SaveLayerRec.cpp b/docs/examples/Canvas_SaveLayerRec.cpp
index b842348..f8cab54 100644
--- a/docs/examples/Canvas_SaveLayerRec.cpp
+++ b/docs/examples/Canvas_SaveLayerRec.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ee8c0b120234e27364f8c9a786cf8f89
 REG_FIDDLE(Canvas_SaveLayerRec, 256, 160, false, 0) {
 void draw(SkCanvas* canvas) {
@@ -12,7 +12,7 @@
     canvas->drawCircle(31, 21, 8, bluePaint);
     SkMatrix matrix;
     matrix.setScale(4, 4);
-    auto scaler = SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr);
+    auto scaler = SkImageFilters::MatrixTransform(matrix, kNone_SkFilterQuality, nullptr);
     SkCanvas::SaveLayerRec saveLayerRec(nullptr, nullptr, scaler.get(), 0);
     canvas->saveLayer(saveLayerRec);
     canvas->drawCircle(125, 85, 8, redPaint);
diff --git a/docs/examples/Canvas_SaveLayerRec_SaveLayerRec.cpp b/docs/examples/Canvas_SaveLayerRec_SaveLayerRec.cpp
index b80834c..862a48e 100644
--- a/docs/examples/Canvas_SaveLayerRec_SaveLayerRec.cpp
+++ b/docs/examples/Canvas_SaveLayerRec_SaveLayerRec.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=b5cea1eed80a0eb04ddbab3f36dff73f
 REG_FIDDLE(Canvas_SaveLayerRec_SaveLayerRec, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star.cpp b/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star.cpp
index 9da2199..9ec96d4 100644
--- a/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star.cpp
+++ b/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=027f920259888fc19591ea9a90d92873
 REG_FIDDLE(Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star.cpp b/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star.cpp
index bb014d7..935593e 100644
--- a/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star.cpp
+++ b/docs/examples/Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9b7fa2fe855642ffff6538829db15328
 REG_FIDDLE(Canvas_SaveLayerRec_const_SkRect_star_const_SkPaint_star_const_SkImageFilter_star, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_SrcRectConstraint.cpp b/docs/examples/Canvas_SrcRectConstraint.cpp
index 1218216..e42eabf 100644
--- a/docs/examples/Canvas_SrcRectConstraint.cpp
+++ b/docs/examples/Canvas_SrcRectConstraint.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=5df49d1f4da37275a1f10ef7f1a749f0
 REG_FIDDLE(Canvas_SrcRectConstraint, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_accessTopLayerPixels_a.cpp b/docs/examples/Canvas_accessTopLayerPixels_a.cpp
index 3266ae1..635bb02 100644
--- a/docs/examples/Canvas_accessTopLayerPixels_a.cpp
+++ b/docs/examples/Canvas_accessTopLayerPixels_a.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=38d0d6ca9bea146d31bcbec197856359
 REG_FIDDLE(Canvas_accessTopLayerPixels_a, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_accessTopLayerPixels_b.cpp b/docs/examples/Canvas_accessTopLayerPixels_b.cpp
index e23f316..f630eec 100644
--- a/docs/examples/Canvas_accessTopLayerPixels_b.cpp
+++ b/docs/examples/Canvas_accessTopLayerPixels_b.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a7ac9c21bbabcdeeca00f72a61cd0f3e
 REG_FIDDLE(Canvas_accessTopLayerPixels_b, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_accessTopRasterHandle.cpp b/docs/examples/Canvas_accessTopRasterHandle.cpp
index 93ab5fc..f00f41c 100644
--- a/docs/examples/Canvas_accessTopRasterHandle.cpp
+++ b/docs/examples/Canvas_accessTopRasterHandle.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=4486d0c0b22ad2931db130f42da4c80c
 REG_FIDDLE(Canvas_accessTopRasterHandle, 256, 256, true, 0) {
 static void DeleteCallback(void*, void* context) {
diff --git a/docs/examples/Canvas_clear.cpp b/docs/examples/Canvas_clear.cpp
index 733c24e..b611afb 100644
--- a/docs/examples/Canvas_clear.cpp
+++ b/docs/examples/Canvas_clear.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8c4499e322f10153dcd9b0b9806233b9
 REG_FIDDLE(Canvas_clear, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipPath.cpp b/docs/examples/Canvas_clipPath.cpp
index ab43bb0..3b6d43d8 100644
--- a/docs/examples/Canvas_clipPath.cpp
+++ b/docs/examples/Canvas_clipPath.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ee47ae6b813bfaa55e1a7b7c053ed60d
 REG_FIDDLE(Canvas_clipPath, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipPath_2.cpp b/docs/examples/Canvas_clipPath_2.cpp
index e74ca27..963c8d7 100644
--- a/docs/examples/Canvas_clipPath_2.cpp
+++ b/docs/examples/Canvas_clipPath_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7856755c1bf8431c286c734b353345ad
 REG_FIDDLE(Canvas_clipPath_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipPath_3.cpp b/docs/examples/Canvas_clipPath_3.cpp
index 8952c6a..9988a80 100644
--- a/docs/examples/Canvas_clipPath_3.cpp
+++ b/docs/examples/Canvas_clipPath_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=187a7ae77a8176e417181411988534b6
 REG_FIDDLE(Canvas_clipPath_3, 256, 212, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipRRect.cpp b/docs/examples/Canvas_clipRRect.cpp
index 2a09fe2..4cc1c90 100644
--- a/docs/examples/Canvas_clipRRect.cpp
+++ b/docs/examples/Canvas_clipRRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=182ef48ab5e04ba3578496fda8d9fa36
 REG_FIDDLE(Canvas_clipRRect, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipRRect_2.cpp b/docs/examples/Canvas_clipRRect_2.cpp
index 6af4930..66cd0ff 100644
--- a/docs/examples/Canvas_clipRRect_2.cpp
+++ b/docs/examples/Canvas_clipRRect_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ef6ae2eaae6761130ce38065d0364abd
 REG_FIDDLE(Canvas_clipRRect_2, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipRRect_3.cpp b/docs/examples/Canvas_clipRRect_3.cpp
index 8688c24..7223b32 100644
--- a/docs/examples/Canvas_clipRRect_3.cpp
+++ b/docs/examples/Canvas_clipRRect_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=f583114580b2176fe3e75b0994476a84
 REG_FIDDLE(Canvas_clipRRect_3, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipRect.cpp b/docs/examples/Canvas_clipRect.cpp
index 0397fcb..7ab1f10 100644
--- a/docs/examples/Canvas_clipRect.cpp
+++ b/docs/examples/Canvas_clipRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=6a614faa0fbcf19958b5559c19b02d0f
 REG_FIDDLE(Canvas_clipRect, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipRect_2.cpp b/docs/examples/Canvas_clipRect_2.cpp
index 490c640..0856e8d 100644
--- a/docs/examples/Canvas_clipRect_2.cpp
+++ b/docs/examples/Canvas_clipRect_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=13bbc5fa5597a6cd4d704b419dbc66d9
 REG_FIDDLE(Canvas_clipRect_2, 280, 192, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipRect_3.cpp b/docs/examples/Canvas_clipRect_3.cpp
index fe34c28..e792258 100644
--- a/docs/examples/Canvas_clipRect_3.cpp
+++ b/docs/examples/Canvas_clipRect_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1d4e0632c97e42692775d834fe10aa99
 REG_FIDDLE(Canvas_clipRect_3, 256, 133, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_clipRegion.cpp b/docs/examples/Canvas_clipRegion.cpp
index 8b90021..201906e 100644
--- a/docs/examples/Canvas_clipRegion.cpp
+++ b/docs/examples/Canvas_clipRegion.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7bb57c0e456c5fda2c2cca4abb68b19e
 REG_FIDDLE(Canvas_clipRegion, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_concat.cpp b/docs/examples/Canvas_concat.cpp
index d687832..c5020a8 100644
--- a/docs/examples/Canvas_concat.cpp
+++ b/docs/examples/Canvas_concat.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8f6818b25a92a88638ad99b2dd293f61
 REG_FIDDLE(Canvas_concat, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_const_SkBitmap_const_SkSurfaceProps.cpp b/docs/examples/Canvas_const_SkBitmap_const_SkSurfaceProps.cpp
index 7e4da71..1ad3d39 100644
--- a/docs/examples/Canvas_const_SkBitmap_const_SkSurfaceProps.cpp
+++ b/docs/examples/Canvas_const_SkBitmap_const_SkSurfaceProps.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c26cfae4c42cb445240335cc12a50235
 REG_FIDDLE(Canvas_const_SkBitmap_const_SkSurfaceProps, 256, 256, true, 0) {
 void draw(SkCanvas* ) {
diff --git a/docs/examples/Canvas_copy_const_SkBitmap.cpp b/docs/examples/Canvas_copy_const_SkBitmap.cpp
index 7812e41..1f8bff3 100644
--- a/docs/examples/Canvas_copy_const_SkBitmap.cpp
+++ b/docs/examples/Canvas_copy_const_SkBitmap.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=dd92db963af190e849894038f39b598a
 REG_FIDDLE(Canvas_copy_const_SkBitmap, 256, 256, true, 0) {
 void draw(SkCanvas* ) {
diff --git a/docs/examples/Canvas_destructor.cpp b/docs/examples/Canvas_destructor.cpp
index 4b6dc87..9a910f3 100644
--- a/docs/examples/Canvas_destructor.cpp
+++ b/docs/examples/Canvas_destructor.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=b7bc91ff16c9b9351b2a127f35394b82
 REG_FIDDLE(Canvas_destructor, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawAnnotation_2.cpp b/docs/examples/Canvas_drawAnnotation_2.cpp
index 6c58391..c7daeaf 100644
--- a/docs/examples/Canvas_drawAnnotation_2.cpp
+++ b/docs/examples/Canvas_drawAnnotation_2.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=00b430bd80d740e19c6d020a940f56d5
 REG_FIDDLE(Canvas_drawAnnotation_2, 256, 1, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawArc_a.cpp b/docs/examples/Canvas_drawArc_a.cpp
index a969e7b..9746e47 100644
--- a/docs/examples/Canvas_drawArc_a.cpp
+++ b/docs/examples/Canvas_drawArc_a.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=11f0fbe7b30d776913c2e7c92c02ff57
 REG_FIDDLE(Canvas_drawArc_a, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawArc_b.cpp b/docs/examples/Canvas_drawArc_b.cpp
index bcd3968..5ef004e 100644
--- a/docs/examples/Canvas_drawArc_b.cpp
+++ b/docs/examples/Canvas_drawArc_b.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e91dbe45974489b8962c815017b7914f
 REG_FIDDLE(Canvas_drawArc_b, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawAtlas.cpp b/docs/examples/Canvas_drawAtlas.cpp
index dcb64b1..0dcec94 100644
--- a/docs/examples/Canvas_drawAtlas.cpp
+++ b/docs/examples/Canvas_drawAtlas.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1df575f9b8132306ce0552a2554ed132
 REG_FIDDLE(Canvas_drawAtlas, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawAtlas_2.cpp b/docs/examples/Canvas_drawAtlas_2.cpp
index ccae9f3..184776a 100644
--- a/docs/examples/Canvas_drawAtlas_2.cpp
+++ b/docs/examples/Canvas_drawAtlas_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=0e66a8f230a8d531bcef9f5ebdc5aac1
 REG_FIDDLE(Canvas_drawAtlas_2, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawAtlas_3.cpp b/docs/examples/Canvas_drawAtlas_3.cpp
index 0cd31af..2d8d7310 100644
--- a/docs/examples/Canvas_drawAtlas_3.cpp
+++ b/docs/examples/Canvas_drawAtlas_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8dc0d0fdeab20bbc21cac6874ddbefcd
 REG_FIDDLE(Canvas_drawAtlas_3, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawAtlas_4.cpp b/docs/examples/Canvas_drawAtlas_4.cpp
index 33ce86e..1e5de3e 100644
--- a/docs/examples/Canvas_drawAtlas_4.cpp
+++ b/docs/examples/Canvas_drawAtlas_4.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c093c2b14bd3e6171ede7cd4049d9b57
 REG_FIDDLE(Canvas_drawAtlas_4, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawBitmap.cpp b/docs/examples/Canvas_drawBitmap.cpp
index b21c09e..11e852f 100644
--- a/docs/examples/Canvas_drawBitmap.cpp
+++ b/docs/examples/Canvas_drawBitmap.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=4a521be1f850058541e136a808c65e78
 REG_FIDDLE(Canvas_drawBitmap, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawBitmapLattice.cpp b/docs/examples/Canvas_drawBitmapLattice.cpp
index 6ab2254..d5b1a8a 100644
--- a/docs/examples/Canvas_drawBitmapLattice.cpp
+++ b/docs/examples/Canvas_drawBitmapLattice.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c5bfa944e17ba4a4400dc799f032069c
 REG_FIDDLE(Canvas_drawBitmapLattice, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawBitmapNine.cpp b/docs/examples/Canvas_drawBitmapNine.cpp
index e6d7bc3..e4e6589 100644
--- a/docs/examples/Canvas_drawBitmapNine.cpp
+++ b/docs/examples/Canvas_drawBitmapNine.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e99e7be0d8f67dfacbecf85df585433d
 REG_FIDDLE(Canvas_drawBitmapNine, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawBitmapRect.cpp b/docs/examples/Canvas_drawBitmapRect.cpp
index ae78fa9..83a3300 100644
--- a/docs/examples/Canvas_drawBitmapRect.cpp
+++ b/docs/examples/Canvas_drawBitmapRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7d04932f2a259cc70d6e45cd25a6feb6
 REG_FIDDLE(Canvas_drawBitmapRect, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawBitmapRect_2.cpp b/docs/examples/Canvas_drawBitmapRect_2.cpp
index 1eda940..b48774e 100644
--- a/docs/examples/Canvas_drawBitmapRect_2.cpp
+++ b/docs/examples/Canvas_drawBitmapRect_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=0a3c6d2459566e58cee7d4910655ee21
 REG_FIDDLE(Canvas_drawBitmapRect_2, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawBitmapRect_3.cpp b/docs/examples/Canvas_drawBitmapRect_3.cpp
index 30d9bca..9ec6268 100644
--- a/docs/examples/Canvas_drawBitmapRect_3.cpp
+++ b/docs/examples/Canvas_drawBitmapRect_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=bdbeac3c97f60a63987b1cc8e1f1e91e
 REG_FIDDLE(Canvas_drawBitmapRect_3, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawCircle.cpp b/docs/examples/Canvas_drawCircle.cpp
index da5c462..4ef3305 100644
--- a/docs/examples/Canvas_drawCircle.cpp
+++ b/docs/examples/Canvas_drawCircle.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=841229e25ca9dfb68bd0dc4dfff356eb
 REG_FIDDLE(Canvas_drawCircle, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawCircle_2.cpp b/docs/examples/Canvas_drawCircle_2.cpp
index 1e4b4ce..8d8a6f0 100644
--- a/docs/examples/Canvas_drawCircle_2.cpp
+++ b/docs/examples/Canvas_drawCircle_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9303ffae45ddd0b0a1f93d816a1762f4
 REG_FIDDLE(Canvas_drawCircle_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawColor.cpp b/docs/examples/Canvas_drawColor.cpp
index a6dfc48..d5737ea 100644
--- a/docs/examples/Canvas_drawColor.cpp
+++ b/docs/examples/Canvas_drawColor.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9cf94fead1e6b17d836c704b4eac269a
 REG_FIDDLE(Canvas_drawColor, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawDRRect_a.cpp b/docs/examples/Canvas_drawDRRect_a.cpp
index 0079023..98d30df 100644
--- a/docs/examples/Canvas_drawDRRect_a.cpp
+++ b/docs/examples/Canvas_drawDRRect_a.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=02e33141f13da2f19aef7feb7117b541
 REG_FIDDLE(Canvas_drawDRRect_a, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawDRRect_b.cpp b/docs/examples/Canvas_drawDRRect_b.cpp
index 33306e5..1a41eed 100644
--- a/docs/examples/Canvas_drawDRRect_b.cpp
+++ b/docs/examples/Canvas_drawDRRect_b.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=30823cb4edf884d330285ea161664931
 REG_FIDDLE(Canvas_drawDRRect_b, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawDrawable.cpp b/docs/examples/Canvas_drawDrawable.cpp
index 4e05c27..235d22d 100644
--- a/docs/examples/Canvas_drawDrawable.cpp
+++ b/docs/examples/Canvas_drawDrawable.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3a4dfcd08838866b5cfc0d82489195ba
 REG_FIDDLE(Canvas_drawDrawable, 256, 100, false, 0) {
 struct MyDrawable : public SkDrawable {
diff --git a/docs/examples/Canvas_drawDrawable_2.cpp b/docs/examples/Canvas_drawDrawable_2.cpp
index b450b65..4942871 100644
--- a/docs/examples/Canvas_drawDrawable_2.cpp
+++ b/docs/examples/Canvas_drawDrawable_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1bdc07ad3b154c89b771722c2fcaee3f
 REG_FIDDLE(Canvas_drawDrawable_2, 256, 100, false, 0) {
 struct MyDrawable : public SkDrawable {
diff --git a/docs/examples/Canvas_drawIRect.cpp b/docs/examples/Canvas_drawIRect.cpp
index 2d7a57c..33df4d3 100644
--- a/docs/examples/Canvas_drawIRect.cpp
+++ b/docs/examples/Canvas_drawIRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d3d8ca584134560750b1efa4a4c6e138
 REG_FIDDLE(Canvas_drawIRect, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImage.cpp b/docs/examples/Canvas_drawImage.cpp
index f11c80c..fbebf34 100644
--- a/docs/examples/Canvas_drawImage.cpp
+++ b/docs/examples/Canvas_drawImage.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=185746dc0faa6f1df30c4afe098646ff
 REG_FIDDLE(Canvas_drawImage, 256, 64, false, 4) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageNine.cpp b/docs/examples/Canvas_drawImageNine.cpp
index e3a365e..0cad667 100644
--- a/docs/examples/Canvas_drawImageNine.cpp
+++ b/docs/examples/Canvas_drawImageNine.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=4f153cf1d0dbe1a95acf5badeec14dae
 REG_FIDDLE(Canvas_drawImageNine, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageNine_2.cpp b/docs/examples/Canvas_drawImageNine_2.cpp
index eaa9f0d..826e18a 100644
--- a/docs/examples/Canvas_drawImageNine_2.cpp
+++ b/docs/examples/Canvas_drawImageNine_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d597d9af8d17fd93e634dd12017058e2
 REG_FIDDLE(Canvas_drawImageNine_2, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageRect.cpp b/docs/examples/Canvas_drawImageRect.cpp
index f2648bd..3548d4d 100644
--- a/docs/examples/Canvas_drawImageRect.cpp
+++ b/docs/examples/Canvas_drawImageRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=bfd18e9cac896cdf94c9f154ccf94be8
 REG_FIDDLE(Canvas_drawImageRect, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageRect_2.cpp b/docs/examples/Canvas_drawImageRect_2.cpp
index f7daec0..743f8bd 100644
--- a/docs/examples/Canvas_drawImageRect_2.cpp
+++ b/docs/examples/Canvas_drawImageRect_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7f92cd5c9b9f4b1ac3cd933b08037bfe
 REG_FIDDLE(Canvas_drawImageRect_2, 256, 256, false, 4) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageRect_3.cpp b/docs/examples/Canvas_drawImageRect_3.cpp
index 904b6c7..ad6f0d97 100644
--- a/docs/examples/Canvas_drawImageRect_3.cpp
+++ b/docs/examples/Canvas_drawImageRect_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3cf8fb639fef99993cafc064d550c739
 REG_FIDDLE(Canvas_drawImageRect_3, 256, 256, false, 4) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageRect_4.cpp b/docs/examples/Canvas_drawImageRect_4.cpp
index 38c8cd4..2c49dc0 100644
--- a/docs/examples/Canvas_drawImageRect_4.cpp
+++ b/docs/examples/Canvas_drawImageRect_4.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d4b35a9d24c32c042bd1f529b8de3c0d
 REG_FIDDLE(Canvas_drawImageRect_4, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageRect_5.cpp b/docs/examples/Canvas_drawImageRect_5.cpp
index 223bdcb..b494683 100644
--- a/docs/examples/Canvas_drawImageRect_5.cpp
+++ b/docs/examples/Canvas_drawImageRect_5.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d307e7e1237f39fb54d80723e5449857
 REG_FIDDLE(Canvas_drawImageRect_5, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImageRect_6.cpp b/docs/examples/Canvas_drawImageRect_6.cpp
index 1d3fcb9..7aeabe4 100644
--- a/docs/examples/Canvas_drawImageRect_6.cpp
+++ b/docs/examples/Canvas_drawImageRect_6.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3a47ef94cb70144455f80333d8653e6c
 REG_FIDDLE(Canvas_drawImageRect_6, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawImage_2.cpp b/docs/examples/Canvas_drawImage_2.cpp
index 63c7514..0b0a48f 100644
--- a/docs/examples/Canvas_drawImage_2.cpp
+++ b/docs/examples/Canvas_drawImage_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a4e877e891b1be5faa2b7fd07f673a10
 REG_FIDDLE(Canvas_drawImage_2, 256, 64, false, 4) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawLine.cpp b/docs/examples/Canvas_drawLine.cpp
index 72d2ed7..d0b710c 100644
--- a/docs/examples/Canvas_drawLine.cpp
+++ b/docs/examples/Canvas_drawLine.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d10ee4a265f278d02afe11ad889b293b
 REG_FIDDLE(Canvas_drawLine, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawLine_2.cpp b/docs/examples/Canvas_drawLine_2.cpp
index 1c47f59..832ad7f 100644
--- a/docs/examples/Canvas_drawLine_2.cpp
+++ b/docs/examples/Canvas_drawLine_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=f8525816cb596dde1a3855446792c8e0
 REG_FIDDLE(Canvas_drawLine_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawOval.cpp b/docs/examples/Canvas_drawOval.cpp
index 3e254ca..570114c 100644
--- a/docs/examples/Canvas_drawOval.cpp
+++ b/docs/examples/Canvas_drawOval.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8b6b86f8a022811cd29a9c6ab771df12
 REG_FIDDLE(Canvas_drawOval, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPaint.cpp b/docs/examples/Canvas_drawPaint.cpp
index 2968ceb..879ab84 100644
--- a/docs/examples/Canvas_drawPaint.cpp
+++ b/docs/examples/Canvas_drawPaint.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1cd076b9b1a7c976cdca72b93c4f42dd
 REG_FIDDLE(Canvas_drawPaint, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPatch.cpp b/docs/examples/Canvas_drawPatch.cpp
index 83c3a81..f5c0ef3 100644
--- a/docs/examples/Canvas_drawPatch.cpp
+++ b/docs/examples/Canvas_drawPatch.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=accb545d67984ced168f5be6ab824795
 REG_FIDDLE(Canvas_drawPatch, 256, 256, false, 5) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPatch_2_a.cpp b/docs/examples/Canvas_drawPatch_2_a.cpp
index f7a1cc1..c1d6786 100644
--- a/docs/examples/Canvas_drawPatch_2_a.cpp
+++ b/docs/examples/Canvas_drawPatch_2_a.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=4e8b7409531c9211a2afcf632005a38c
 REG_FIDDLE(Canvas_drawPatch_2_a, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPatch_2_b.cpp b/docs/examples/Canvas_drawPatch_2_b.cpp
index bb8175a..6909f17 100644
--- a/docs/examples/Canvas_drawPatch_2_b.cpp
+++ b/docs/examples/Canvas_drawPatch_2_b.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3412c2a16cb529af0e04878d264451f2
 REG_FIDDLE(Canvas_drawPatch_2_b, 256, 256, false, 6) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPath.cpp b/docs/examples/Canvas_drawPath.cpp
index 6d07815..d62374d 100644
--- a/docs/examples/Canvas_drawPath.cpp
+++ b/docs/examples/Canvas_drawPath.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=fe2294131f422b8d6752f6a880f98ad9
 REG_FIDDLE(Canvas_drawPath, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPicture_2.cpp b/docs/examples/Canvas_drawPicture_2.cpp
index 97e58c1..3cb6bc3 100644
--- a/docs/examples/Canvas_drawPicture_2.cpp
+++ b/docs/examples/Canvas_drawPicture_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=83918a23fcffd47f59a1ef662c85a24c
 REG_FIDDLE(Canvas_drawPicture_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPicture_3.cpp b/docs/examples/Canvas_drawPicture_3.cpp
index df76070..7aea2cd 100644
--- a/docs/examples/Canvas_drawPicture_3.cpp
+++ b/docs/examples/Canvas_drawPicture_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=759e4e5bac680838added8f70884dcdc
 REG_FIDDLE(Canvas_drawPicture_3, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPicture_4.cpp b/docs/examples/Canvas_drawPicture_4.cpp
index f1520d5..d1d5c4f 100644
--- a/docs/examples/Canvas_drawPicture_4.cpp
+++ b/docs/examples/Canvas_drawPicture_4.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c4ff59439dd2fc871925d4eeb0c84ca1
 REG_FIDDLE(Canvas_drawPicture_4, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPoint.cpp b/docs/examples/Canvas_drawPoint.cpp
index 47c50b5..f488f8f 100644
--- a/docs/examples/Canvas_drawPoint.cpp
+++ b/docs/examples/Canvas_drawPoint.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3476b553e7b547b604a3f6969f02d933
 REG_FIDDLE(Canvas_drawPoint, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPoint_2.cpp b/docs/examples/Canvas_drawPoint_2.cpp
index 8fa5e74..3b09783 100644
--- a/docs/examples/Canvas_drawPoint_2.cpp
+++ b/docs/examples/Canvas_drawPoint_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1a0a839061c69d870acca2bcfbdf1a41
 REG_FIDDLE(Canvas_drawPoint_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPoints.cpp b/docs/examples/Canvas_drawPoints.cpp
index 5de4426..0206b5c 100644
--- a/docs/examples/Canvas_drawPoints.cpp
+++ b/docs/examples/Canvas_drawPoints.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=635d54b4716e226e93dfbc21ad40e77d
 REG_FIDDLE(Canvas_drawPoints, 256, 200, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPosText.cpp b/docs/examples/Canvas_drawPosText.cpp
index 0ca581e..5bf5fb9 100644
--- a/docs/examples/Canvas_drawPosText.cpp
+++ b/docs/examples/Canvas_drawPosText.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=bf0b2402533a23b6392e0676b7a8414c
 REG_FIDDLE(Canvas_drawPosText, 256, 120, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawPosTextH.cpp b/docs/examples/Canvas_drawPosTextH.cpp
index e72adce..e88669a 100644
--- a/docs/examples/Canvas_drawPosTextH.cpp
+++ b/docs/examples/Canvas_drawPosTextH.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=95c6a7ef82993a8d2add676080e9438a
 REG_FIDDLE(Canvas_drawPosTextH, 256, 40, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawRRect.cpp b/docs/examples/Canvas_drawRRect.cpp
index 99d6143..dff7ff2 100644
--- a/docs/examples/Canvas_drawRRect.cpp
+++ b/docs/examples/Canvas_drawRRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=90fed1bb11efb43aada94113338c63d8
 REG_FIDDLE(Canvas_drawRRect, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawRect.cpp b/docs/examples/Canvas_drawRect.cpp
index afb88f5..fc3fe27 100644
--- a/docs/examples/Canvas_drawRect.cpp
+++ b/docs/examples/Canvas_drawRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=871b0da9b4a23de11ae7a772ce14aed3
 REG_FIDDLE(Canvas_drawRect, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawRegion.cpp b/docs/examples/Canvas_drawRegion.cpp
index a312ff2..84e4467 100644
--- a/docs/examples/Canvas_drawRegion.cpp
+++ b/docs/examples/Canvas_drawRegion.cpp
@@ -1,12 +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"
+#include "tools/fiddle/examples.h"
 // HASH=80309e0deca0f8add616cec7bec634ca
 REG_FIDDLE(Canvas_drawRegion, 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);
+    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);
diff --git a/docs/examples/Canvas_drawRoundRect.cpp b/docs/examples/Canvas_drawRoundRect.cpp
index edbd598..9bde76c 100644
--- a/docs/examples/Canvas_drawRoundRect.cpp
+++ b/docs/examples/Canvas_drawRoundRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=199fe818c09026c114e165bff166a39f
 REG_FIDDLE(Canvas_drawRoundRect, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawString.cpp b/docs/examples/Canvas_drawString.cpp
index 510f4aa..5453281 100644
--- a/docs/examples/Canvas_drawString.cpp
+++ b/docs/examples/Canvas_drawString.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=85442cf8d0bce6b5a777853bc36a4dc4
 REG_FIDDLE(Canvas_drawString, 256, 48, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawString_2.cpp b/docs/examples/Canvas_drawString_2.cpp
index f09a6c3..158bd38 100644
--- a/docs/examples/Canvas_drawString_2.cpp
+++ b/docs/examples/Canvas_drawString_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=435178c09feb3bfec5e35d983609a013
 REG_FIDDLE(Canvas_drawString_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawText.cpp b/docs/examples/Canvas_drawText.cpp
index 46d7665..d2c508f 100644
--- a/docs/examples/Canvas_drawText.cpp
+++ b/docs/examples/Canvas_drawText.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=55f5e59350622c5e2834d1c85789f732
 REG_FIDDLE(Canvas_drawText, 256, 200, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawTextBlob.cpp b/docs/examples/Canvas_drawTextBlob.cpp
index 50588ce..9fcab6a 100644
--- a/docs/examples/Canvas_drawTextBlob.cpp
+++ b/docs/examples/Canvas_drawTextBlob.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=005502b502c1282cb8d306d6c8d998fb
 REG_FIDDLE(Canvas_drawTextBlob, 256, 120, false, 0) {
 void draw(SkCanvas* canvas) {
@@ -11,7 +11,7 @@
     uint16_t glyphs[len];
     SkPaint paint;
     paint.textToGlyphs(bunny, len, glyphs);
-    paint.setTextEncoding(kGlyphID_SkTextEncoding);
+    paint.setTextEncoding(SkTextEncoding::kGlyphID);
     SkFont font;
     int runs[] = { 3, 1, 3 };
     SkPoint textPos = { 20, 100 };
diff --git a/docs/examples/Canvas_drawTextBlob_2.cpp b/docs/examples/Canvas_drawTextBlob_2.cpp
index c8fe857..aa146ae 100644
--- a/docs/examples/Canvas_drawTextBlob_2.cpp
+++ b/docs/examples/Canvas_drawTextBlob_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1cae21e7b63b24de3eca0bbd9be1936b
 REG_FIDDLE(Canvas_drawTextBlob_2, 256, 120, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawTextRSXform.cpp b/docs/examples/Canvas_drawTextRSXform.cpp
index d1e1d06..e94f28c 100644
--- a/docs/examples/Canvas_drawTextRSXform.cpp
+++ b/docs/examples/Canvas_drawTextRSXform.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=935c8f8b9782d297a73d7186f6ef7945
 REG_FIDDLE(Canvas_drawTextRSXform, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawVertices.cpp b/docs/examples/Canvas_drawVertices.cpp
index d79d85c..a289d57 100644
--- a/docs/examples/Canvas_drawVertices.cpp
+++ b/docs/examples/Canvas_drawVertices.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=f48b22eaad1bb7adcc3faaa321754af6
 REG_FIDDLE(Canvas_drawVertices, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_drawVertices_2.cpp b/docs/examples/Canvas_drawVertices_2.cpp
index 9a5a841..899cc6d 100644
--- a/docs/examples/Canvas_drawVertices_2.cpp
+++ b/docs/examples/Canvas_drawVertices_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e8bdae9bea3227758989028424fcac3d
 REG_FIDDLE(Canvas_drawVertices_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_empty_constructor.cpp b/docs/examples/Canvas_empty_constructor.cpp
index 9cf17fa..79ea09b 100644
--- a/docs/examples/Canvas_empty_constructor.cpp
+++ b/docs/examples/Canvas_empty_constructor.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=4a00e6589e862fde5be532f4b6e316ce
 REG_FIDDLE(Canvas_empty_constructor, 256, 256, true, 0) {
 static void check_for_rotated_ctm(const SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_getBaseLayerSize.cpp b/docs/examples/Canvas_getBaseLayerSize.cpp
index 400033d..0d13eb8 100644
--- a/docs/examples/Canvas_getBaseLayerSize.cpp
+++ b/docs/examples/Canvas_getBaseLayerSize.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=374e245d91cd729eca48fd20e631fdf3
 REG_FIDDLE(Canvas_getBaseLayerSize, 256, 256, true, 0) {
 void draw(SkCanvas* ) {
diff --git a/docs/examples/Canvas_getDeviceClipBounds.cpp b/docs/examples/Canvas_getDeviceClipBounds.cpp
index 6783ef5..f5394ef 100644
--- a/docs/examples/Canvas_getDeviceClipBounds.cpp
+++ b/docs/examples/Canvas_getDeviceClipBounds.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=556832ac5711af662a98c21c547185e9
 REG_FIDDLE(Canvas_getDeviceClipBounds, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_getDeviceClipBounds_2.cpp b/docs/examples/Canvas_getDeviceClipBounds_2.cpp
index 5fd67c6..0f57afd 100644
--- a/docs/examples/Canvas_getDeviceClipBounds_2.cpp
+++ b/docs/examples/Canvas_getDeviceClipBounds_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=6abb99f849a1f0e33e1dedc00d1c4f7a
 REG_FIDDLE(Canvas_getDeviceClipBounds_2, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_getGrContext.cpp b/docs/examples/Canvas_getGrContext.cpp
index c993b15..f5ce3ce 100644
--- a/docs/examples/Canvas_getGrContext.cpp
+++ b/docs/examples/Canvas_getGrContext.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c4ea949e5fa5a0630dcb6b0204bd498f
 REG_FIDDLE(Canvas_getGrContext, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_getLocalClipBounds.cpp b/docs/examples/Canvas_getLocalClipBounds.cpp
index 922aa0f..0469f5f 100644
--- a/docs/examples/Canvas_getLocalClipBounds.cpp
+++ b/docs/examples/Canvas_getLocalClipBounds.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7f60cb030d3f9b2473adbe3e34b19d91
 REG_FIDDLE(Canvas_getLocalClipBounds, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_getLocalClipBounds_2.cpp b/docs/examples/Canvas_getLocalClipBounds_2.cpp
index 1cd37c0..010f11c 100644
--- a/docs/examples/Canvas_getLocalClipBounds_2.cpp
+++ b/docs/examples/Canvas_getLocalClipBounds_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=85496614e90c66b020f8a70db8d06f4a
 REG_FIDDLE(Canvas_getLocalClipBounds_2, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_getProps.cpp b/docs/examples/Canvas_getProps.cpp
index 85b9256..01f1c14 100644
--- a/docs/examples/Canvas_getProps.cpp
+++ b/docs/examples/Canvas_getProps.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=0fbf2dedc2619bbfbf173c9e3bc1a508
 REG_FIDDLE(Canvas_getProps, 256, 256, true, 0) {
 void draw(SkCanvas* ) {
diff --git a/docs/examples/Canvas_getSaveCount.cpp b/docs/examples/Canvas_getSaveCount.cpp
index a8f6891..acdf95c 100644
--- a/docs/examples/Canvas_getSaveCount.cpp
+++ b/docs/examples/Canvas_getSaveCount.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=005f2b207e078baac596681924fe591e
 REG_FIDDLE(Canvas_getSaveCount, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_getTotalMatrix.cpp b/docs/examples/Canvas_getTotalMatrix.cpp
index 965c08e..24c2c5a 100644
--- a/docs/examples/Canvas_getTotalMatrix.cpp
+++ b/docs/examples/Canvas_getTotalMatrix.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=c0d5fa544759704768f47cac91ae3832
 REG_FIDDLE(Canvas_getTotalMatrix, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_imageInfo.cpp b/docs/examples/Canvas_imageInfo.cpp
index 35070ae..5d03885 100644
--- a/docs/examples/Canvas_imageInfo.cpp
+++ b/docs/examples/Canvas_imageInfo.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d93389d971f8084c4ccc7a66e4e157ee
 REG_FIDDLE(Canvas_imageInfo, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_int_int_const_SkSurfaceProps_star.cpp b/docs/examples/Canvas_int_int_const_SkSurfaceProps_star.cpp
index ffc6756..9555bc4 100644
--- a/docs/examples/Canvas_int_int_const_SkSurfaceProps_star.cpp
+++ b/docs/examples/Canvas_int_int_const_SkSurfaceProps_star.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=ce6a5ef2df447970b4453489d9d67930
 REG_FIDDLE(Canvas_int_int_const_SkSurfaceProps_star, 256, 256, true, 0) {
 void draw(SkCanvas* ) {
diff --git a/docs/examples/Canvas_isClipEmpty.cpp b/docs/examples/Canvas_isClipEmpty.cpp
index af2b185..e8ef04b 100644
--- a/docs/examples/Canvas_isClipEmpty.cpp
+++ b/docs/examples/Canvas_isClipEmpty.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=f106f146a58c8604308d4d8d7086d2f5
 REG_FIDDLE(Canvas_isClipEmpty, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_isClipRect.cpp b/docs/examples/Canvas_isClipRect.cpp
index 21fc246..48c5f56 100644
--- a/docs/examples/Canvas_isClipRect.cpp
+++ b/docs/examples/Canvas_isClipRect.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9894bfb476c78a8f6c8f49fbbca3d50d
 REG_FIDDLE(Canvas_isClipRect, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_kInitWithPrevious_SaveLayerFlag.cpp b/docs/examples/Canvas_kInitWithPrevious_SaveLayerFlag.cpp
index 9955295..42c419e 100644
--- a/docs/examples/Canvas_kInitWithPrevious_SaveLayerFlag.cpp
+++ b/docs/examples/Canvas_kInitWithPrevious_SaveLayerFlag.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=05db6a937225e8e31ae3481173d25dae
 REG_FIDDLE(Canvas_kInitWithPrevious_SaveLayerFlag, 256, 160, false, 0) {
 void draw(SkCanvas* canvas) {
@@ -13,7 +13,7 @@
     matrix.setScale(4, 4);
     scalePaint.setAlpha(0x40);
     scalePaint.setImageFilter(
-            SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr));
+            SkImageFilters::MatrixTransform(matrix, kNone_SkFilterQuality, nullptr));
     SkCanvas::SaveLayerRec saveLayerRec(nullptr, &scalePaint,
             SkCanvas::kInitWithPrevious_SaveLayerFlag);
     canvas->saveLayer(saveLayerRec);
diff --git a/docs/examples/Canvas_makeSurface.cpp b/docs/examples/Canvas_makeSurface.cpp
index ddf56f5..9de07d0 100644
--- a/docs/examples/Canvas_makeSurface.cpp
+++ b/docs/examples/Canvas_makeSurface.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1ce28351444b41ab2b8e3128a4b9b9c2
 REG_FIDDLE(Canvas_makeSurface, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_peekPixels.cpp b/docs/examples/Canvas_peekPixels.cpp
index d57ff7f..638b5fb 100644
--- a/docs/examples/Canvas_peekPixels.cpp
+++ b/docs/examples/Canvas_peekPixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e9411d676d1fa13b46331abe9e14ad3e
 REG_FIDDLE(Canvas_peekPixels, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_quickReject.cpp b/docs/examples/Canvas_quickReject.cpp
index f863ba9..2c2042f 100644
--- a/docs/examples/Canvas_quickReject.cpp
+++ b/docs/examples/Canvas_quickReject.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=cfe4016241074477809dd45435be9cf4
 REG_FIDDLE(Canvas_quickReject, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_quickReject_2.cpp b/docs/examples/Canvas_quickReject_2.cpp
index 3f69c03..981dbab 100644
--- a/docs/examples/Canvas_quickReject_2.cpp
+++ b/docs/examples/Canvas_quickReject_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=56dcd14f943aea6f7d7aafe0de7e6c25
 REG_FIDDLE(Canvas_quickReject_2, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_readPixels_2.cpp b/docs/examples/Canvas_readPixels_2.cpp
index 877473f..061d6ec 100644
--- a/docs/examples/Canvas_readPixels_2.cpp
+++ b/docs/examples/Canvas_readPixels_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=85f199032943b6483722c34a91c4e20f
 REG_FIDDLE(Canvas_readPixels_2, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_readPixels_3.cpp b/docs/examples/Canvas_readPixels_3.cpp
index 0c96279..e0dcb80 100644
--- a/docs/examples/Canvas_readPixels_3.cpp
+++ b/docs/examples/Canvas_readPixels_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=af6dec8ef974aa67bf102f29915bcd6a
 REG_FIDDLE(Canvas_readPixels_3, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_readPixels_a.cpp b/docs/examples/Canvas_readPixels_a.cpp
index 74110d0..14bef1b 100644
--- a/docs/examples/Canvas_readPixels_a.cpp
+++ b/docs/examples/Canvas_readPixels_a.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=102d014d7f753db2a9b9ee08893aaf11
 REG_FIDDLE(Canvas_readPixels_a, 64, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_readPixels_b.cpp b/docs/examples/Canvas_readPixels_b.cpp
index a1ddd35..6aabf15 100644
--- a/docs/examples/Canvas_readPixels_b.cpp
+++ b/docs/examples/Canvas_readPixels_b.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=481e990e923a0ed34654f4361b94f096
 REG_FIDDLE(Canvas_readPixels_b, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_resetMatrix.cpp b/docs/examples/Canvas_resetMatrix.cpp
index a69ce0c..5a0f344 100644
--- a/docs/examples/Canvas_resetMatrix.cpp
+++ b/docs/examples/Canvas_resetMatrix.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=412afffdf4682baa503a4e2e99201967
 REG_FIDDLE(Canvas_resetMatrix, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_restore.cpp b/docs/examples/Canvas_restore.cpp
index 3ed4a4f..7fe0a7a 100644
--- a/docs/examples/Canvas_restore.cpp
+++ b/docs/examples/Canvas_restore.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e78471212a67f2f4fd39496e17a30d17
 REG_FIDDLE(Canvas_restore, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_restoreToCount.cpp b/docs/examples/Canvas_restoreToCount.cpp
index 7112c00..ac48d18 100644
--- a/docs/examples/Canvas_restoreToCount.cpp
+++ b/docs/examples/Canvas_restoreToCount.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9ed0d56436e114c7097fd49eed1aea47
 REG_FIDDLE(Canvas_restoreToCount, 256, 256, true, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_rotate.cpp b/docs/examples/Canvas_rotate.cpp
index 428a6b9..6dd6683 100644
--- a/docs/examples/Canvas_rotate.cpp
+++ b/docs/examples/Canvas_rotate.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=963789ac8498d4e505748ab3b15cdaa5
 REG_FIDDLE(Canvas_rotate, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_rotate_2.cpp b/docs/examples/Canvas_rotate_2.cpp
index 2c96215..cc0375c 100644
--- a/docs/examples/Canvas_rotate_2.cpp
+++ b/docs/examples/Canvas_rotate_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=bcf5baea1c66a957d5ffd7b54bbbfeff
 REG_FIDDLE(Canvas_rotate_2, 256, 192, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_save.cpp b/docs/examples/Canvas_save.cpp
index 660117b..a2fa2fe 100644
--- a/docs/examples/Canvas_save.cpp
+++ b/docs/examples/Canvas_save.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=e477dce358a9ba3b0aa1bf33b8a376de
 REG_FIDDLE(Canvas_save, 256, 100, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_saveLayer.cpp b/docs/examples/Canvas_saveLayer.cpp
index 3f4616d..c9cf5a5 100644
--- a/docs/examples/Canvas_saveLayer.cpp
+++ b/docs/examples/Canvas_saveLayer.cpp
@@ -1,13 +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"
+#include "tools/fiddle/examples.h"
 // HASH=42318b18d403e17e07a541652da91ee2
 REG_FIDDLE(Canvas_saveLayer, 256, 128, false, 0) {
-#include "SkBlurImageFilter.h"
+#include "include/effects/SkImageFilters.h"
 
 void draw(SkCanvas* canvas) {
     SkPaint paint, blur;
-    blur.setImageFilter(SkBlurImageFilter::Make(3, 3, nullptr));
+    blur.setImageFilter(SkImageFilters::Blur(3, 3, nullptr));
     canvas->saveLayer(nullptr, &blur);
     SkRect rect = { 25, 25, 50, 50};
     canvas->drawRect(rect, paint);
diff --git a/docs/examples/Canvas_saveLayerAlpha.cpp b/docs/examples/Canvas_saveLayerAlpha.cpp
index ab563a4..823033c 100644
--- a/docs/examples/Canvas_saveLayerAlpha.cpp
+++ b/docs/examples/Canvas_saveLayerAlpha.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8ab88d86fb438856cc48d6e2f08a6e24
 REG_FIDDLE(Canvas_saveLayerAlpha, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_saveLayerPreserveLCDTextRequests.cpp b/docs/examples/Canvas_saveLayerPreserveLCDTextRequests.cpp
index 32d11e3..113142c 100644
--- a/docs/examples/Canvas_saveLayerPreserveLCDTextRequests.cpp
+++ b/docs/examples/Canvas_saveLayerPreserveLCDTextRequests.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8460bf8b013f46c67e0bd96e13451aff
 REG_FIDDLE(Canvas_saveLayerPreserveLCDTextRequests, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_saveLayer_2.cpp b/docs/examples/Canvas_saveLayer_2.cpp
index a6ae460..8f30be7 100644
--- a/docs/examples/Canvas_saveLayer_2.cpp
+++ b/docs/examples/Canvas_saveLayer_2.cpp
@@ -1,13 +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"
+#include "tools/fiddle/examples.h"
 // HASH=a17aec3aa4909527be039e26a7eda694
 REG_FIDDLE(Canvas_saveLayer_2, 256, 128, false, 0) {
-#include "SkBlurImageFilter.h"
+#include "include/effects/SkImageFilters.h"
 
 void draw(SkCanvas* canvas) {
     SkPaint paint, blur;
-    blur.setImageFilter(SkBlurImageFilter::Make(3, 3, nullptr));
+    blur.setImageFilter(SkImageFilters::Blur(3, 3, nullptr));
     canvas->saveLayer(SkRect::MakeWH(90, 90), &blur);
     SkRect rect = { 25, 25, 50, 50};
     canvas->drawRect(rect, paint);
diff --git a/docs/examples/Canvas_saveLayer_3.cpp b/docs/examples/Canvas_saveLayer_3.cpp
index 16ae0de..3a6d427 100644
--- a/docs/examples/Canvas_saveLayer_3.cpp
+++ b/docs/examples/Canvas_saveLayer_3.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7d3751e82d1b6ec328ffa3d6f48ca831
 REG_FIDDLE(Canvas_saveLayer_3, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_scale.cpp b/docs/examples/Canvas_scale.cpp
index 8bf1a51..263a9f6 100644
--- a/docs/examples/Canvas_scale.cpp
+++ b/docs/examples/Canvas_scale.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=7d0d801ef13c6c6da51e840c22ac15b0
 REG_FIDDLE(Canvas_scale, 256, 160, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_setMatrix.cpp b/docs/examples/Canvas_setMatrix.cpp
index 2e3cf69..4cdb90c 100644
--- a/docs/examples/Canvas_setMatrix.cpp
+++ b/docs/examples/Canvas_setMatrix.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=24b9cf7e6f9a08394e1e07413bd8733a
 REG_FIDDLE(Canvas_setMatrix, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_skew.cpp b/docs/examples/Canvas_skew.cpp
index 486dd5f..a811e85 100644
--- a/docs/examples/Canvas_skew.cpp
+++ b/docs/examples/Canvas_skew.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=2e2acc21d7774df7e0940a30ad2ca99e
 REG_FIDDLE(Canvas_skew, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_translate.cpp b/docs/examples/Canvas_translate.cpp
index e6dfd47..713b80c 100644
--- a/docs/examples/Canvas_translate.cpp
+++ b/docs/examples/Canvas_translate.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=eb93d5fa66a5f7a10f4f9210494d7222
 REG_FIDDLE(Canvas_translate, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_writePixels.cpp b/docs/examples/Canvas_writePixels.cpp
index 75f22de..a320b55 100644
--- a/docs/examples/Canvas_writePixels.cpp
+++ b/docs/examples/Canvas_writePixels.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=29b98ebf58aa9fd1edfaabf9f4490b3a
 REG_FIDDLE(Canvas_writePixels, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Canvas_writePixels_2.cpp b/docs/examples/Canvas_writePixels_2.cpp
index 83d3f51..54d4f2f 100644
--- a/docs/examples/Canvas_writePixels_2.cpp
+++ b/docs/examples/Canvas_writePixels_2.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=8b128e067881f9251357653692fa28da
 REG_FIDDLE(Canvas_writePixels_2, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Clear.cpp b/docs/examples/Clear.cpp
index 45df306..490968b 100644
--- a/docs/examples/Clear.cpp
+++ b/docs/examples/Clear.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=a9b56a26ca469bab9ab10e16f62fb2e2
 REG_FIDDLE(Clear, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Clip.cpp b/docs/examples/Clip.cpp
index 1c1b9af..8db4c02 100644
--- a/docs/examples/Clip.cpp
+++ b/docs/examples/Clip.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=862cc026601a41a58df49c0b9f0d7777
 REG_FIDDLE(Clip, 256, 90, false, 0) {
 void draw(SkCanvas* canvas) {
@@ -19,7 +19,7 @@
     SkMatrix matrix;
     matrix.setScale(6, 6);
     scalePaint.setImageFilter(
-            SkImageFilter::MakeMatrixFilter(matrix, kNone_SkFilterQuality, nullptr));
+            SkImageFilters::MatrixTransform(matrix, kNone_SkFilterQuality, nullptr));
     SkCanvas::SaveLayerRec saveLayerRec(
             nullptr, &scalePaint, SkCanvas::kInitWithPrevious_SaveLayerFlag);
     canvas->saveLayer(saveLayerRec);
diff --git a/docs/examples/Color.cpp b/docs/examples/Color.cpp
index 6584833..24bb4ce 100644
--- a/docs/examples/Color.cpp
+++ b/docs/examples/Color.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=5d7c6e23a34ca9bf3ba8cda4cdc94cc4
 REG_FIDDLE(Color, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorGetA.cpp b/docs/examples/ColorGetA.cpp
index 230df7e..3296e3e 100644
--- a/docs/examples/ColorGetA.cpp
+++ b/docs/examples/ColorGetA.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=896ce0316b489608a95af5439ca2aab1
 REG_FIDDLE(ColorGetA, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorGetB.cpp b/docs/examples/ColorGetB.cpp
index ef7641d..0ba7ec0 100644
--- a/docs/examples/ColorGetB.cpp
+++ b/docs/examples/ColorGetB.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9ee27675284faea375611dc88123a2c5
 REG_FIDDLE(ColorGetB, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorGetG.cpp b/docs/examples/ColorGetG.cpp
index 45c26f4..4771012 100644
--- a/docs/examples/ColorGetG.cpp
+++ b/docs/examples/ColorGetG.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=535d38b2c019299d915170f7b03d5fea
 REG_FIDDLE(ColorGetG, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorGetR.cpp b/docs/examples/ColorGetR.cpp
index d2d3299..7a8c33a 100644
--- a/docs/examples/ColorGetR.cpp
+++ b/docs/examples/ColorGetR.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=d6da38577f189eaa6d9df75f6c3ed252
 REG_FIDDLE(ColorGetR, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorSetA.cpp b/docs/examples/ColorSetA.cpp
index 496d5c7..9fc343e 100644
--- a/docs/examples/ColorSetA.cpp
+++ b/docs/examples/ColorSetA.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=18f6f376f771f5ffa56d5e5b2ebd20fb
 REG_FIDDLE(ColorSetA, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorSetARGB.cpp b/docs/examples/ColorSetARGB.cpp
index f0f60a0..f228b61 100644
--- a/docs/examples/ColorSetARGB.cpp
+++ b/docs/examples/ColorSetARGB.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=35888f0869e01a6e03b5b93bba563734
 REG_FIDDLE(ColorSetARGB, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorSetRGB.cpp b/docs/examples/ColorSetRGB.cpp
index c68ed6a..ee4da50 100644
--- a/docs/examples/ColorSetRGB.cpp
+++ b/docs/examples/ColorSetRGB.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=dad12dd912197cd5edd789ac0801bf8a
 REG_FIDDLE(ColorSetRGB, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorToHSV.cpp b/docs/examples/ColorToHSV.cpp
index 4475463..6c24079 100644
--- a/docs/examples/ColorToHSV.cpp
+++ b/docs/examples/ColorToHSV.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1e0370f12c8aab5b84f9e824074f1e5a
 REG_FIDDLE(ColorToHSV, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorTypeBytesPerPixel.cpp b/docs/examples/ColorTypeBytesPerPixel.cpp
index dc3c71b..161be10 100644
--- a/docs/examples/ColorTypeBytesPerPixel.cpp
+++ b/docs/examples/ColorTypeBytesPerPixel.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=09ef49d07cb7005ba3e34d5ea53896f5
 REG_FIDDLE(ColorTypeBytesPerPixel, 256, 192, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorTypeIsAlwaysOpaque.cpp b/docs/examples/ColorTypeIsAlwaysOpaque.cpp
index 322e118..1edf066 100644
--- a/docs/examples/ColorTypeIsAlwaysOpaque.cpp
+++ b/docs/examples/ColorTypeIsAlwaysOpaque.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9b3eb5aaa0dfea9feee54e7650fa5446
 REG_FIDDLE(ColorTypeIsAlwaysOpaque, 256, 192, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/ColorTypeValidateAlphaType.cpp b/docs/examples/ColorTypeValidateAlphaType.cpp
index d85ef88..c754cf9 100644
--- a/docs/examples/ColorTypeValidateAlphaType.cpp
+++ b/docs/examples/ColorTypeValidateAlphaType.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=befac1c29ed21507d367e4d824383a04
 REG_FIDDLE(ColorTypeValidateAlphaType, 256, 640, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Burn.cpp b/docs/examples/Color_Burn.cpp
index 74a37d6..277505c 100644
--- a/docs/examples/Color_Burn.cpp
+++ b/docs/examples/Color_Burn.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=3eeef529375d8083ae0d615789d55e89
 REG_FIDDLE(Color_Burn, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Constants_a.cpp b/docs/examples/Color_Constants_a.cpp
index e46a9f2..c7d965c 100644
--- a/docs/examples/Color_Constants_a.cpp
+++ b/docs/examples/Color_Constants_a.cpp
@@ -1,7 +1,7 @@
 #if 0  // Disabled until updated to use current API.
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1c2e38321464818847f953ddd45cb5a1
 REG_FIDDLE(Color_Constants_a, 256, 256, false, 0) {
 #define SKIA_COLOR_PAIR(name) "SK_Color" #name, SK_Color##name
diff --git a/docs/examples/Color_Constants_b.cpp b/docs/examples/Color_Constants_b.cpp
index 8b9ba8a..c43096e 100644
--- a/docs/examples/Color_Constants_b.cpp
+++ b/docs/examples/Color_Constants_b.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=9ca1e2a5b9b4c92ecf4409d0813867d6
 REG_FIDDLE(Color_Constants_b, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Constants_c.cpp b/docs/examples/Color_Constants_c.cpp
index c3c937f..15b00ec 100644
--- a/docs/examples/Color_Constants_c.cpp
+++ b/docs/examples/Color_Constants_c.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=6971489f28291f08e429cc6ccc73b09b
 REG_FIDDLE(Color_Constants_c, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Constants_d.cpp b/docs/examples/Color_Constants_d.cpp
index c3aa498..b3c8c5a 100644
--- a/docs/examples/Color_Constants_d.cpp
+++ b/docs/examples/Color_Constants_d.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=fce650f997e802d4e55edf62b8437a2d
 REG_FIDDLE(Color_Constants_d, 256, 256, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Dodge.cpp b/docs/examples/Color_Dodge.cpp
index 0d12c1f..d0b34e4 100644
--- a/docs/examples/Color_Dodge.cpp
+++ b/docs/examples/Color_Dodge.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=280ad6267a7d2d77b6d2c4531c6fc0bf
 REG_FIDDLE(Color_Dodge, 256, 256, false, 3) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Filter_Methods.cpp b/docs/examples/Color_Filter_Methods.cpp
index 96bf2dc..79cef3b 100644
--- a/docs/examples/Color_Filter_Methods.cpp
+++ b/docs/examples/Color_Filter_Methods.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=5abde56ca2f89a18b8e231abd1b57c56
 REG_FIDDLE(Color_Filter_Methods, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Methods.cpp b/docs/examples/Color_Methods.cpp
index 5545839..0ecfcc9 100644
--- a/docs/examples/Color_Methods.cpp
+++ b/docs/examples/Color_Methods.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=214b559d75c65a7bef6ef4be1f860053
 REG_FIDDLE(Color_Methods, 256, 128, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_ARGB_4444.cpp b/docs/examples/Color_Type_ARGB_4444.cpp
index 3c4f3f3..c79e16a 100644
--- a/docs/examples/Color_Type_ARGB_4444.cpp
+++ b/docs/examples/Color_Type_ARGB_4444.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=33a360c3404ac21db801943336843d8e
 REG_FIDDLE(Color_Type_ARGB_4444, 256, 96, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_Alpha_8.cpp b/docs/examples/Color_Type_Alpha_8.cpp
index 49b5c22..4e15231 100644
--- a/docs/examples/Color_Type_Alpha_8.cpp
+++ b/docs/examples/Color_Type_Alpha_8.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=21ae21e4ce53d2018e042dd457997300
 REG_FIDDLE(Color_Type_Alpha_8, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_BGRA_8888.cpp b/docs/examples/Color_Type_BGRA_8888.cpp
index 94ff42e..9e22c0e 100644
--- a/docs/examples/Color_Type_BGRA_8888.cpp
+++ b/docs/examples/Color_Type_BGRA_8888.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=945ce5344fce5470f8604b2e06e9f9ae
 REG_FIDDLE(Color_Type_BGRA_8888, 256, 96, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_Gray_8.cpp b/docs/examples/Color_Type_Gray_8.cpp
index 3f493be..2f96295 100644
--- a/docs/examples/Color_Type_Gray_8.cpp
+++ b/docs/examples/Color_Type_Gray_8.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=93da0eb0b6722a4f33dc7dae094abf0b
 REG_FIDDLE(Color_Type_Gray_8, 256, 64, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_RGBA_1010102.cpp b/docs/examples/Color_Type_RGBA_1010102.cpp
index 4244d6f..9ba3dc0 100644
--- a/docs/examples/Color_Type_RGBA_1010102.cpp
+++ b/docs/examples/Color_Type_RGBA_1010102.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=1282dc1127ce1b0061544619ae4de0f0
 REG_FIDDLE(Color_Type_RGBA_1010102, 256, 96, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_RGBA_8888.cpp b/docs/examples/Color_Type_RGBA_8888.cpp
index d598cd8..0978cb1 100644
--- a/docs/examples/Color_Type_RGBA_8888.cpp
+++ b/docs/examples/Color_Type_RGBA_8888.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=947922a19d59893fe7f9d9ee1954379b
 REG_FIDDLE(Color_Type_RGBA_8888, 256, 96, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_RGBA_F16.cpp b/docs/examples/Color_Type_RGBA_F16.cpp
index e89aa62..cdb2f87 100644
--- a/docs/examples/Color_Type_RGBA_F16.cpp
+++ b/docs/examples/Color_Type_RGBA_F16.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=dd81527bbdf5eaae7dd21ac04ab84f9e
 REG_FIDDLE(Color_Type_RGBA_F16, 256, 96, false, 0) {
 union FloatUIntUnion {
diff --git a/docs/examples/Color_Type_RGB_101010.cpp b/docs/examples/Color_Type_RGB_101010.cpp
index deea7bb..9a266f6 100644
--- a/docs/examples/Color_Type_RGB_101010.cpp
+++ b/docs/examples/Color_Type_RGB_101010.cpp
@@ -1,6 +1,6 @@
 // Copyright 2019 Google LLC.
 // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
-#include "fiddle/examples.h"
+#include "tools/fiddle/examples.h"
 // HASH=92f81aa0459230459600a01e79ccff29
 REG_FIDDLE(Color_Type_RGB_101010, 256, 96, false, 0) {
 void draw(SkCanvas* canvas) {
diff --git a/docs/examples/Color_Type_RGB_565.cpp b/docs/examples/Color_Type_RGB_565.cpp
index 8cbcfdf..0521cd9 100644
--- a/docs/examples/Col